目录
一、比较各大mq框架的特点
ActiveMQ | RabbitMQ | RocketMq | ZeroMQ | |
关注度 | 高 | 高 | 中 | 中 |
成熟度 | 成熟 | 成熟 | 比较成熟 | 不成熟 |
所属社区/公司 | Apache | Mozilla Public License | Alibaba | |
社区活跃度 | 高 | 高 | 中 | 低 |
文档 | 多 | 多 | 中 | 中 |
特点 | 功能齐全,被大量开源项目使用 | 由于Erlang 语言的并发能力,性能很好 | 各个环节分布式扩展设计,主从 HA;支持上万个队列;多种消费模式;性能很好 | 低延时,高性能,最高 43万条消息每秒 |
授权方式 | 开源 | 开源 | 开源 | 开源 |
开发语言 | Java | Erlang | Java | C |
支持的协议 | OpenWire、 STOMP、 REST、XMPP、 AMQP | AMQP | 自己定义的一 套(社区提供 JMS--不成熟) | TCP、UDP |
客户端支持语言 | Java、C、 C++、 Python、 PHP、 Perl、.net 等 | Java、C、 C++、 Python、 PHP、Perl 等 | Java C++(不成熟) | python、 java、 php、.net 等 |
持久化 | 内存、文件、数据库 | 内存、文件 | 磁盘文件 | 在消息发送端保存 |
事务 | 支持 | 不支持 | 支持 | 不支持 |
集群 | 支持 | 支持 | 支持 | 不支持 |
负载均衡 | 支持 | 支持 | 支持 | 不支持 |
管理界面 | 一般 | 好 | 无社区有 web console 实现 | 无 |
部署方式 | 独立、嵌入 | 独立 | 独立 | 独立 |
评价 | 优点: 成熟的产品,已经在很多公司得到应用(非大规模场景)。有较多的文档。各种协议支持较好,有多重语言的成熟的客户端; 缺点: 根据其他用户反馈,会出莫名其妙的问题,切会丢失消息。 其重心放到activemq6.0 产品—apollo 上去了,目前社区不活跃,且对 5.x 维护较少; Activemq 不适合用于上千个队列的应用场景 | 优点: 由于erlang语言的特性,mq 性能较好;管理界面较丰富,在互联网公司也有较大规模的应用;支持amqp系诶,有多中语言且支持 amqp 的客户端可用 缺点: erlang语言难度较 大。集群不支持动态扩展。 | 优点: 模型简单,接口易用(JMS 的接口很多场合并不太实用)。在阿里大规模应用。目前支付宝中的余额宝等新兴产 品均使用rocketmq。集群规模大概在50 台左右,单日处理消息上百亿;性能非常好,可以大量堆 积消息在broker 中;支持多种消费,包括集群消费、广播消费等。开发度较活跃,版本更新很快。 缺点: 没有在 mq 核心中去实现JMS 等接口, |
二、mq的应用场景
1、异步处理
在业务流程中,对于那些非必须的业务节点,可以考虑使用异步处理的方式,减少整个业务流程的响应时间,减少系统之间的耦合度,把一个原来的长链路改成中短链路,也可以提高请求的可靠性。如图所示:
2、应用解耦
上述例子也提到,对于用户一次请求中的非必须业务节点,可以引入消息队列,减少系统之间的高耦合,同时也避免由于下游系统出现故障而丢失消息的情况。如下图所示:
3、流量削峰
在秒杀活动中可能会因为流量过大导致应用挂掉,可以在后端应用前端加入消息队列,然后设定阈值控制活动人数,超过阈值的订单可以直接丢弃,达到后端应用按照实际处理能力获取订单的目的。如下图所示:
三、mq框架的性能指标
性能指标 | ZeroMq | RabbitMq | ActiveMq |
---|---|---|---|
TPS比较 | 最好 | 中 | 最差 |
消息持久化 | 不支持 | 支持 | 支持 |
可靠性;灵活的路由;集群;事务;高可用的队列;消息排序;问题追踪;可视化管理工具;插件系统;社区 | 最差 | 最好 | 一般 |
高并发 | 最差 | 最好 | 一般 |
四、相关概念:
role | function | relationship |
producer | Clients that is application to produce messages | one producer can match more exchanges |
exchange | to route and filter messages | an exchanges can match more queues |
queue | to store and forward messages | a queue can match more consumers |
consumer | clients that is application to consume messages | |
binding key | the key can distinguish which message to match with; binding key can match the position of a exchange and a queue (e.g. binding key=bk_A match ex_A and q_A; binding key=bk_B match ex_A and q_B; binding key=bk_B match ex_A and q_A) | an exchange can have more binding keys; a queue and have more binding keys; |
具体如下图所示: