这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
基本介绍
消息中间件是指在分布式系统中完成消息的发送和接收的基础软件。消息中间件又称消息队列(MQ),是指高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下进行进程的通信。
应用场景
解耦
解耦是消息队列要解决的最根本问题。
对于一个实际业务中具体的功能实现,通常需要复杂的逻辑。而如果将其进行拆分,分成若干模块进行处理,可以有效提高系统的可维护性。而对于这些模块间的消息通信,可以采用直接调用的方式,也可以采用消息队列异步处理,提高系统响应速度。
最终一致性
最终一致性是指两个系统的状态保持一致。这并不是消息队列的必备特性,但可以依靠消息队列来实现系统的最终一致性。
由于消息队列通常采用异步处理的方式,所以当消息队列中的消息被消费完,需要保持通信的模块处于同样响应状态。
广播
消息队列的基本功能之一就是进行广播。
通过消息队列,任务处理时只需要关心消息是否送达了队列,而不需要操心哪个服务消费了消息,这是下游服务的事情,这种方式无疑极大减少了开发和联调的工作量。
削峰与流控
这是目前消息队列使用最常见的功能需求。
在高并发场景下,特别是在高流量请求时,借助消息队列可以实现有序异步执行,从而可以缓解服务器压力,提高用户使用体验。
主要消息中间件
Kafka
Apache Kafka 是最初由 LinkedIn 公司基于独特的设计实现为一个分布式的提交日志系统,之后成为 Apache 项目的一部分。
优点
- 性能卓越,吞吐量高,单机写入在百万级
- 可用性:kafka 是分布式的,数据有多个副本,不会丢失数据,不会导致不可用
- 采用 pull 方式获取消息,可以控制所有消息被消费且只有一次
- 有第三方管理页面 kafka-manager
- 在日志领域成熟
缺点
- Kafka单机超过 64 个队列/分区,load 会发生明显的飙高现象。队列越多,load越高,发送消息响应时间变长
- 采用短轮询方式,实时性取决于轮询间隔时间
- 消费失败不支持重试
- 支持消息顺序,但是一台代理宕机后,就会产生消息乱序
- 社区更新较慢
RocketMQ
RocketMQ 出自阿里的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。
优点
- 单机吞吐量在十万级
- 可用性:非常高,采用分布式架构
- 消息可靠性:经过参数优化配置,消息可以做到零丢失
- 支持十亿级别的消息堆积,不会因为堆积导致性能下降
缺点
- 没有实现 JMS 等接口,有些系统要迁移需要修改大量代码
- 社区活跃度一般
RabbitMQ
RabbitMQ 是 Rabbit 科技有限公司于 2007 年发布的一个在 AMOP 基础上完成,可复用的企业消息系统。
优点
- 基于erlang语言的特性,性能较好,高并发
- 吞吐量到万级
- 健壮、稳定、易用、跨平台、支持多种语言、文档齐全
- 开源提供的管理界面
- 社区活跃度高
缺点
- 采用 erlang 开发,对于不熟悉语言的人员难以进行二次开发和维护
- 吞吐量较低
- 需要学习复杂的接口和协议