MQ消息队列选型

消息队列在实际应用中常用的使用场景:异步处理,应用解耦,流量削锋和消息通讯四个场景,保证最终一致性

先看下云平台商用的消息队列的使用对比吧

1.产品对比(腾讯云)

腾讯云上面的mq,主要有CMQ,CKAFKA,消息队列IoT MQ

CMQ:在需要进行异步通信的应用情景中推荐使用 CMQ;同时 CMQ 保证不丢失消息,其可广泛应用于金融、电商订单、支付结算等对数据可靠性要求极高的场景中

CKafka:适用于吞吐量非常大的大数据处理场景。

IoT MQ:消息队列 IoT MQ 适用于需要低功耗、网络吞吐有限、网络质量差的 IOT(物联网)和移动互联网场景

应用案例:

微信红包


2.产品对比(引用阿里云官网):

功能 消息队列 RocketMQ Apache RocketMQ
(开源)
消息队列 Kafka Apache Kafka
(开源)
RabbitMQ
(开源)
安全防护 支持 不支持 支持 不支持 支持
主子账号支持 支持 不支持 支持 不支持 不支持
可靠性 - 同步刷盘 
- 同步双写 
- 超3份数据副本 
- 99.99999999%
- 同步刷盘
- 异步刷盘
- 同步刷盘 
- 同步双写 
- 超3份数据副本 
- 99.99999999%
异步刷盘,丢数据概率高 同步刷盘
可用性 - 非常好,99.95%
- Always Writable
- 非常好,99.95%
- Always Writable
横向扩展能力 - 支持平滑扩展
- 支持百万级 QPS
支持 - 支持平滑扩展
- 支持百万级 QPS
支持 - 集群扩容依赖前端
- LVS 负载均衡调度
Low Latency 支持 不支持 支持 不支持 不支持
消费模型 Push / Pull Push / Pull Push / Pull Pull Push / Pull
定时消息 支持(可精确到秒级) 支持(只支持18个固定 Level) 暂不支持 不支持 支持
事务消息 支持 不支持 不支持 不支持 不支持
顺序消息 支持 支持 暂不支持 支持 不支持
全链路消息轨迹 支持 不支持 暂不支持 不支持 不支持
消息堆积能力 百亿级别
不影响性能
百亿级别
影响性能
百亿级别
不影响性能
影响性能 影响性能
消息堆积查询 支持 支持 支持 不支持 不支持
消息回溯 支持 支持 支持 不支持 不支持
消息重试 支持 支持 暂不支持 不支持 支持
死信队列 支持 支持 不支持 不支持 支持
性能(常规) 非常好
百万级 QPS
非常好
十万级 QPS
非常好
百万级 QPS
非常好
百万级 QPS
一般
万级 QPS
性能(万级 Topic 场景) 非常好
百万级 QPS
非常好
十万级 QPS
非常好
百万级 QPS
性能(海量消息堆积场景) 非常好
百万级 QPS
非常好
十万级 QPS
非常好
百万级 QPS
引用地址: https://www.aliyun.com/product/ons?spm=5176.8142029.388261.399.a7236d3eBWUT7W
百度云平台只提供kafka的商用版:
参见: https://cloud.baidu.com/product/kafka.html

3.各个开源消息队列主要关注点和实现方式:

rabbitmq消息发送接收原理:

参见官网:http://www.rabbitmq.com/getstarted.html

消息的几种发送接收类型

exchange有四种类型:分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。


几个概念说明: 
Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输, 
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。 
Queue:消息的载体,每个消息都会被投到一个或多个队列。 
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来. 
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。 
vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。 
Producer:消息生产者,就是投递消息的程序. 
Consumer:消息消费者,就是接受消息的程序. 

Channel:消息通道,在客户端的每个连接里,可建立多个channel.

高可用部署方案有两种模式:普通模式和镜像模式

    集群类型:普通集群、镜像集群

  • 普通集群:结构同步,消息实体只存在一个节点中,但consumer在非消息节点获取是,节点间存在消息拉取,易产生性能瓶颈。
  • 镜像集群:集群中一个master,负责调度,处理消息实体,其他节点保存一份数据到本地;性能主要靠master承载。

参考官网文档:http://www.rabbitmq.com/clustering.html#starting

运维管理:

rabbitmq提供管理的web插件


rocketmq消息发送接收原理:

消息发送、消费模型,详见官方文档:http://rocketmq.apache.org/,原理图:

可以实现消息发送时指定topic的一个队列来实现顺序消费, 可以支持顺序消费和消息回溯,可以支持按照messageKey来查询消息


高可用集群部署方案,broker部署主从模式


运维管理:

rocketmq提供管理的web-console


kafka:

消息发送接收机制:



kafka 应用场景

  • 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
  • 消息系统:解耦和生产者和消费者、缓存消息等。
  • 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
  • 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
  • 流式处理:比如spark streaming和storm
  • 事件源

参考各大云平台对Kafka的使用说明可以看出kafka适合于海量数据的处理系统中

官方使用案例说明:http://kafka.apache.org/uses

4.腾讯云平台CMQ

参考:CMQ后台

CMQ是rabbitmq的升级版,支持mq的消息回溯,对消息的超时策略等做了简单的优化

腾讯云平台使用地址:https://console.cloud.tencent.com/mq/index?rid=1

cmq队列参数为:

y

添加主题订阅可以设置重试的策略:


订阅地址官方文档中说明:目前推送服务不能推送到私有网络中,因此 endpoint 填写为私有网络域名或地址将接收不到推送的消息,目前支持推送到公网和基础网络。

文档地址:https://cloud.tencent.com/document/product/406

二、我们的业务场景

1.订单消息分发,特点:消息时效性高,消息不能丢失,优先级高

可以使用rabbitmq,rocketmq,cmq

2.日志收集分析,特点:数据量大,优先级低,

可以使用ELK解决方案,使用kafka,redis,rocketmq做消息队列

3.数据分库分表后数据异构,特点:消息及时性和顺序性,优先级中

可以使用rocketmq来保证消息顺序可靠传输


参考文章:http://www.javashuo.com/article/p-pkfdqnxz-ga.html

参考文章:http://www.javashuo.com/article/p-giwbpbcc-gd.html

rabbitmq中交换机参考文章:https://blog.csdn.net/rainday0310/article/details/22082503

rabbitmq普通集群和镜像集群参考:https://blog.csdn.net/yangbutao/article/details/10982391

rocketmq消息发送接收相关参考:https://blog.csdn.net/wuzhengfei1112/article/details/78076718

rocketmq相关核心原理参考:https://m.aliyun.com/yunqi/articles/66110

KAFKA相关文章:

http://www.javashuo.com/article/p-vrdyxmvm-d.html

http://www.javashuo.com/article/p-fgfjvokd-dv.html