RocketMQ 消息消费时查询库存问题及优化方案
这段代码中,发送 MQ 消息的部分是在事务提交之后执行的。在发送 MQ 消息之前,会先更新库存,然后再发送 MQ 消息。所以,在消费 MQ 消息时,查询库存的结果会是变更后的库存数量。
如果你想要在发送 MQ 消息之前查询扣减前的库存数量,可以将发送 MQ 消息的代码放在更新库存之前。这样,在发送 MQ 消息之前,你可以先查询库存,然后再进行库存的更新操作。
另外,在发送 MQ 消息的过程中,使用了事务来保证消息的可靠性。如果在发送 MQ 消息时出现异常,事务会回滚,库存的更新也会回滚。这样可以保证库存和 MQ 消息的一致性。
代码示例:
@Transactional(rollbackFor = Exception.class)
TackAnOrderVo tackAnOrder(@RequestBody @Validated PlaceOrderVo vo){
//保存订单
//发送MQ消息更新es库存标志
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
@Override
public void beforeCommit() {
//查询扣减前的库存
//发送mq更新es库存标志
for (Long drugId : drugIdList) {
DrugChangeMessage drugChangeMessage = new DrugChangeMessage();
drugChangeMessage.setDrugId(drugId);
drugChangeMessage.setStoreId(order.getStoreId());
drugChangeMessage.setChangeType(5);
drugChangeMessage.setMerchantId(Long.parseLong(merchantId));
drugChangeMessage.setEnterpriseId(Long.parseLong(enterpriseId));
drugChangeMessage.setPlatformId(Long.parseLong(platformId));
drugProducer.sendDrugChangeMsg(drugChangeMessage);
}
}
});
//更新库存
//更新其它
}
原文地址: https://www.cveoy.top/t/topic/pgLo 著作权归作者所有。请勿转载和采集!