什么是MQ ?为什么用MQ?

news2024/11/15 20:24:15

什么是MQ?

MQ(message queue)(消息队列),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务。

常见的mq产品

RabbitMQRocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq

为什么要用MQ

1. 异步处理

场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式

串行方式: 将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西.

并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。

消息队列:假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并行已经提高的处理时间,但是,前面说过,邮件和短信对正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回.

引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理

2. 应用解耦

很多复杂的业务系统,一般都会拆分成多个子系统。我们在这里以用户下单为例,请求会先通过订单系统,然后分别调用:支付系统、库存系统、积分系统 和 物流系统

场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口.

当库存系统出现故障时,订单就会失败。 订单系统和库存系统高耦合. 引入消息队列

订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。

库存系统:订阅下单的消息,获取下单消息,进行拆订单操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失.

3. 流量削峰

如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单十几秒后才能收到下单成功的操作,但是比不能下单的体验要好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1575279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

春招-实战项目冲刺直播课

春招-实战项目冲刺直播课 CCtalk 丰富多元的综合内容平台-专业的知识分享与在线教育平台https://www.cctalk.com/m/group/91161801

解决win7作为虚拟机无法复制粘贴共享文件的问题

win7作为虚拟机经常会出现无法与主机的剪切板共享、文件共享。 归根结底是win7虚拟机里面没有安装VMware Tools 能够成功安装vmware tools的条件: 1)win7版本为win7 sp1及以上 2)安装KB4490628,KB4474419补丁 因此下面来详细介绍…

QA测试开发工程师面试题满分问答9: Python中内存管理的概念、原理、使用

概念原理 Python中的内存管理是由解释器自动处理的,它使用引用计数和垃圾回收机制来管理内存。以下是Python内存管理的一些关键概念、设计原理和最佳实践,以帮助您高效使用和管理内存: 引用计数:Python使用引用计数来追踪对象的引…

c++的学习之路:8、内存管理与模板

一、 C/C内存分布 首先在c语言的动态内存管理中我知道了代码是如何存储数据的,然后c是根据c语言底层变化来的,那么c语言的内存管理就是适用c的内存管理,在c语言中程序是分为几个部分存储,例如在栈堆等等,他们的分布如…

解决 macOS 系统向日葵远程控制鼠标、键盘无法点击的问题

解决 macOS 系统向日葵远程控制鼠标\键盘无法点击的问题 1、首先正常配置,在系统偏好设置 - 安全性与隐私内,将屏幕录制、文件和文件夹、完全的磁盘访问权限、辅助功能全部都加入向日葵客户端 2、通过打开的文件访达,使用command shift G…

c++ Constraints 和 concepts介绍

C++20 引入了 Concepts,以改进模板编程的体验。Concepts 是一种用于模板编程的新机制,它允许程序员在编译时对模板参数进行约束和限制,从而提高模板的可读性、可维护性和错误检测能力。 Constraints(约束)是 Concepts 的一部分,它定义了模板参数必须满足的条件。一个约束…

入门微调预训练Transformer模型

大家好,HuggingFace 为众多开源的自然语言处理(NLP)模型提供了强大的支持平台,让这些模型能够通过训练和微调来更好地服务于各种特定的应用场景。在大型语言模型(LLM)迅猛发展的今天,HuggingFac…

100 个网络基础知识,看完成半个网络高手

100 个网络基础知识,看完成半个网络高手。 1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层&…

Rustdesk二次编译,新集成AI功能开源Gpt小程序为远程协助助力,全网首发

环境: Rustdesk1.1.9 sciter版 问题描述: Rustdesk二次编译,新集成AI功能开源Gpt小程序为远程协助助力,全网首发 解决方案: Rustdesk二次编译,新集成开源AI功能Gpt小程序,为远程协助助力&#xff0c…

何为HTTP状态码?一文清楚基本概念。

在客户端与服务器之间的信息传输过程中,我们可以将其比喻为客户与快递员之间的包裹传递。那么服务器是如何通知客户端,操作是成功还是失败?或者有其他的一些情况呢?(就像客户可以查询快递的状态) 而这背后…

C++分析程序各模块耗时-perf火焰图

C分析程序各模块耗时-perf火焰图 1. 简介2. 安装3. 测试示例4. 从火焰图可以获得的信息5. 生成火焰图常见问题 Reference: Perf Wiki【性能】perf 火焰图分析软件性能瓶颈【火焰图🔥】Linux C/C性能优化分析工具Perf使用教程 perf: Linux profiling with perform…

【Python】还在用print进行调试,你Out了!!!

1. 引言 Python 中最常用的函数是什么?像在大多数编程语言中,print() 函数是最常用的。我相信大多数开发者都会像我一样,在开发过程中多次使用它将信息进行打印。 当然,没有其他方法可以完全取代print()函数。不过,当…

鱼塘钓鱼(c++实现)

题目 有 N 个鱼塘排成一排,每个鱼塘中有一定数量的鱼,例如:N5 时,如下表: 即:在第 1 个鱼塘中钓鱼第 1 分钟内可钓到 10 条鱼,第 2 分钟内只能钓到 8 条鱼,……,第 5 分…

【JavaEE】_Spring MVC项目获取Cookie

目录 1. Cookie与Session基础知识 1.1 Cookie与Session的区别 2. 使用servlet原生方法获取Cookie 2.2 关于λ表达式遍历法的空指针问题 2.3 Cookie的伪造 3. 使用Spring注解获取Cookie 3.1 获取单个Cookie 3.2 获取多个Cookie 1. Cookie与Session基础知识 在本专栏HTT…

【随笔】Git 高级篇 -- 整理提交记录(上)cherry-pick(十五)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

docker-compose安装adguard给局域网提供dns加速服务

启动配置 docker-compose.yaml配置文件 version: 3.3 services:adguard:image: adguard/adguardhome:latestcontainer_name: adguardrestart: unless-stoppedvolumes:- ./workdir:/opt/adguardhome/work- ./confdir:/opt/adguardhome/confports:- 53:53/tcp- 53:53/udp- 81:8…

【fdisk 相关分区命令记录】

目的 记录下新磁盘下刚刚分配的系统(安装系统后未操作或者新扩容的)的分区格式化及挂载,比如这里运维分配了100G 步骤: 1.查看新硬盘 lsblk -f查看,sdb就是新分配的硬盘,无任何相关的属性信息 2、分区明细查看 fd…

鸿蒙内核源码分析 (双向链表篇) | 谁是内核最重要结构体

双向链表是什么&#xff1f; 谁是鸿蒙内核最重要的结构体 &#xff1f; 一定是: LOS_DL_LIST(双向链表)&#xff0c; 它长这样。 typedef struct LOS_DL_LIST {struct LOS_DL_LIST *pstPrev; /**< Current nodes pointer to the previous node | 前驱节点(左手)*/struct L…

ZYNQ学习Linux 基础外设的使用

基本都是摘抄正点原子的文章&#xff1a;《领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf》&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 工程的创建参考&#xff1a;《ZYNQ学习之Petalinux 设计流程实战》 一、GPIO 之 LED 的使…

Open CASCADE学习|旋转变换

物体在三维空间中的旋转变换操作通常可以通过三种不同的方式来表示&#xff1a;矩阵&#xff08;Matrix&#xff09;、欧拉角&#xff08;Euler Angles&#xff09;和四元数&#xff08;Quaternion&#xff09;。下面详细解释这三种表示方法。 矩阵&#xff08;Matrix&#xf…