1.问题出现的原因如下:业务场景,业务人员 上传文件 异步解析,文件上传以后,然后上传oss 服务,写入文件记录表,得到文件地址,文件地址之后再发送消息 到 mq 中,消费者消费mq(同一个项目监听) ,拿到文件oss 的url 请求三方接口 ,解析完成。
dev和test 环境中都是 单实例部署, 生产后续才知道 ,数据库有主从 ,且K8s 上容器部署为双实例。
出现的问题是,当文件表写入mysql 库之后,然后发送消息, 消息消费之后,拿到文件链接去改写 文件表中解析状态的时候,没有找到的文件记录表,也就是 在消息产生之后,消息产生产生的那个线程任务中的事物 没有提交或者是因为 读主库中数据 (从库中写 update 此时还没有同步到主库 )导致查询为空。后续优化,事务提交之后才去发送mq消息,ApplicationEventPublisherAware ,后者那种情况,在第一个优化之后,update 的时候,锁定业务主键,直接update操作 业务逐渐,而不是先查 在update(三张关联表,需要第一章文件表查到,解析记录id ,再去解析),或者没有找到记录的时候,做线程等待。
分布式环境下文件解析事务与并发问题及解决方案
本文探讨了在分布式系统中,文件解析流程遇到的事务一致性问题。当文件上传并写入数据库后,通过MQ发送消息,消费者在更新文件状态时可能出现找不到记录的情况。问题源于数据库主从延迟和并发更新。为解决此问题,提出了两种优化方案:一是确保事务提交后再发送MQ消息,二是使用锁机制直接更新业务主键,避免查询更新的复杂性。此外,还讨论了线程等待策略作为备用解决方案。
2375

被折叠的 条评论
为什么被折叠?



