java后台,不同系统间推送条码,如何避免重复推送?

从A系统查询条码,然后推送给B系统的数据库;
网络不稳定,经常断电,而且推送的非常频繁;

这种情况如何避免重复推送?
有可能推送成功了,但是没来得及修改A数据库的状态,导致来电的时候再推送一次

--补充--
是A系统直接操作B系统的数据库,往B系统的数据库插入数据;
A系统的环境经常断电;
比如,A系统推送成功了,但是没来得及修改A系统数据库的状态,就断电了

阅读 2.2k
4 个回答

上消息队列啊,这样把A系统和B系统之间的交互变成异步的了,断电无非就是消息积攒,恢复了之后消息继续推送就可以,消息队列使用消息确认机制,只有在消费端成功读取这条消息并写入数据库才给消息队列发送确认信号,消息队列才会移除这条信息,否则一定时间后再次推送这条消息,可以保证消息不会推送多次。另外在消费端做好消息幂等性,就是说就算有多条重复的数据也只取一条,比如查看消息的主键是否唯一、使用版本号等保证数据不会重复插入。

---补充回答---

如果是用MYSQL的话可以用ON DUPLICATE KEY UPDATE语句,保证重复插入时只是做更新,不影响数据正确性,每次推送前在A系统判断两个系统的状态是不是一致(A系统可以直接访问B系统的数据库看看有没有插入成功,应该可以实现,这个过程如果也可能断电就上事务回滚):
A已发送 状态已修改 B已收到(一切正常)
A已发送 状态未修改 B未收到(再发一次)
A已发送 状态已修改 B未收到(再发一次)
A已修改 状态未修改 B已收到(再发一次)
当然我个人觉得MQ还是挺好的解决方案,可以的话还是尽量试试。

简单的使用redis上个锁就可以了

感觉a系统请求b系统的时候约定幂等键,然后这个幂等键作为数据库的唯一索引,通过数据库的唯一键约束来控制

新手上路,请多包涵

上述有看到你说要尽量小改动, 我个人觉得在推之前可以先查询一下看是否成功.没成功了在推一遍,成功了就推下一条. 这样改动最小,不需要上Mq.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题