消息中间件 MQ
2023-06-12 07:41:06 17 举报
AI智能生成
消息中间件 MQ
作者其他创作
大纲/内容
概念
<b>Wiki: 面向消息的系统(消息中间件)是在分布式系统中完成消息的发送 和接收的基础软件</b>
自定义消息中间件
<b>生产者消费者模式</b>
MQ的应用场景<br>
异步处理
场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式
应用解耦
场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口
流量削峰
场景:` 秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
消息通讯
日志处理
日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题
主流消息中间件及选型
选型原则
开源
开源意味着如果队列使用中遇到bug,可以很快修改,而不用等待开发者的更新
产品近几年比较流行,且要有活跃的社区
消息传输的可靠性:保证消息不会丢失
支持集群,包括横向扩展,单点故障都可以解决
性能要好,要能够满足业务的性能需求
RabbitMQ
简介
RabbitMQ开始是用在电信业务的可靠通信的,也是少有的几款支持<b>AMQP协议</b>的产品之一。
优点
轻量级,快速,部署使用方便
支持灵活的路由配置
RabbitMQ中,在生产者和队列之间有一个交换器模块。根据配置的路由规则,生产者发送的消息可以发送到不同的队列中。路由规则很灵活,还可以自己实现。
RabbitMQ的客户端支持大多数的编程语言。
缺点<br>
大量消息堆积在队列中,性能会急剧下降
RabbitMQ的性能在Kafka和RocketMQ中是最差的,每秒处理几万到几十万的消息。如果应用要求高的性能,不要选择RabbitMQ。
RabbitMQ是<b>Erlang</b>开发的,功能扩展和二次开发代价很高。
RocketMQ
简介
RocketMQ是一个开源的消息队列,RocketMQ主要用于<b>有序,事务,流计算,消息推送,日志流处理,binlog分发</b>等场景
优点
功能全
RocketMQ几乎具备了消息队列应该具备的所有特性和功能
java开发
阅读源代码、扩展、二次开发很方便
性能较高
性能比RabbitMQ高一个数量级,每秒处理几十万的消息。<br>
缺点
跟周边系统的整合和兼容不是很好。
Kafka
优点
<b>Kafka的可靠性,稳定性和功能特性基本满足大多数的应用场景</b>。 跟周边系统的兼容性是数一数二的,尤其是<b>大数据和流计算领域</b>,几乎所有相关的开源软件都支持 Kafka
<b>Kafka高效,可伸缩,消息持久化。支持分区、副本和容错。</b>
Kafka是Scala和Java开发的,对<b>批处理和异步处理</b>做了大量的设计<br>
如果是<b>异步消息,并且开启了压缩</b>,Kafka最终可以达到`<b>每秒处理2000w</b>`消息的级别。<b>但是由于是异步的和批处理的,延迟也会高</b>,不适合实时性比较高的场景。
Rabbit、RocketMQ、Kafka对比<br>
MQ的优缺点
<b>优点</b>
解耦、削峰平谷、数据分发、异步处理
<b>缺点</b>
系统的可用性降低 <b><font color="#e74f4c">解决:集群</font></b>
系统引入的外部依赖越多,越容易挂掉,本来你就是 A 系统调用 BCD 三个系统的 接口就好了,人 ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整?MQ 挂了,整套系统崩溃了,你不就完了么。
系统的复杂性提高
如何保证消息没有被重复消费<br>
怎么处理消息丢失情况?
那么保证消息传递的顺序性?
一致性问题
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要 是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整? 你这数据就不一致了。
异步的消息机制
消息的顺序性 <font color="#e74f4c"><b>顺序消息</b></font><br>
消息的丢失 <b><font color="#e74f4c">消息的持久化</font></b>
一致性问题 <b><font color="#e74f4c">事务</font></b>
消息的重复 <b><font color="#e74f4c">消息的幂等性</font></b><br>
0 条评论
下一页