中小型公司,技术挑战不是特别高,用 RabbitMQ (开源、社区活跃)是不错的选择;大型公司,基础架构研发实力较强,用 RocketMQ(Java二次开发) 是很好的选择。
如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
RabbitMQ
RabbitMQ开始是用在电信业务的可靠通信的,也是少有的几款支持AMQP协议的产品之一。
优点:
●轻量级,快速,部署使用方便
●支持灵活的路由配置。RabbitMQ中,在生产者和队列之间有一个交换器模块。根据配置的路由规则,生产者发送的消息可以发送到不同的队列中。路由规则很灵活,还可以自己实现。
●RabbitMQ的客户端支持大多数的编程语言,支持AMQP协议。
缺点:
●如果有大量消息堆积在队列中,性能会急剧下降
●每秒处理几万到几十万的消息。如果应用要求高的性能,不要选择RabbitMQ。
●RabbitMQ是Erlang开发的,功能扩展和二次开发代价很高。
RocketMQ
借鉴了Kafka的设计并做了很多改进,几乎具备了消息队列应该具备的所有特性和功能。
●RocketMQ主要用于有序,事务,流计算,消息推送,日志流处理,binlog分发等场景。
●经过了历次的双11考验,性能,稳定性可靠性没的说。
●Java开发,阅读源代码、扩展、二次开发很方便。
●对电商领域的响应延迟做了很多优化。
●每秒处理几十万的消息,同时响应在毫秒级。如果应用很关注响应时间,可以使用RocketMQ。
●性能比RabbitMQ高一个数量级。
●支持死信队列,DLX 是一个非常有用的特性。它可以处理异常情况下,消息不能够被消费者正确消费而被置入死信队列中的情况,后续分析程序可以通过消费这个死信队列中的内容来分析当时所遇到的异常情况,进而可以改善和优化系统。
缺点:
跟周边系统的整合和兼容不是很好。
Kafka
高可用,几乎所有相关的开源软件都支持,满足大多数的应用场景,尤其是大数据和流计算领域,
●Kafka高效,可伸缩,消息持久化。支持分区、副本和容错。
●对批处理和异步处理做了大量的设计,因此Kafka可以得到非常高的性能。
●每秒处理几十万异步消息消息,如果开启了压缩,最终可以达到每秒处理2000w消息的级别。
●但是由于是异步的和批处理的,延迟也会高,不适合电商场景。