功能上,两者都是实现了AMQP协议。那么在使用上的最大区别是什么呢?如何根据自己的需求进行选型?
kafka是严格顺序保证的消息队列。即使在分布式环境下,也保证在同一分区内消息的顺序性。既然是顺序的,那么在同一个Topic下面,如果前面的消息没有消费完毕(收到回应),则不能读取下一条消息。那么在消费端,就变成了一个单线程操作,无法并发。虽然kafka可以通过分区实现并发,不过这个需要用多台kafka实现。
还有个办法是在消费kafka消息的时候,消费完立即交给线程池处理,这样可以极大提高并发性。不过这样带来的问题是,如果线程没有处理完机器挂了,就会出现消息丢失的情况,需要在设计上考虑到。
Rabbitmq不承诺消息的顺序性,因此可以并发多线程处理。在队列中不必排队。如果你对顺序处理没有要求,可以用Rabbitmq实现较大的并发。