消息中间件介绍 | 青训营笔记

199 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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 开发,对于不熟悉语言的人员难以进行二次开发和维护
  • 吞吐量较低
  • 需要学习复杂的接口和协议

image.png

参考文章

  1. 消息队列Kafka、RocketMQ、RabbitMQ的优劣势比较