消息中间件
消息中间件是分布式系统中重要的组件,本质就是一个具有接收消息、存储消息、分发消息的队列,应用程序通过读写队列消息来通信。
在电商中,如订单系统处理完订单后,把订单消息发送到消息中间件,由消息中间件将订单消息分发到下游子系统(如物流、积分、通知等)。订单系统和下游子系统通过消息中间件进行通信,减少他们之间的耦合,增加系统稳定性降低系统调用延迟。
概述
类别 | 简介特性 | 适用场景 |
Kafka | 具有大规模、高可靠、高并发访问、可扩展 | 适用于日志采集、实时数据管道、流式数据处理、第三方解耦、流量削峰等场景 |
RabbitMQ | 支持广播、事务消息、消息路由、死信队列、优先级队列 | 适用于秒杀、流控、系统解耦等场景 |
RocketMQ | 提供顺序、延迟、定时、重投、死信、事务消息 | 适用于电商、金融等场景 |
对比分析
没有最好的技术,只有最合适的技术,每个消息中间件都有自己的优劣。
- 性能
类别 | QPS |
Kafka | 单机QPS能够达到百万级别,吞吐量比RabbitMQ要高出1\~2个数量级 |
RabbitMQ | 单机QPS在万级别 |
RocketMQ | 性能介于RabbitMQ与Kafka之间,单broker几万QPS |
- 数据可靠性
类别 | 可靠性 |
Kafka | 采用多副本机制,数据可靠性较高 |
RabbitMQ | 采用多副本机制,数据可靠性较高 |
RocketMQ | 采用3副本机制,数据可靠性较高。采用Raft一致性协议,数据一致性高于另外2个。 |
- 消息特殊功能
类别 | 功能特性 |
Kafka | 支持持久化、事务消息、单分区级别的消息顺序性 |
RabbitMQ | 支持持久化、事务消息、延迟队列、死信队列、优先级队列 |
RocketMQ | 支持持久化、事务消息、延迟队列、死信队列、消息重试、单队列内消息有序 |
- 消费模式功能
类别 | 功能特性 |
Kafka | 支持消息过滤、客户端主动拉取的消费模式、按照offset和timestamp进行消息回溯、广播消费 |
RabbitMQ | 支持客户端主动拉取和服务端推送的消费模式、广播消费、不支持消息回溯 消息被消费后就会被删除 |
RocketMQ | 支持消息过滤、客户端主动拉取和服务端推送的消费模式、消息回溯、广播消费 |
- 客户端支持
类别 | 功能特性 |
Kafka | 只支持kafka自定义协议、采用Scalc和java编写支持多种语言的客户端、支持SSL/SASL认证和读写权限的控制 |
RabbitMQ | 支持MQTT,STOMP等协议、采用Erlang编写支持多种语言客户端、支持SSL/SASL认证和读写权限的控制 |
RocketMQ | 兼容RocketMQ协议、支持多种语言客户端、支持SSL/SASL认证 |
- 服务可用性
类别 | 特性 |
Kafka | 采用集群部署,分区与多副本的设计。使得单代理宕机对服务无影响,且支持消息容量的线性提升。 |
RabbitMQ | 支持集群部署,集群代理数量有多种规格 |
RocketMQ | 采用Raft一致性协议,单台机器宕机会重新选主,可用性高。 |
总结
- kafka:采用拉取(Pull)方式消费消息,吞吐量相对更高。适用于海量数据收集与传递场景,例如日志采集和集中分析。
- RabbitMQ:基于Erlang语言开发,不利于做二次开发和维护,适用于对路由、负载均衡、数据一致性、稳定性和可靠性要求很高,对性能和吞吐量的要求没那么高的场景。
- RocketMQ:基于java语言开发,适用于对数据可靠性、数据实时性要求高、Topic数量非常多的场景。如订单、交易、充值、流计算、消息推送、日志流式处理、binlog分发等。