面试题答案
一键面试- 消息队列协助解决数据一致性问题的原理
- 异步解耦:消息队列将不同的业务模块通过消息进行解耦。比如在订单处理场景中,订单创建和库存扣减是不同的业务操作,通过消息队列,它们不再直接调用,而是通过消息进行交互。这样,即使某个模块出现短暂故障或性能问题,也不会直接影响其他模块,保证系统整体的稳定性,为数据一致性奠定基础。
- 可靠消息传递:消息队列通常提供可靠的消息投递机制,如持久化存储消息。即使系统出现崩溃等异常情况,消息也不会丢失,确保了关键业务消息在各个环节都能被正确处理,从而有助于维护数据一致性。
- 顺序处理:在一些支持顺序消费的消息队列中,对于有顺序要求的业务场景(如订单处理流程),可以按照消息的发送顺序进行消费,避免因并发处理导致的业务逻辑混乱,进而保证数据一致性。
- 在订单处理分布式场景下保证库存扣减与订单创建一致性的方法
- 使用本地消息表模式:
- 订单创建阶段:当接收到创建订单请求时,在订单服务的数据库中插入一条订单记录,同时插入一条消息记录到本地消息表,该消息记录包含库存扣减的相关信息(如商品ID、数量等),消息状态标记为“待发送”。
- 消息发送阶段:订单服务中有一个定时任务或专门的消息发送服务,定期扫描本地消息表中状态为“待发送”的消息。将这些消息发送到消息队列,同时更新消息表中该消息的状态为“已发送”。
- 库存扣减阶段:库存服务监听消息队列,接收到库存扣减消息后,进行库存扣减操作。如果库存扣减成功,向订单服务发送确认消息(可以通过另一个消息队列或直接调用订单服务的接口);如果库存扣减失败,记录错误日志并可以选择重试一定次数。
- 订单确认阶段:订单服务接收到库存扣减成功的确认消息后,更新订单状态为“已确认”等合适状态。如果在一定时间内未收到确认消息,订单服务可以根据本地消息表中“已发送”状态的消息进行重试(重新发送库存扣减消息)。
- 使用事务消息模式(如果消息队列支持):
- 订单创建与消息预发送:订单服务开启一个全局事务,在事务内创建订单记录,同时向消息队列预发送库存扣减消息(预发送的消息处于一种中间状态,不会被消费者立即消费)。
- 事务提交与消息确认:如果订单创建成功,订单服务提交全局事务,同时向消息队列确认刚才预发送的消息可以被消费。此时库存服务才能监听到该消息并进行库存扣减操作。
- 事务回滚与消息取消:如果订单创建失败,订单服务回滚全局事务,同时通知消息队列取消刚才预发送的消息,避免库存服务执行不必要的库存扣减操作,从而保证了订单创建和库存扣减的一致性。
- 使用本地消息表模式: