消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
消息的发送者将消息发送到消息队列后可以立即返回,不用等待接收者的响应。消息会被保存在队列中,直到被接收者取出。消息的发送与处理是完全异步的。
传统模式下消息可能因为长时间等待而导致请求失败。消息队列模式下,如果发送消息时接收者不可用,消息队列会保留消息直到成功传递它。
消息队列帮助减少两个进程间的耦合度。只要消息格式不变,即使接收者的接口、位置或者配置改变,也不会给发送者带来任何改变。并且,消息发送者无需知道消息接收者是谁,使得系统设计更清晰;相反的,进程间使用远程过程调用(RPC)或者 socket 连接,当一方接口、IP 或端口改变了,另一方则必须修改请求配置。
发送者无需与接收者建立直接连接,双方通过消息队列保证消息能够从发送者路由到接收者,甚至对于本来网络不易互通的两个服务,也可以提供消息路由。
用户系统的多个部分可以同时发送或接收消息,TDMQ CMQ 版通过消息状态来进行消息可用性的控制。
每个队列均可独立配置,并非所有队列都要完全相同。在不同业务场景下的队列可以进行个性化的配置,例如一个队列中消息处理时间较长,可以针对队列属性进行优化。
对比项 | 腾讯云消息队列 CMQ 版 | 传统开源 MQ 应用 |
|---|---|---|
高性能 | 兼顾性能与可靠性,单 TDMQ CMQ 版实例 QPS 达到5000 | 数据可靠性与性能无法兼顾 |
高扩展性 | 队列数量及队列存储容量可扩展性强底层系统根据业务规模,自动弹性伸缩,上层业务无感知高效支持亿级消息收发、推送、堆积,容量不设上限提供北京、上海、广州地域的多地域服务 | 队列数量和消息堆积数量有限每个 IDC 机房必须重新部署、购买设备,非常繁琐 |
高可靠性 | 消息服务每条消息在返回给用户写成功之时就确保数据已被复制3份写到不同物理机上,并且后台数据复制机制能够保证任何一台物理机故障时其上的数据能够快速的做迁移,时刻保证用户数据3份 copy 可用,可靠性达99.999999%引入改良后的 Raft 一致性算法,保证数据强一致性业务可用性承诺:99.95% | 数据单机或简单主从结构,存在数据单点问题,一旦丢失不可回溯开源的 replica 算法,在集群新增、删除服务器节点时,会引发全局的数据重新均衡,引起可用性急剧下降如 Kafka 使用异步刷盘方式,异步 Replication,无法保证数据强一致性 |
业务安全 | 多维度的安全防护和通过接入层的缓存和负载均衡来应对DDoS 攻击每个消息服务提供单独命名空间,客户间数据严格隔离支持 HTTP 访问支持跨地域的安全消息服务 | 安全防护功能有限考虑到公网的网络威胁,经常无法提供跨地域、跨 IDC 的公网服务 |
系统组件之间或者应用之间通信较多,需要组件或者应用自身维护彼此的网络连接,而且通信的内容不仅一种,实现难度和维护成本较大。 使用 TDMQ CMQ 版可以实现生产者向多个订阅者,同时异步投递消息的能力,同时客户端可以通过消息过滤消费其中的某类消息。
发送消息时,接收者由于断电、宕机或 CPU 负载过高等原因不可用,消息无法可靠传递。使用 TDMQ CMQ 版,消息会被持久化保存在队列中,直到接收者可用时消息被成功消费。
公司业务收到用户提交的内容,将部分数据存储在自身的系统中,并将处理后的数据转发给其他业务应用(如数据分析系统、数据存储系统等),在这种系统组件之间或者应用之间耦合较紧,尤其对依赖的组件可控性较弱的情况下,使用 TDMQ CMQ 版,发送者和接收者对彼此信息无感知,耦合度大大降低。
在秒杀或团队抢购活动中,由于用户请求量较大,往往都会带来临时性的流量洪峰,这对后端的各个应用系统考验是十分巨大的,如果直接采用扩容方式应对又会带来一定的资源浪费。TDMQ CMQ 版此时便可以承担一个缓冲器的角色,将上游突增的请求集中收集,下游可以根据自己的实际处理能力来消费请求消息。
随着电商系统架构逐渐成长,假如订单系统(order_module)采用 Java 架构,库存系统(inventory_module)采用 Erlang 架构,而发货系统使用的是 Python 架构......开发人员需要长期维护一些冗余的代码来支持各模块之间通信。引入 TDMQ CMQ 版后,可以屏蔽不同平台,不同编程语言之间的差异。
两个服务在网络不能互通或者应用的路由信息(例如 IP 和端口)不确定的情况下需要通信。例如:两个腾讯云上的服务在不知道对方地址的情况下需要进行通信,引入 TDMQ CMQ 版后,可以通过约定相同的队列名,一个向队列中发消息,一个从队列中收消息来进行数据交换。