去哪儿网服务化改造中的消息队列设计与实现分析

0 下载量 156 浏览量 更新于2024-08-29 收藏 284KB PDF 举报
"去哪儿网在面对业务快速增长带来的挑战时,进行了服务化改造,涉及到的关键技术之一就是消息队列。在评估了多种MQ解决方案如RabbitMQ、ActiveMQ、Kafka和MetaQ(RocketMQ前身)后,由于各种原因,去哪儿网决定自研消息队列。在设计与实现消息队列的过程中,主要关注的是数据一致性、事务保障以及消费者处理的可靠性。" 去哪儿网在2012年的服务化改造中,遇到了单体应用无法适应快速扩展的业务需求的问题。为了应对这一挑战,他们选择了RPC框架Alibaba Dubbo进行同步服务间通信。同时,对于异步通信,去哪儿网对市面上的MQ进行了评估,最终决定自建消息队列,以解决ActiveMQ存在的不稳定性和复杂性问题。 在设计消息队列时,首要任务是确保数据一致性。这涉及到两个关键点:一是发送消息和业务操作必须具有事务性保证,防止出现业务成功但消息未发送或消息发送成功但业务失败的情况。例如,支付服务和出票服务间的通信,必须保证支付成功和消息通知的一致性,避免引发用户投诉或公司损失。二是消费者的处理一致性,通过消费确认(ACK)和重试机制,确保即使消费者临时故障,消息也能最终得到处理。 服务端设计初期,去哪儿网计划将消息队列应用于交易环节,并选择数据库作为消息存储。然而,随着消息队列在各个系统的广泛应用,其角色不再局限于交易场景,因此,设计上可能需要考虑更广泛的需求,如扩展性、容错性和性能优化。 此外,自研消息队列还需要解决的问题包括高可用性、可扩展性以及性能。例如,需要构建分布式MQ集群,以提供高可用的服务,同时支持水平扩展以应对不断增长的业务量。另外,队列的调度策略、消息的持久化机制以及网络通信的效率也是设计中的重要考量因素。 去哪儿网消息队列设计与实现的核心在于,如何在满足业务需求的同时,提供强一致性和高可靠性的消息传递服务,这其中包括了对各种可能故障场景的预设解决方案,以及对服务架构的持续优化。通过自研,去哪儿网能够更好地定制化服务,以适应自身业务的独特需求。