消息队列技术选型参考(通用)

520 阅读3分钟

image.png 国内使用的主流消息队列:

消息队列名称主要适用场景服务端核心开发语言主要优点主要缺点
kafka应用解耦(异步处理)、流量削锋、日志处理、消息通讯(聊天室等)|大数据领域应用较多Scala高性能、低延时、高可用、工具链成熟、生态成熟(监控 运维 管理 方案齐全)、功能较为简单(主要支持简单的MQ功能)无法弹性扩容、扩容成本高、消费失败不支持重试
rabbitmq应用解耦(异步处理)、流量削锋Erlangmq 性能较好,高并发、吞吐量到万级,MQ功能比较完备、健壮、稳定、易用、跨平台、支持多种语言、文档齐全RabbitMQ吞吐量会低一些、需要学习比较复杂的接口和协议,学习和维护成本较高、erlang开发不易于二次开发
acitvemq应用解耦(异步处理)、流量削锋JavaMQ领域的功能极其完备、有较低的概率丢失数据、基于主从架构实现高可用性、单机吞吐量到万级官方社区现对ActiveMQ 5.x维护越来越少,较少在大规模吞吐的场景中使用
rocketmq应用解耦(异步处理)、流量削锋Java单机吞吐量十万级、非常高的可用性(分布式架构)、经过参数优化配置消息可以做到0丢失、支持10亿级别的消息堆积、MQ功能较为完善、扩展性好支持的客户端语言不多(java和c++)、 没有在 mq 核心中去实现JMS等接口(有些系统要迁移需要修改大量代码)
…………………………
  • Kafka

  Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。

  一般有数据仓库和数据湖的公司,基本针对业务系统会进行数据采集,像是app中的设备信息采集,网站应用中的埋点等等,会采集大量包括用户操作痕迹在内的用户数据,这些数据不可能直接进库(数据仓库),需要进行一层ETL(清洗、转换、抽取);当然,对于数据湖来说,会直接保存原始采集数据,但是不管,是数据仓库或者数据湖,都不可能直接落库,需要减轻数据入库压力等等,这时候可以通过kafka做一层中间数据传输。

  大型公司建议可以选用,如果有日志(设备信息、用户信息等)采集功能,肯定是首选kafka了。

  需要注意的是它的MQ功能比较单一。

  • RabbitMQ

  RabbitMQ 是erlang开发,由于erlang语言本身的并发优势,其性能较好,本身社区活跃度也比较高。但是恰因为是erlang开发,所以它源码看起来比较难懂,不利于做二次开发和维护,主要依赖RabbitMQ的社区来处理开发过程中遇到的bug。

  数据量没有那么大的情况下,小公司可以优先选择功能比较完备的RabbitMQ。

  • ActiveMQ

  ActiveMQ其基本已停止维护,现在选择用ActiveMQ的比较少,早期用ActiveMQ的比较多,所以在一些老项目中比较常见,其MQ功能极其完备,可酌情选择。

  • RocketMQ

  针对金融互联网领域,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况,这时候可以考虑RocketMQ,这些业务场景在阿里双11已经经历了多次考验,业务有上述并发场景,可以选择RocketMQ。

  RoketMQ在稳定性上很高(分布式架构,开发时参考了kafka,吸取了kafka的一些优点,并且针对一些问题进行了改进)。