【RabbitMQ】1 消息中间件MQ概述

目录

  • 什么是消息中间件
  • 为什么使用消息中间件
    • 流量削峰
    • 应用解耦
    • 异步处理
  • 主流消息中间件及选型
    • 选取原则
    • RabbitMQ
    • RocketMQ
    • Kafka
    • 如何选择
  • 消息中间件应用场景
    • 电商秒杀案例
    • 拉勾B端C端数据同步案例
    • 支付宝购买电影票

什么是消息中间件

维基百科对消息中间件的解释:面向消息的系统(消息中间件)是在分布式系统中完成消息的发送和接收的基础软件。

消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。

消息中间件就是在通信的上下游之间截断:break it,Broker,然后利用中间件解耦、异步的特性,构建弹性、可靠、稳定的系统。

为什么使用消息中间件

异步处理流量削峰、限流、缓冲、排队、最终一致性消息驱动等需求的场景都可以使用消息中间件。

流量削峰

如果订单系统每秒最多能处理一万次的订单,这个处理能力应付正常时段的下单是绰绰有余的,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果每秒有两万次的下单操作,系统是处理不了的,那么只能限制订单超过一万后的用户不能下单,这样很不人性化的(我可能等待,怎么能直接告诉我下不了单呢?)。此时如果使用 MQ 之后,那么就可以取消这个限制了,将一秒内下的订单分散成一段时间来处理,这时可能有些用户在下单十几秒之后才能收到下单成功的操作,但是也有比不能下单的体验要好。

在这里插入图片描述

应用解耦

以电商系统为例,应用中有订单系统、库存系统、物流系统、支付系统。用户在创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出现故障,都会造成下单操作异常。当使用了 MQ 之后,系统间调用的问题就会减少很多,如:物流系统因为发生故障,需要几分钟来修复,在这几分钟之内,物流系统要处理的消息会被缓存在 MQ 之后,不会影响到用户的正常下单操作的。当物流系统恢复之后,继续处理订单信息即可。在整个操作中间,下单的用户是感受不到物流系统出现故障,提高的系统的可用性。

在这里插入图片描述

异步处理

有些服务间调用是异步的,例如:A 调用 B ,B 需要花费很长时间去执行,但是 A 需要知道 B 什么时候可以执行完毕,以前有两种处理方式:1)A 每过一段时间就去轮询调用 B 提供的查询 API 。2) A 提供一个 callback 的 API ,B 执行完毕会后调用这个 API 告诉 A 执行完毕。这两种方式都不是很优雅,使用 MQ 可以方便的解决这个问题。A 调用 B 服务后,只需要监督 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ ,MQ 会将此消息转发给 A 服务,这样 A 服务既不用循环调用 B 的查询 API ,也不用提供 callback 的 API 。同样,B 也不需要做这些操作,A 服务还能及时得到异步处理成功的消息。

在这里插入图片描述

主流消息中间件及选型

当前业界比较流行的开源消息中间件包括:ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等,其中应用最为广泛的要数RabbitMQ、RocketMQ、Kafka这三款。

Redis在某种程度上也可以是实现类似“Queue”和“Pub/Sub”的机制,严格意义上不算消息中间件。

选取原则

首先,产品应该是开源的。开源意味着如果队列使用中遇到bug,可以很快修改,而不用等待开发者的更新。

其次,产品必须是近几年比较流行的,要有一个活跃的社区。这样遇到问题很快就可以找到解决方法。同时流行也意味着bug较少。流行的产品一般跟周边系统兼容性比较好。

最后,作为消息队列,要具备以下几个特性:

1、消息传输的可靠性:保证消息不会丢失。

2、支持集群,包括横向扩展,单点故障都可以解决。

3、性能要好,要能够满足业务的性能需求。

RabbitMQ

RabbitMQ开始是用在电信业务的可靠通信的,也是少有的几款支持AMQP协议的产品之一。

优点

  1. 轻量级,快速,部署使用方便
  2. 支持灵活的路由配置。RabbitMQ中,在生产者和队列之间有一个交换器模块。根据配置的路由规则,生产者发送的消息可以发送到不同的队列中。路由规则很灵活,还可以自己实现。
  3. RabbitMQ的客户端支持大多数的编程语言。

缺点

  1. 如果有大量消息堆积在队列中,性能会急剧下降
  2. RabbitMQ的性能在Kafka和RocketMQ中是最差的,每秒处理几万到几十万的消息。如果应用要求高的性能,不要选择RabbitMQ。
  3. RabbitMQ是Erlang开发的,功能扩展和二次开发代价很高。

RocketMQ

