消息中间件

消息中间件是分布式系统中重要的组件,本质就是一个具有接收消息、存储消息、分发消息的队列,应用程序通过读写队列消息来通信。

Kafka、RabbitMQ、RocketMQ差异_rocketmq

在电商中,如订单系统处理完订单后,把订单消息发送到消息中间件,由消息中间件将订单消息分发到下游子系统(如物流、积分、通知等)。订单系统和下游子系统通过消息中间件进行通信,减少他们之间的耦合,增加系统稳定性降低系统调用延迟。

Kafka、RabbitMQ、RocketMQ差异_rocketmq_02

概述

类别

简介特性

适用场景

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分发等。