文章目录
前言
本文对之前介绍的Rabbitmq,RocketMq,kafka 消息模型特定进行对比,并探究在实际开发中如何进行技术选型。
一、几种模型的对比:
1. 消息发送特点:
1.1 相同点:
- Rabbitmq,RocketMq,kafka 消息发送失败均提供重试策略;
- Rabbitmq,RocketMq,kafka 的消息 均提供集群消息和广播消息的发送;
1.2 不同点:
- 消息类型:Rabbitmq,RocketMq 支持延迟消息的发送,而kafka 不支持;其中,Rabbitmq可以通过死信队列或者插件的方式实现;RocketMq 提供了按照延迟的级别实现;
- 消息的批量发送:RocketMq,kafka都支持消息的批量发送,而Rabbitmq 是将多条消息压缩为一条消息进行发送,严格来说Rabbitmq 并不支持批量发送消息;
- 消息的发送方式:RocketMq,kafka 消息都是发送到topic 中;Rabbitmq 的消息需要发送到交换机,然后通过路由建完成消息的路由;
- Rabbitmq,RocketMq 提供了web 的管理界面,kafka 没有web界面需要按照第三方;
2. 消息存储:
2.1 相同点:
- Rabbitmq,RocketMq,kafka 的消息都进行了持久化,且都有备份;Rabbitmq通过镜像队列进行数据备份;,RocketMq 通过队列的副本进行数据备份;kafka 通过副本分区进行数据备份;
2.2 不同点:
- RocketMq 中一个topic 下有多个队列,多个队列可以分布在不同的broker 上 ; kafka 中一个topic 下有多个分区,每个分区可以分布在不同的broker 上;Rabbitmq 中的一个队列就时只有一个队列;
3. 消息接收:
3.1 相同点:
- Rabbitmq,RocketMq,kafka 均支持批量消费消息;
- Rabbitmq,RocketMq,kafka 均支持手动提交ack;
- Rabbitmq,RocketMq,kafka 均支持消费失败的重试;
3.2 不同点:
- 消费模型:RocketMq,kafka 只支持pull 模式;Rabbitmq 支持pull和poll模式;
- 过滤消息:RocketMq 支持通过消息的tag 过滤消息,kafka 和Rabbitmq 不支持;
- 消息的消费:RocketMq,kafka 消费某个或者多个topic,Rabbitmq 消费一个或者多个队列;
- 历史消息:RocketMq,kafka 可以消费历史消息,Rabbitmq 在消息消费后就进行了删除,不支持消费历史消息;
- 消费失败重试 Rabbitmq,RocketMq, 均支持消费失败的重试;kafka 不支持消费失败的重试;
4. 消息模型:
Rabbitmq,RocketMq,kafka 三者都是基于发布/订阅模型,支持集群部署;
二、消息选型:
1.业务场景:
- 如果业务中消息量非常的大,并且消息需要快速消费,kafka 更加适合,因为其诞生支出就是为了处理社交平台的大量消息,可以达到20万级 QPS,Rabbitmq,RocketMq 稍微差一点儿可以达到10万级 QPS;
- 如果业务中强调消息的准确性和可靠性, RabbitMQ 和 RocketMQ 都是不错的选择,尤其是RocketMQ 诞生之初就是为了处理金融类的消息;
2.性能指标:
- 如果需要处理大规模数据的高吞吐量场景, Kafka 是最佳选择。Kafka 提供了非常高的吞吐量和低延迟,支持每秒处理数百万条消息;
- 如果需要对低延迟消息进行实时处理, RocketMQ 更适合。RocketMQ 处理小消息时延迟非常低,适合实时数据传输和实时计算;
- 如果需要保证消息不丢失和交付, RabbitMQ 优于其他消息队列,因为它支持消息确认机制和消息持久化;
3.生态系统:
- RabbitMQ 生态系统较为成熟,有很多语言和框架的客户端支持。它的社区活跃,文档和插件齐全,易于上手;
- RocketMQ 技术栈基本上是围绕 Java 和 Spring Framework 的。它支持主流的开源框架和应用,社区活跃度较高;
- Kafka 提供了多种编程语言的客户端,支持 Spark、Flink、Storm 等流处理框架,并且有成熟的生态系统和社区支持;
三、总结:
本文简单总结了三种消息的特点,以及对消息技术选型提供一些基本的思路,这三种中间件各有优缺点,需要根据自己的业务需求、性能要求和技术栈来选择。