RocketMQ是一个开源的消息队列,使用java实现。借鉴了Kafka的设计并做了很多改进。RocketMQ主要用于有序,事务,流计算,消息推送,日志流处理,binlog分发等场景。经过了历次的双11考验,性能,稳定性可可靠性没的说。

优点

  1. RocketMQ几乎具备了消息队列应该具备的所有特性和功能。
  2. java开发,阅读源代码、扩展、二次开发很方便。
  3. 对电商领域的响应延迟做了很多优化。在大多数情况下,响应在毫秒级。如果应用很关注响应时间,可以使用RocketMQ。
  4. 性能比RabbitMQ高一个数量级,每秒处理几十万的消息。

缺点

  1. 跟周边系统的整合和兼容不是很好。

Kafka

Kafka的可靠性,稳定性和功能特性基本满足大多数的应用场景。

跟周边系统的兼容性是数一数二的,尤其是大数据和流计算领域,几乎所有相关的开源软件都支持Kafka。

Kafka高效,可伸缩,消息持久化。支持分区、副本和容错。

Kafka是Scala和Java开发的,对批处理和异步处理做了大量的设计,因此Kafka可以得到非常高的性能。它的异步消息的发送和接收是三个中最好的,但是跟RocketMQ拉不开数量级,每秒处理几十万的消息。

如果是异步消息,并且开启了压缩,Kafka最终可以达到每秒处理2000w消息的级别。但是由于是异步的和批处理的,延迟也会高,不适合电商场景。

如何选择

特点如下

在这里插入图片描述

基于以上特点,选型可参考如下:

  • Kaka:Kafka 的主要特点是基于 pull 的模式来处理消息,追求吞吐量,一开始的目的就是用于日志收集和传输,适合产生了大量数据的互联网服务的数据收集业务。大型公司建议选用,如果有日志收集功能,首选 Kafka 。

  • RocketMQ:天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入的时候,后端可能无法及时处理的情况。RocketMQ 在稳定性上可能更值得信赖,因为这些场景在阿里的双 11 经历了多次考验。

  • RabbitMQ:结合 Erlang 语言本身的并发优势,性能好,时效性 us 级,社区活跃度高,管理界面用起来十分方便,中小型公司优先选择功能完备的 RabbitMQ 。

消息中间件应用场景

消息中间件的使用场景非常广泛,比如,12306购票的排队锁座,电商秒杀,大数据实时计算等。

电商秒杀案例

比如6.18,活动从0:00开始,仅限前 200 名,秒杀即将开始时,用户会疯狂刷新 APP或者浏览器来保证自己能够尽早的看到商品。

  • 当秒杀开始前,用户在不断的刷新页面,系统应该如何应对高并发的读请求呢?
  • 在秒杀开始时,大量并发用户瞬间向系统请求生成订单,扣减库存,系统应该如何应对高并发的写请求呢?

1. 系统应该如何应对高并发的读请求

  • 使用缓存策略将请求挡在上层中的缓存中
  • 能静态化的数据尽量做到静态化
  • 加入限流(比如对短时间之内来自某一个用户,某一个IP、某个设备的重复请求做丢弃处理)

2. 系统应该如何应对高并发的写请求

生成订单,扣减库存,用户这些操作不经过缓存直达数据库。如果在 1s内,有 1 万个数据连接同时到达,系统的数据库会濒临崩溃。如何解决这个问题呢?我们可以使用 消息队列

消息队列的作用:

  • 削去秒杀场景下的峰值写流量——流量削峰
  • 通过异步处理简化秒杀请求中的业务流程——异步处理
  • 解耦,实现秒杀系统模块之间松耦合——解耦

上面三点分别如何做?

  1. 流量削峰

将秒杀请求暂存于消息队列,业务服务器响应用户“秒杀结果正在处理中。。。”,释放系统资源去处理其它用户的请求。

削峰填谷,削平短暂的流量高峰,消息堆积会造成请求延迟处理,但秒杀用户对于短暂延迟有一定容忍度。

秒杀商品有 1000 件,处理一次购买请求的时间是 500ms,那么总共就需要 500s 的时间。这时你部署 10 个队列处理程序,那么秒杀请求的处理时间就是 50s,也就是说用户需要等待 50s 才可以看到秒杀的结果,这是可以接受的。这时会并发 10 个请求到达数据库,并不会对数据库造成很大的压力。

  1. 异步处理

先处理主要的业务,异步处理次要的业务。如主要流程是生成订单、扣减库存;次要流程比如购买成功之后会给用户发优惠券,增加用户的积分。此时秒杀只要处理生成订单,扣减库存的耗时,发放优惠券、增加用户积分异步去处理了。

  1. 解耦

