三个作用:解耦、异步化、削峰填谷
- 异步化的好处:更快返回结果、减少等待,自然实现了步骤间的并发,提升系统总体性能。
- 解耦说明:生产者不用再一个个通知消费者,而是将消息写入一个主题就行了。以后再增加消费者,生产者也不需要关心。
- 消息队列可以配合令牌桶算法使用,达到控制流量的目的。
选择消息队列产品的基本标准
- 必须开源、必须是比较流行且有一定社区活跃度。
- 必须具备以下几个特性:
- 消息的可靠性:确保不丢消息。
- Cluster:支持集群,确保不会因为某个节点宕机而导致服务不可用
- 性能:具备足够好的性能,能满足绝大多数场景的性能要求。
可供选择的消息队列产品
RabbitMQ
- 最早是为电信行业系统之间的可靠通信设计的,也是少数几个支持 AMQP 协议的消息队列之一
- Erlang 语言编写,轻量级。支持非常灵活的路由配置。
- 生产者和消费者之间有一个
Exchange模块
,可以配置路由规则将消息分发到不同队列中。 - 客户端支持的语言大概是最多的。
- 缺点:
- 对消息堆积的支持不好,在它的设计理念里,消息队列是一个管道,而不是存储。大量消息积压时会导致性能急剧下降。
- 性能一般,大概支持几万到十几万QPS。
- 使用的Erlang语言冷门,并且学习曲线陡峭,导致不容易扩展或者二次开发
RocketMQ
- 阿里巴巴2012年开源,后来捐赠给Apache软件基金会,2017年成为Apache的顶级项目。
- 有着不错的性能,稳定性和可靠性。具备一个现代的消息队列应该有的几乎全部的功能和特性。
- 有非常活跃的中文社区,使用JAVA语言开发,很容易扩展。
- 对在线业务的响应时延做了很多优化,大多数情况下可以做到毫秒级响应。
如果应用场景很在意响应时延,应当选择RocketMQ
。 - 支持几十万QPS。
- 劣势:在国际上还不是特别流行,与周边生态系统的集成和兼容程度要差一些。
Kafka
- 最早由Linkedin开发,也是Apache顶级项目,最初的设计目的是用于处理海量日志。
- 在早期版本,为了获得极致性能,做了很多牺牲,比如不保证可靠性,不支持集群等等。
- 随后几年逐步补齐这些短板,目前已经非常成熟。
- 与周边的生态系统兼容性是最好的,尤其是在大数据和流计算领域,几乎所有相关的开源软件都会优先支持。
- 使用Scala和Java开发,大量使用了批量和异步的思想。尤其是异步收发的性能是三者中最好的,但是和RocketMQ并没有数量级上的差距,大约每秒钟可以处理几十万消息。
同步收发响应时延比较高,因为客户端发送一条消息时。kafka不会立马发送出去,而是要等一会攒一批再发。所以当每秒钟消息数量不多时,延迟反而会有点高,所以kafka不太适合在线业务
。