消息队列(Message Queue,简称 MQ)技术是分布式应用间交换信息的一种技术。
消息队列主要解决应用耦合,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。
一. 为何用 MQ
1.1 解耦
不同系统如果要建立通信,传统的做法是:调用接口。
如果需要和新的系统建立通信或删除已建立的通信,都需要修改代码,这种方案显然耦合度很高。
如果使用 MQ,系统间的通信只需要通过发布/订阅(Pub/Sub)模型即可,彼此没有直接联系,也就不需要相互感知,从而达到 解耦。
1.2 异步
假设这样一个场景,用户向系统 A 发起请求,系统 A 处理计算只需要 10 ms,然后通知系统 BCD 写库,系统 BCD 写库耗时分别为:100ms、200ms、300ms。最终总耗时为:10+100ms+200ms+300ms=610ms。此外,加上请求和响应的网络传输时间,从用户角度看,可能要等待将近 1s 才能得到结果。
如果使用 MQ,系统 A 接到请求后,耗时 10ms 处理计算,然后向系统 BCD 连续发送消息,假设耗时 5ms。那么 这一过程的总耗时为 3ms + 5ms = 8ms,这相比于 610 ms,大大缩短了响应时间。至于系统 BCD 的写库操作,只要自行消费 MQ 后处理即可,用户无需关注。
1.3 削峰
假设某个系统读写数据库的稳定性能为每秒处理 1000 条数据。平常情况下,远远达不到这么大的处理量。假设,因为因为做活动,系统的瞬时请求量剧增,达到每秒 10000 个并发请求,数据库根本承受不了,可能直接就把数据库给整崩溃了,这样系统服务就不可用了。
如果使用 MQ,每秒写入 10000 条请求,但是系统 A 每秒只从 MQ 中消费 1000 条请求,然后写入数据库。这样,就不会超过数据库的承受能力,而是把请求积压在 MQ 中。只要高峰期一过,系统 A 就会很快把积压的消息给处理掉。
二. 消息队列对比
功能\产品 | Kafka | Pulsar | RocketMQ | RabbitMQ | CMQ |
---|---|---|---|---|---|
推出时间 | 2012 | 2016 | 2012 | 2007 | 不详 |
腾讯云商用时间 | 2020-08 | 2021-12 | 2022-06 | 2022-01 | 下架 |
腾讯云推荐 | × | √ | × | × | × |
多租户 | × | √ | × | × | × |
持久化 | √ | √ | √ | √ | √ |
失败重试 | × | √ | √ | √ | √ |
支持延时 | 不支持 | 10天内秒级 | 数十个固定时间(腾讯版改为40天内秒级) | 40天内毫秒级 | 不详 |
关注度 | 高 | 高 | 中 | 高 | 低 |
成熟度 | 高 | 中 | 高 | 高 | 高 |
活跃度 | 高 | 高 | 中 | 高 | 低 |
单机吞吐量 | 20万+ | 100万+ | 10万+ | 1万+ | 10万+ |
可用性 | 非常高(分布式) | 非常高(分布式) | 高(主从构架) | 高(主从构架) | 非常高(分布式) |
Topic数量 | 50+ | 1000 | 1000 | 1000/Queue | 不详 |
消息包限制 | 12M | 5M | 5M | 5M | 1M |