实现秒杀系统模块之间松耦合。

将秒杀数据同步给数据团队,有两种思路:

  1. 使用 HTTP 或者 RPC 同步调用,即提供一个接口,实时将数据推送给数据服务。系统的耦合度高,如果其中一个服务有问题,可能会导致另一个服务不可用。
  2. 使用消息队列将数据全部发送给消息队列,然后数据服务订阅这个消息队列,接收数据进行处理。

拉勾B端C端数据同步案例

拉勾网站分B端和C端,B端面向企业用户,C端面向求职者。

这两个模块业务处理逻辑不同,数据库表结构不同,实际上是处于解耦的状态。但是各自又需要对方的数据,需要共享>如:

  1. 当C端求职者在更新简历之后,B端企业用户如何尽早看到该简历更新?
  2. 当B端企业用户发布新的职位需求后,C端用户如何尽早看到该职位信息?

无论是B端还是C端,都有各自的搜索引擎和缓存,B端需要获取C端的更新以更新搜索引擎和缓存;C端需要获取B端的更新以更新C端的搜索引擎与缓存。

如何解决B端C端数据共享的问题?

  1. 同步方式:B端和C端通过RPC或WebService的方式发布服务,让对方来调用,以获取对方的信息。求职者每更新一次简历,就调用一次B端的服务,进行数据的同步;B端企业用户每更新职位需求,就调用C端的服务,进行数据的同步。
  2. 异步方式:使用消息队列,B端将更新的数据发布到消息队列,C端将更新的数据发布到消息队列,B端订阅C端的消息队列,C端订阅B端的消息队列。

使用同步方式,B端和C端耦合比较紧密,如果其中一个服务有问题,可能会导致另一个服务不可用。比如C端的RPC挂掉,企业用户有可能无法发布新的职位信息,因为发布了对方也看不到;B端的RPC挂掉,求职者可能无法更新简历,因为即使简历更新了,对方也看不到。

你可能会想,可以让B端或C端在对方RPC挂掉的时候,先将该通知消息缓存起来,等对方服务恢复之后再进行同步。

这正是引入异步方式,使用消息队列的目的。

使用消息队列的异步方式,对B端C端进行解耦,只要消息队列可用,双方都可以将需要同步的信息发送到消息队列,对方在收到消息队列推送来的消息的时候,各自更新自己的搜索引擎,更新自己的缓存数据。

支付宝购买电影票

在这里插入图片描述

如上图,用户在支付宝购买了一张电影票后很快就收到消息推送和短信(电影院地址、几号厅、座位号、场次时间等),同时用户会积累一定的会员积分。

这里,交易系统并不需要一直等待消息送达等动作都完成后才返回成功,允许一定延迟和瞬时不一致(最终一致性),而且后面两个动作通常可以并发执行。

如果后期监控大盘想要获取实时交易数据,只需要新增个消费者程序并订阅该消息即可,交易系统对此并不感知,松耦合。

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

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

相关文章

利用GitHub开源项目ChatGPTNextWeb构建属于自己的ChatGPT - Docker

Docker部署ChatGPTNextWeb ChatGPTNextWeb项目github开源地址:https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 根据文档部署ChatGPTNextWeb 文档地址:https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/blob/main/README_CN.md 步骤一&#…

Pytorch框架学习笔记

官网- PyTorch Tensor 构造随机初始化矩阵 xtorch.rand(5,3) 构造全0矩阵,数据类型为long xtorch.zeros(5,3,dtypetorch.long) 获取维度信息 x.size() tensor加法 torch.add(x,y) xy y…

CPU平台做视频智能分析,Lnton视频分析平台不仅支持流分析,同时也支持图片分析了

LntonAIServer最新v1.0.09版本支持图片分析了,经过几个月的研发,在原有的视频流分析的基础上,我们终于支持大家都非常期待的图片分析功能了,图片分析的功能加上,能有利于很多场景的展开,比如在烟火、明厨亮…

图像预处理——transforms

一、transforms 运行机制 torchvision是PyTorch的一个扩展库,提供了许多计算机视觉相关的工具和功能。下面是关于torchvision中常用模块的介绍: torchvision.transforms:提供了一系列常用的图像预处理方法,用于对图像进行变换、…

基于springboot+vue网吧管理系统(程序+数据库+文档)

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅摘 要 随着信息技术和网络技术的…

STM32CubeMX教程19 I2C - MPU6050驱动

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

医院信息系统集成平台—后台运维管理系统

