消息队列选型

本文最后更新于:2021年9月20日 上午

消息队列的选择还是很重要的啊,不能脑子一热就拍板要使用什么技术,这个世界没有银弹。

MQ一览表

ActiveMQRabbitMQRocketMQKafkaZeroMQ
单机吞吐量比RabbitMQ低2.6w/s(消息做持久化)11.6w/s17.3w/s29w/s
开发语言JavaErlangJavaScala/JavaC
主要维护者ApacheMozilla/SpringAlibabaApacheiMatix,创始人已去世
成熟度成熟成熟开源版本不够成熟比较成熟只有C、PHP等版本成熟
订阅形式点对点(p2p)、广播(发布-订阅)提供了4种:direct, topic ,Headers和fanout。fanout就是广播模式基于topic/messageTag以及按照消息类型、属性进行正则匹配的发布订阅模式基于topic以及按照topic进行正则匹配的发布订阅模式点对点(p2p)
持久化支持少量堆积支持少量堆积支持大量堆积支持大量堆积不支持
顺序消息不支持不支持支持支持不支持
性能稳定性一般较差很好
集群方式支持简单集群模式,比如’主-备’,对高级集群模式支持不好。支持简单集群,'复制’模式,对高级集群模式支持不好。常用 多对’Master-Slave’ 模式,开源版本需手动切换Slave变成Master天然的‘Leader-Slave’无状态集群,每台服务器既是Master也是Slave不支持
管理界面一般较好一般

其实个人觉得如果技术稍微强一点的公司都使用了MQ,这个只做了解

以后本文会以RocketMQ做示范

Kafka在大数据领域的实时计算、日志采集等场景使用,它是一个天然的分布式消息系统,吞吐量超级超级高

Rocket MQ是阿里出品,基于JMS,目前已经贡献给了Apache,对自己的公司有技术信心的可以使用

一些基本的概念

AMQP

即Advanced Message Queuing Protocol,是一个应用层标准高级消息队列协议,提供统一消息服务。是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。

JMS

即Java消息服务(Java Message Service)应用程序接口,由sun公司提出,并且sun公司定义好了接口。包括create、send、recieve。只要想使用它,就得实现它定义的接口。 消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。不好的地方是语言层面的限制,只能为JAVA,这其实稍微有点和微服务的观点相违背。要求语言只能是JAVA,而不能是py等。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!