消息中间件的定义消息中间件的作用解耦流量削峰异步处理消息广播消息收集最终一致性同步直接调用问题异步直接调用问题异步消息改造消息中间件的选型AcitveMQRabbitMQRocketMQKafka总结
消息中间件的定义
中间件Middlerware,是提供软件和软件之间连接的软件,以便软件各部件之间的沟通
消息:消息是指对象之间进行交互作用和通讯利用的一种方式。
消息中间件的作用
解耦
在项目启动之初来预测将来会碰到 什么 需求是极其困难的。消息中间件在处理过程 中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,这允许你独 立地扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束即可
流量削峰
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果以能处理这类峰值为标准而投入资源,无疑是巨大的浪费 。 使用消息中间件能够使关 键组件支撑突发访问压力,不会因为突发的超负荷请求而完全崩惯 。
异步处理
在很多时候应用不想也不需要立即处理消息 。消息中间件提供了异步处理机制, 允许应用把一些消息放入消息中间件中,但并不立即处理它,在之后需要的时候再慢慢处理 。
消息广播
消息收集
例如kafka进行系统日志收集
最终一致性
同步直接调用问题
以外卖业务下单流程为例
- 业务调用链过长,用户等待时间长
- 部分组件故障会瘫痪整个业务
- 业务高峰期没有缓冲
异步直接调用问题
- 解决了用户等待时间过长的问题,业务高峰期有一定的缓冲,但是高峰期产生大量的异步线程,造成线程池不够用或者内存溢出问题
- 一般用于处理逻辑简单,耗时短的任务,因为异步线程可能因为服务重启或者系统调度而被终止
异步消息改造
优点
- 业务调用链短,用户等待时间短
- 部分组件故障不会瘫痪整个夜晚
- 业务高峰期有缓冲
- 业务高峰期时不会产生大量的异步线程
消息中间件的选型
AcitveMQ
- 架构
- 简介
- 由Apache出品,Java开发,支持JMS1.1协议和J2EE 1.4 规范
- 支持广泛的连接协议,OpenWire,STOMP,REST,XMPP,AMQP
- 支持多种语言客户端,支持插件
- 优点
- 基于JAVA,跨平台,方便二次开发
- 可以用JDBC连接多种数据库
- 有完善的图形界面,监控,安全机制
- 自动重试和错误重试
- 缺点
- 社区活跃度低,维护频率低
- 不适合用于上千个队列的应用场景
RabbitMQ
- 架构
- 简介
- 当前最主流的消息中间件
- 高可靠性,支持发送确认,投递确认等特性
- 高可用,支持镜像队列
- 支持插件
- 优点
- 基于Erlang,高并发性能好
- 支持多种平台,多种客户端,文档齐全
- 可靠性高
- 在互联网公司有较大规模应用,社区活跃度高
- 缺点
- Erlang语言小众,不利于二次开发
- 代理架构下,中央节点增加了延迟,影响性能
- 使用AMQP协议,使用起来有学习成本
RocketMQ
- 架构
- 简介
- 阿里背书,经受双十一考验
- 能够保证严格的消息顺序
- 亿级消息堆积能力
- 丰富的消息拉取模式
- 优点
- 基于Java,方便二次开发
- 单机支持1万以上持久化队列
- 内存和磁盘都有一份数据,保证性能+高可用
- 开发度较活跃,版本更新快
- 缺点
- 客户端种类不多,较成熟的是java及C++
- 社区关注度及成熟度不如RabbitMQ
Kafka
- 架构
- 简介
- LinkedIn开发的分布式的日志提交系统
- 独特的分区特性,适用于大数据系统
- 性能高效,可扩展性好
- 可复制,可容错
- 优点
- 原生的分布式系统
- 零拷贝技术,减少IO操作步骤,提高系统吞吐量
- 快速持久化:可以在O(1)的系统开销下进行消息持久化
- 支持数据批量发送和拉取
- 缺点
- 单机超过64个队列/ 分区时,性能明显下降
- 使用短轮询方式,实时性取决于轮询间隔时间
- 消费失败不支持重试
- 消息可靠性比较差,不适合业务系统,适合大数据和日志同步场景
总结
- Active最“老”,老牌,但维护较慢
- RabbitMQ最“广”,适合大小公司,各种场景通杀
- RocketMQ最“猛”,功能强,但考验公司运维能力
- Kafka最“强“,支持超大量数据,但消息可靠性弱