java后台,不同系统间推送条码,如何避免重复推送?
从A系统查询条码,然后推送给B系统的数据库;
网络不稳定,经常断电,而且推送的非常频繁;
这种情况如何避免重复推送?
有可能推送成功了,但是没来得及修改A数据库的状态,导致来电的时候再推送一次
--补充--
是A系统直接操作B系统的数据库,往B系统的数据库插入数据;
A系统的环境经常断电;
比如,A系统推送成功了,但是没来得及修改A系统数据库的状态,就断电了
回答:
上消息队列啊,这样把A系统和B系统之间的交互变成异步的了,断电无非就是消息积攒,恢复了之后消息继续推送就可以,消息队列使用消息确认机制,只有在消费端成功读取这条消息并写入数据库才给消息队列发送确认信号,消息队列才会移除这条信息,否则一定时间后再次推送这条消息,可以保证消息不会推送多次。另外在消费端做好消息幂等性,就是说就算有多条重复的数据也只取一条,比如查看消息的主键是否唯一、使用版本号等保证数据不会重复插入。
---补充回答---
如果是用MYSQL的话可以用ON DUPLICATE KEY UPDATE语句,保证重复插入时只是做更新,不影响数据正确性,每次推送前在A系统判断两个系统的状态是不是一致(A系统可以直接访问B系统的数据库看看有没有插入成功,应该可以实现,这个过程如果也可能断电就上事务回滚):
A已发送 状态已修改 B已收到(一切正常)
A已发送 状态未修改 B未收到(再发一次)
A已发送 状态已修改 B未收到(再发一次)
A已修改 状态未修改 B已收到(再发一次)
当然我个人觉得MQ还是挺好的解决方案,可以的话还是尽量试试。
以上是 java后台,不同系统间推送条码,如何避免重复推送? 的全部内容, 来源链接: utcz.com/p/945527.html