随着信息化建设的推进,为了让凝聚了巨大人力物力投入的信息基础设施发挥出其效益,保障整个信息系统的平稳可靠运行,需要有一个可从整体上对包括服务器、网络,存储,安全等组件在内的IT基础设施环境进行综合管理的平台,并能够提供业务系统运行异常的实时告警和进行图形化问…

【Leetcode 209】长度最小的子数组 —— 滑动窗口|双指针

209. 长度最小的子数组 给定一个含有n个正整数的数组和一个正整数target。 找出该数组中满足其总和大于等于target的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回0。 示例 1&#xff…

可狱可囚的爬虫系列课程 09:通过 API 接口抓取数据

前面已经讲解过 Requests 结合 BeautifulSoup4 库抓取数据,这种方式在抓取数据时还是比较方便快捷的,但是这并不意味着所有的网站都适合这种方式,并且这也不是抓取数据的最快方式,今天我们来讲一种更快速的获取数据的方式&#xf…

02 Deep learning algorithm

Neural Networks target: inference(prediction)training my own modelpractical advice for building machine learning systemdecision Tress application: speech(语音识别) ----> images(计算机视觉)—> t…

无心剑七绝《译园杏花村》

七绝译园杏花村 鼓诗捣译醉乾坤 字句推敲忘晓昏 技艺精微佳作舞 春秋共赏杏花村 2024年1月5日 平水韵十三元平韵 回首译诗路,转眼二十四载,译诗两三千首,感慨良多。一路走来,结识了不少译友诗朋,切磋的快乐&#x…

【揭秘】单例模式DCL导致无法访问对象?

前两天,在审查团队成员的代码时,我发现了一个错误的单例模式写法。 在Java中,单例模式是一种非常常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例,但是,如果不正…

vue项目报错RangeError: Maximum call stack size exceeded

我的代码–> <script> import groupSettings from ./groupSetting.vue export default {name: groupSettings,components: {groupSettings}, </script>答应我&#xff0c;你的子组件引入名称一定不能和name一样&#xff01;&#xff01;&#xff01;

运算放大器(六):I-V 转换

1、跨阻放大器 放大器类型是根据其输入-输出信号的类型定义。假设放大器增益 &#xff08;X&#xff1a;输入&#xff0c;Y&#xff1a;输出&#xff09;。在电学范畴&#xff0c;由于用电压或电流表征一个信号&#xff0c;当输入信号为电流&#xff0c;输出信号为电压时&#…

数字孪生在虚拟现实(VR)中的应用

数字孪生在虚拟现实&#xff08;VR&#xff09;中的应用为用户提供了更深入、沉浸式的体验&#xff0c;同时通过数字孪生技术模拟真实世界的物理实体。以下是数字孪生在VR中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

mariadb配置慢sql查询

Mariadb和Mysql配置相同 这里配置的事mariadb 修改配置文件 vi /etc/my.cnf.d/server.cnf[mysqld] slow_query_logon slow_query_log_file/data/mysql_data/slow_query_log.log long_query_time2slow_query_logon 开启慢sql查询slow_query_log_file/data/mysql_data/slow_que…

kubectl 源码分析

Cobra库 k8s各组件的cli部分都使用Cobra库实现&#xff0c;Cobra 中文文档 - 掘金 (juejin.cn)&#xff0c;获取方式如下&#xff1a; go get -u github.com/spf13/cobralatest cobra库中的Command结构体的字段&#xff0c;用于定义命令行工具的行为和选项。它们的作用如下&…

56K star!一键拥有跨平台 ChatGPT 应用:ChatGPT-Next-Web

前言 现在围绕 openai 的客户端层出不穷&#xff0c;各路开发大神可以说是各出绝招&#xff0c;我也试用过几个国内外的不同客户端。 今天我们推荐的开源项目是目前我用过最好的ChatGPT应用&#xff0c;在GitHub超过56K Star的开源项目&#xff1a;ChatGPT-Next-Web。 ChatGP…

一创聚宽停止服务,散户可以选择它!

第一创业和聚宽停止合作&#xff01;还有什么量化平台可选&#xff1f; 先了解背景&#xff1a; 从2023年9月25日起&#xff0c;一创聚宽的量化交易平台暂停开通交易权限&#xff0c;到2023年12月29日&#xff0c;一创聚宽量化交易平台将停止提供所有服务。这一消息对于之前使…

Python基础入门第七课笔记(自定义函数 define)

函数 函数必须先定义再调用 函数必须先定义再调用 函数必须先定义再调用 定义函数&#xff1a; def 函数名&#xff08;形参&#xff09;&#xff1a; 代码1 代码2 ………. 调用函数&#xff1a; 函数名&#xff08;实参&#xff09; 形参&…