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 |
低 | 低 |
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/,原理图:
高可用集群部署方案,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来保证消息顺序可靠传输
参考文章:https://blog.****.net/whoamiyang/article/details/54954780
参考文章:https://blog.****.net/woogeyu/article/details/51119101
rabbitmq中交换机参考文章:https://blog.****.net/rainday0310/article/details/22082503
rabbitmq普通集群和镜像集群参考:https://blog.****.net/yangbutao/article/details/10982391
rocketmq消息发送接收相关参考:https://blog.****.net/wuzhengfei1112/article/details/78076718
rocketmq相关核心原理参考:https://m.aliyun.com/yunqi/articles/66110
KAFKA相关文章:
https://blog.****.net/suifeng3051/article/details/48053965
https://blog.****.net/xlgen157387/article/details/77211729