消息中间件简介

消息中间件的定义

中间件Middlerware,是提供软件和软件之间连接的软件,以便软件各部件之间的沟通
消息:消息是指对象之间进行交互作用和通讯利用的一种方式。

消息中间件的作用

解耦

在项目启动之初来预测将来会碰到 什么 需求是极其困难的。消息中间件在处理过程 中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,这允许你独 立地扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束即可

流量削峰

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果以能处理这类峰值为标准而投入资源,无疑是巨大的浪费 。 使用消息中间件能够使关 键组件支撑突发访问压力,不会因为突发的超负荷请求而完全崩惯 。

异步处理

在很多时候应用不想也不需要立即处理消息 。消息中间件提供了异步处理机制, 允许应用把一些消息放入消息中间件中,但并不立即处理它,在之后需要的时候再慢慢处理 。

消息广播

 

消息收集

例如kafka进行系统日志收集

最终一致性

 

同步直接调用问题

以外卖业务下单流程为例
notion image
  • 业务调用链过长,用户等待时间长
  • 部分组件故障会瘫痪整个业务
  • 业务高峰期没有缓冲

异步直接调用问题

 
notion image
  • 解决了用户等待时间过长的问题,业务高峰期有一定的缓冲,但是高峰期产生大量的异步线程,造成线程池不够用或者内存溢出问题
  • 一般用于处理逻辑简单,耗时短的任务,因为异步线程可能因为服务重启或者系统调度而被终止
 

异步消息改造

notion image
 
优点
  • 业务调用链短,用户等待时间短
  • 部分组件故障不会瘫痪整个夜晚
  • 业务高峰期有缓冲
  • 业务高峰期时不会产生大量的异步线程

消息中间件的选型

notion image
notion image
云原生架构下的新一代消息中间件
云原生架构下的新一代消息中间件

AcitveMQ

  1. 架构
    1. notion image
  1. 简介
      • 由Apache出品,Java开发,支持JMS1.1协议和J2EE 1.4 规范
      • 支持广泛的连接协议,OpenWire,STOMP,REST,XMPP,AMQP
      • 支持多种语言客户端,支持插件
  1. 优点
      • 基于JAVA,跨平台,方便二次开发
      • 可以用JDBC连接多种数据库
      • 有完善的图形界面,监控,安全机制
      • 自动重试和错误重试
  1. 缺点
      • 社区活跃度低,维护频率低
      • 不适合用于上千个队列的应用场景
 

RabbitMQ

  1. 架构
    1. notion image
  1. 简介
      • 当前最主流的消息中间件
      • 高可靠性,支持发送确认,投递确认等特性
      • 高可用,支持镜像队列
      • 支持插件
  1. 优点
      • 基于Erlang,高并发性能好
      • 支持多种平台,多种客户端,文档齐全
      • 可靠性高
      • 在互联网公司有较大规模应用,社区活跃度高
  1. 缺点
      • Erlang语言小众,不利于二次开发
      • 代理架构下,中央节点增加了延迟,影响性能
      • 使用AMQP协议,使用起来有学习成本
 

RocketMQ

  1. 架构
    1. notion image
  1. 简介
      • 阿里背书,经受双十一考验
      • 能够保证严格的消息顺序
      • 亿级消息堆积能力
      • 丰富的消息拉取模式
  1. 优点
      • 基于Java,方便二次开发
      • 单机支持1万以上持久化队列
      • 内存和磁盘都有一份数据,保证性能+高可用
      • 开发度较活跃,版本更新快
  1. 缺点
      • 客户端种类不多,较成熟的是java及C++
      • 社区关注度及成熟度不如RabbitMQ
       

Kafka

  1. 架构
    1. notion image
  1. 简介
      • LinkedIn开发的分布式的日志提交系统
      • 独特的分区特性,适用于大数据系统
      • 性能高效,可扩展性好
      • 可复制,可容错
  1. 优点
      • 原生的分布式系统
      • 零拷贝技术,减少IO操作步骤,提高系统吞吐量
      • 快速持久化:可以在O(1)的系统开销下进行消息持久化
      • 支持数据批量发送和拉取
  1. 缺点
      • 单机超过64个队列/ 分区时,性能明显下降
      • 使用短轮询方式,实时性取决于轮询间隔时间
      • 消费失败不支持重试
      • 消息可靠性比较差,不适合业务系统,适合大数据和日志同步场景
 

总结

  • Active最“老”,老牌,但维护较慢
  • RabbitMQ最“广”,适合大小公司,各种场景通杀
  • RocketMQ最“猛”,功能强,但考验公司运维能力
  • Kafka最“强“,支持超大量数据,但消息可靠性弱