这个问题很常见,而且很多人对二者的选择也把握不好。
所以我决定写篇文章来详细说一下:Kafka 和 RabbitMQ 的区别,适用于什么场景?
同时,这个问题在面试中也经常问到。
下面我会通过 6 个场景,来对比分析一下 Kafka 和 RabbitMQ 的优劣。
一、消息的顺序
有这样一个需求:当订单状态变化的时候,把订单状态变化的消息发送给所有关心订单变化的系统。
订单会有创建成功、待付款、已支付、已发货的状态,状态之间是单向流动的。
好,现在我们把订单状态变化消息要发送给所有关心订单状态的系统上去,实现方式就是用消息队列。
在这种业务下,我们最想要的是什么?
- 消息的顺序:对于同一笔订单来说,状态的变化都是有严格的先后顺序的。
- 吞吐量:像订单的业务,我们自然希望订单越多越好。订单越多,吞吐量就越大。
在这种情况下,我们先看看 RabbitMQ 是怎么做的。
首先,对于发消息,并广播给多个消费者这种情况,RabbitMQ 会为每个消费者建立一个对应的队列。也就是说,如果有 10 个消费者,RabbitMQ 会建立 10 个对应的队列。然后,当一条消息被发出后,RabbitMQ 会把这条消息复制 10 份放到这 10 个队列里。
当 RabbitMQ 把消息放入到对应的队列后,我们紧接着面临的问题就是,我们应该在系统内部启动多少线程去从消息队列中获取消息。
如果只是单线程去获取消息,那自然没有什么好说的。但是多线程情况,可能就会有问题了……
RabbitMQ 有这么个特性,它在官方文档就声明了自己是不保证多线程消费同一个队列的消息,一定保证顺序的。而不保证的原因,是因为多线程时,当一个线程消费消息报错的时候,RabbitMQ 会把消费失败的消息再入队,此时就可能出现乱序的情况。