修改日期 | 修改人 | 备注 |
2020-03-24 14:44:37[当前版本] | 陈胜涛 | 格式调整 |
2020-03-24 14:43:38 | 陈胜涛 | 格式调整 |
2020-03-24 14:35:41 | 陈胜涛 | 创建版本 |
报修状态推送给瑞云小程序,解决工单状态不能实时获取的问题。
目前运营平台报修接口API,能够提供工单列表和工单详情,但是如果要获取工单状态及时更新,目前只能通过轮询的方式。增加了运营平台接口请求压力,实时性也不能保证。
所以,运营平台开始选型消息队列(MESSAGE QUEUE,简称MQ),以下是MQ选型和技术对比。
消息系统允许软件、应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶.
进行数据投递,非阻塞操作或推送通知。实现发布/订阅,异步处理,或者工作队列。所有这些都可以通过消息系统实现。
RabbitMQ是一个消息代理 - 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。
腾讯云消息队列(Cloud Message Queue,CMQ)是一种分布式消息队列服务,它能够提供可靠的基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)之间的收发消息,存储在可靠有效的 CMQ 队列中,防止消息丢失。 CMQ 支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
RabbitMQ 是具有代表性的开源消息中间件,当前较多地应用于企业系统内,用于对数据一致性、稳定性和可靠性要求较高的场景中。 腾讯云 CMQ 基于 RabbitMQ/AMQP 高可靠的原理,并使用 Raft 协议重新设计实现,在可靠性、吞吐量和性能上有了大幅提升。
本文将重点介绍 RabbitMQ 的可靠性原理、腾讯云 CMQ 进行的改进以及性能对比。
网络异常、机器异常、程序异常等多种情况都可能导致业务丢失消息。对消息进行确认可以解决消息的丢失问题,确认成功意味着消息已被验证并正确处理。
RabbitMQ 使用生产消息确认、消费者确认机制来提供可靠交付功能。
可以看出 RabbitMQ/AMQP 提供的是“至少一次交付”(at-least-once delivery),异常情况下,消息会被重复投递或消费。
为提高消息的可靠性,保证在 RabbitMQ 重启服务不可用时,要对收到的消息持久化写入磁盘。在收到消息时 RabbitMQ 将消息写入文件中,当写入达到一定数量或一定时间周期后 RabbitMQ 将文件落盘存储。
生产消息确认就是在消息落盘存储后,MQ向生产者回复已落盘存储的消息 ID。
腾讯云 CMQ 与 RabbitMQ 的对比
CMQ 与 RabbitMQ 的底层原理、实现方式有很多相似之处,但在更大程度上进行了升级改造:
除了生产、消费确认机制,CMQ 还提供了消费回溯功能。
用户可以指定腾讯云 CMQ 保存生产消息一定天数,随后将消费回溯到该时间段内某一时间点,从该点开始重新消费。在用户业务逻辑异常时,以时间为起点的消息重放功能对业务恢复非常有帮助。
性能指标 |
说明 |
网络 IO |
CMQ 能够批量生产 / 消费消息, RabbitMQ 则不支持批量生产。在大量小消息场景中, CMQ 具有更少的请求数和更低的平均延迟。 |
文件 IO |
CMQ 生产 / 消费消息顺序写单个文件,并周期性落盘存储,能最大限度地充分利用文件系统缓存。 RabbitMQ 持久化消息机制为先入内存队列进行状态转换,然后写日志缓存,最后写消息文件和索引文件(索引文件为顺序写、消息文件为随机写),涉及三次 IO 操作,性能较差。 |
CPU 性能 |
RabbitMQ 的日志缓存和状态转换运算较为复杂,需大量耗用 CPU 资源,性能较差。 |
CMQ 和 RabbitMQ 都能够使用多台机器进行热备份,提高可用性。CMQ 基于 Raft 算法实现,简单易维护。RabbitMQ 使用自创的 GM 算法(Guaranteed Multicast),学习难度较高。
Raft 协议中,Log 复制只要大多数节点向 Leader 返回成功,Leader 就可以应用该请求,向客户端返回成功:
GM 可靠多播将集群中所有节点组成一个环。Log 复制依次从 Leader 向后继节点传播,当 Leader 再次收到该请求时,发出确认消息在环中传播,直至 Leader 再次收到该确认消息,表明 Log 在环中所有节点同步完成。
GM 算法要求 Log 在集群所有节点同步之后才能向客户端返回成功;Raft 算法则只要求大多数节点同步完成。Raft 算法在同步路径上比 GM 算法减少了近一半的等待时间。
测试场景如下:三台同样配置的机器组成一个集群,腾讯云 CMQ、RabbitMQ 均配置为镜像队列,数据均在三台机器上同步。腾讯云 CMQ 和 RabbitMQ 都开启生产、消费消息确认机制。测试中的生产消息大小为1KB。
测试环境 |
环境说明 |
CPU |
24 核 Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz |
内存 |
64G |
磁盘 |
12*2T SATA 12 块 SATA 组成 Raid0 |
网卡 |
10G |
Linux 版本 |
2.6.32.43 |
RabbitMQ 版本 |
3.6.2 |
Erlang 版本 |
18.3 |
测试数据如下:
QPS 对比 |
仅生产 |
仅消费 |
同时生产 / 消费 |
CMQ |
生产: 6.8w/s |
消费: 9w/s |
生产: 3.6w/s |
RabbitMQ |
生产: 1.25w/s |
消费: 2.6w/s |
生产: 0.85w/s |
在高可靠场景中,CMQ 吞吐量优于 RabbitMQ 的四倍以上。
**CMQ-QPS 优势:**在保证高可靠前提下,同等物理设备,CMQ 的吞吐量优于 RabbitMQ 四倍以上。单集群 QPS 超过10万。
**RabbitMQ 不支持消息回溯:**RabbitMQ 不支持消息回溯,CMQ 支持按照时间回溯消息。例如从一天之前的某时某分某秒开始重新消费消息。典型业务场景如 Consumer 做订单分析,但是由于程序逻辑或者依赖的系统发生故障等原因,导致今天消费的消息全部无效,需要重新从昨天零点开始消费,那么以时间为起点的消息重放功能对于业务非常有帮助。
**一致性算法对比:**CMQ 和 RabbitMQ 都能够使用多台机器进行热备份,提高可用性。CMQ 基于 Raft 算法实现,简单易维护。RabbitMQ 使用自创的 GM 算法(Guaranteed Multicast),学习难度较高。
**RabbitMQ 运维难度大:**RabbitMQ 的开发语言用的是 Erlang,较小众、学习成本高。
**RocketMQ 在极端情况下,会丢失数据:**RocketMQ 允许未刷盘就向客户端返回确认,在机器异常宕机时,会丢消息。
**RocketMQ 需搭建多 Master、Slave 才能保证业务高可用:**RocketMQ 只有在 ISR 中有存活节点时,才能保证可用性和可靠性,ISR 中无存活节点时,可用性和可靠性无法保证,开销较大。
因此,相比传统开源 MQ 应用,腾讯云 CMQ 具有以下优势:
腾讯云消息队列 |
开源消息中间件软件 |
|
高性能 |
兼顾性能与可靠性,单 CMQ 实例 QPS 达到 5000 |
数据可靠性与性能无法兼顾 |
高扩展性 |
· 队列数量及队列存储容量可扩展性强 · 底层系统根据业务规模,自动弹性伸缩,上层业务无感知 · 高效支持亿级消息收发、推送,堆积,容量不设上线 · 提供北京、上海、广州地域的多地域服务 |
· 队列数量和消息堆积数量有限 · 每个 IDC 机房必须重新部署购买设备、部署,非常繁琐 |
高可靠性 |
· 基于腾讯自研 CRMQ ( Cloud Reliable Message Queue )分布式框架,已在腾讯内部 QQ 微信红包、彩票等业务上得到广泛使用 · 消息服务每条消息在返回给用户写成功之时就确保数据已被复制 3 份写到不同物理机上,并且后台数据复制机制能够保证任何一台物理机故障时其上的数据能够快速的做迁移,时刻保证用户数据 3 份 copy 可用,可靠性达 99.999999% · 引入改良后的 Raft 一致性算法,保证数据强一致性 · 业务可用性承诺: 99.95% |
· 数据单机或简单主从结构,存在数据单点问题,一旦丢失不可回溯 · 开源的 replicia 算法,在集群新增、删除服务器节点时,会引发全局的数据重新均衡,引起可用性急剧下降 · 如 Kafka 使用异步刷盘方式,异步 Replication ,无法保证数据强一致性 |
业务安全 |
· 多纬度的安全防护和防 DDoS 攻击服务 · 每个消息服务提供单独命名空间,客户间数据严格隔离 · 支持 HTTPS 访问 · 支持跨地域的安全消息服务 |
· 安全防护功能有限 · 考虑到公网的网络威胁,经常无法提供跨地域、跨 IDC 的公网服务 |