一、什么是消息队列
消息队列(Message Queue),是分布式系统中重要的组件,主要解决了应用耦合、异步处理、流量削锋等问题。当前主要使用的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,部分DB类存储系统也可以实现消息队列,本质类似于java的jms,主要实现消息对象的接收、存储与发送。
二、消息队列的应用
消息队列在实际应用中包括:
1. 应用耦合,多个系统需要调用统一接口,对同一参数进行处理,为避免并发调用导致系统压力,导致整个系统失败。之前公司做的电商系统,属于一个伪微服务的系统,只是将几个不是订单处理的系统分离出来,在物流,仓库等多个服务调用订单系统的时候用到ActiveMQ。
2. 异步处理,多系统对单一系统中的同一消息都需要进行处理,使用消息队列的广播模式进行并发处理,缩短了时间;
3. 广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
三、消息队列的模式
1.点对点模式:消息生产者将消息发送到队列中,然后消息接收者从队列中取出并消费消息,被消费的消息会直接删除,不会出现重复消费;
特点是:每个消息只有一个消费者,发送者和消费者没有依赖关系,消费者消费成功之后会响应消息队列,以便删除消息;
2.发布/订阅模式:发布者将A主题的消息发送到消息队列,消费者可以根据主题消费响应的消息,或队列将消息推送给消费者
特点:每个消息可以被多个消费者消费,消费者和生产者之间有时间依赖性;为了消费消息,订阅者需要提前订阅该角色主题;
四、接触过的消息队列的对比
第一个公司做的电商项目中用到了ActiveMQ进行订单处理和秒杀系统的处理,第二个公司使用RabbitMQ作为分布式系统的消息通讯,异步处理和削锋的工具,因为使用,所以调研过MQ,加上RocketMQ是马家的,所以关注了一下,以下是这三个MQ的对比:
ActiveMQ |
RabbitMQ |
RocketMQ |
|
关注度 |
高 |
高 |
中 |
成熟度 |
成熟 |
成熟 |
比较成熟 |
社区 |
Apache |
Mozilla开源社区 |
Alibaba |
社区活跃度 |
高 |
高 |
中 |
文档 |
多 |
多 |
少 |
特点 |
功能齐全,被大量使用 |
由于Erlang语言的并发能力,使得性能很好 |
各个环节分布式扩展设计,主从高可用群集;支持上万个队列;多种消费模式;性能很好 |
开源 |
开源 |
开源 |
开源 |
语言 |
Java |
Erlang(面向并发编程语言) |
Java |
Client语言 |
支持Java |
支持Java |
支持Java |
支持协议 |
OpenWire、STOMP、REST、XMPP、AMQP |
AMQP |
自定义的一套,提供了支持JMS客户端的API |
持久化 |
内存,文件,数据库 |
内存,文件 |
磁盘文件 |
事务 |
支持 |
不支持 |
支持 |
集群和负载均衡 |
支持 |
支持 |
支持 |
管理页面 |
一般 |
好 |
无 |
部署方式 |
独立,嵌入 |
独立 |
独立 |
评价 |
优点:成熟的产品,已经在很多公司得到应用(非大规模场景)。有较多的文档。各种协议支持较好,有多重语言的成熟的客户端; 缺点:根据其他用户反馈,会出莫名其妙的问题,并且会丢消息。其重心放到activemq6.0产品—apollo上去了,目前社区不活跃,且对5.x维护较少; Activemq 不适合用于上千个队列的应用场景 |
优点:由于erlang语言的特性,mq性能较好;管理界面较丰富,在互联网公司也有较大规模的应用;支持amqp协议,有多中语言且支持 amqp 的客 户端可用。 缺点:erlang语言难度较大。 |
优点:模型简单,接口易用。在阿里大规模应用。目前支付宝中的余额宝等新兴产品均使用rocketmq。集群规模大概在50台左右,单日处理消息上百亿;性能非常好,可以大量堆积消息在 broker 中;支持多种消费,包括集群消费、广播消费等。开发度较活跃,版本 更新很快。 缺点:产品较新,文档比较缺乏。没有在 mq 核心中去实现 JMS 等接口,对 已有系统而言不能兼容。 |
五、总结
综合以上来看,三种MQ各有优劣,ActiveMQ和RabbitMQ相对成熟,使用起来略微顺手,网上文档也很多,坑基本上被踩完了,前者使用java写的,学习成本低,后者使用Elang语言比较难以学习,都支持出就花和集群,唯一的是RabbitMQ不支持事务,但是公司现在也用不到这个。RabbitMQ是阿里自己开发的,设计的很强大,但是肯定会偏向阿里的业务,不一定对所有的公司都适合,加上文档少,不是很成熟,没有深厚的技术底蕴,难以放心的使用;总之,技术没有最好的,只有最适合的,贴合自己公司的业务和实际情况选出来的就是最好的!