一.问题
记录一次项目中遇到的问题,电商后台添加商品的时候,需要将数据同步到es,因为后续逻辑较多,所以使用rabitmq异步处理了下,但是实践中,遇到了一个问题,mq消费者拿到商品id,去数据库查询,结果发现不存在,然后很快排查到是因为,生产者的事务还未提交,然后数据发到mq,很快被消费到,所以为什么消费者拿id去数据库查,查不到,消费者可以将数据库隔离级别改为最低级,读未提交,但是不严谨,然后为了快速开发完,mq消费者拿到消息先执行sleep1秒,后续进行了优化
二.解决
将发送消息保存到mysql的一张表,然后和商品入库作为同一个事务提交,之后在放到mq处理,然后再加一个定时任务做补偿,因为可能事务提交成功了,mq失败,需要重新投递消息
问题1有时候还可能是mysql主从,数据入到主库,然后还没有到从库,就被消费到了.
还有一个解决方案是将整个商品对象放到mq中,这样消费者就不用查数据库了,但这样网络资源会大幅占用,