*本文涉及:
RocketMQ官方文档地址 (apache.org)
目录
消息队列
为什么要使用消息队列?
消息队列常见的使用场景核心的有 3 个:解耦、异步、削峰。
解耦
消息队列降低了不同服务间的耦合度。各个服务只需关心消息的生产和消费,而不必知道对方的具体实现细节。通过消息队列作为中介,即使接收方暂时不可用或者发生变更,也不会直接影响到生产方的正常运行。
例如,A系统与B系统的交互是根据直接调用接口。那么当B系统不可用,或者接口做出了更新,那么这个功能将不可用。A系统将考虑重试、重发等方式保证业务流程。那么这种根据其他系统影响正常业务流程,而且随时增加工作量、浪费沟通成本的情况是不可容忍的。
异步
当某些操作不需要立即响应或可以独立于主流程运行时,消息队列允许系统以异步方式工作。
例如,用户下订单后,可以立即收到确认消息,而订单处理、库存更新、发送邮件通知等操作则在后台异步完成,从而极大地缩短了响应时间,提升用户体验。并且各个模块更加专注于自己的逻辑处理,一定程度上也解耦了代码处理,提高健壮性。
削峰
在高并发场景下,消息队列能够起到缓冲作用,避免大量请求直接冲击后端服务,确保系统稳定。
例如,在秒杀、抢购等活动中,短时间内涌入的请求可以先放入队列中逐步处理,而不是一次性全部压垮服务。
其他
除了三大核心外,消息队列也可以在分布式系统中实现最终一次性。即使某个服务暂时故障或网络中断,待恢复后可以从队列中重新消费消息,确保数据的最终正确性。消息队列提供了错误隔离与重试机制,当消费端处理消息失败时,消息可以重回队列等待下次尝试,增强了系统的稳定性。而对于需要按照特定顺序处理的消息,消息队列可以提供有序的消息投递能力,确保下游服务按序执行业务逻辑。
RocketMQ
为什么使用RocketMQ?
- 架构差异。相比于其他MQ采用AMQP协议实现的复杂路由规则,RocketMQ基于Java实现,采用自己的二进制协议设计简洁。
- 性能。在阿里巴巴生态内经历了双十一等高并发场景,表现优秀。尤其是在大规模消息堆积和处理时,因其高效的磁盘存储机制和零拷贝技术,通常有更高的TPS(每秒处理的消息数)。
- 生态。国内市场占有率较高,尤其在阿里巴巴生态内广泛应用,中文社区活跃,更适合国内开发者使用,同时也有良好的国际化支持。