A,B两个相对独立的系统,A系统和B系统有相同的单据,两个系统相同的单据信息要同步,现A系统要修改单据状态,必须先发送SCOKET信息到B系统,B系统修改对应的单据状态后再返回成功的信息给A系统,A系统再修改单据状态
但如果B系统修改单据状态后,A系统没有收到返回信息,两个系统的单据状态就不一致,请问有什么办法保证数据同步?
(A,B两个系统是不同公司的系统,只能通过发送指令让对方作出修改)
但如果B系统修改单据状态后,A系统没有收到返回信息,两个系统的单据状态就不一致,请问有什么办法保证数据同步?
(A,B两个系统是不同公司的系统,只能通过发送指令让对方作出修改)
直到B收到信息....你也可以规定最大重试次数,超出此次数B则回滚修改的信息
2,B受到请求,修改单据,但不提交,B-->A返回信息,等待A的回复.
3,A受到请求,修改单据状态,提交;返回信息给B,B受到信息,提交;B要是由于等待超时还没受到A的返回信息.B回滚,同时再发送信息给A让其再回复修改前的状态.
4,A若受到B发送的恢复修改前状态,则恢复.失败;A若没有受到B发送的恢复修改前状态信息,成功;
你的问题,不存在完美的解决方案,只能是尽可能理想的折中方案.
楼主是基于TCP的SOCKET,因而一要过多考虑TCP协议本身已经解决的问题(TCP本身通信是可靠的).因此:我的建议是:你的应用层的双方同步协议可基于这一前提条件来设计:
1)A->B发消息(命令),带有唯一的消息ID,(消息ID是递增的--这很重要-见下边说明)
2)B收到后,立即响应消息(用相同的ID),并同时做数据更新
3)A收到响应后,对该ID所对应的数据进行更新.
讨论:
若A没有收到响应消息:问题可能出在两处:(1)B没有收到--当然无法响应 (2)B收到,做了响应,但A没有收到.
无论哪一种情况:A在指定的定时器时间内,没有收到ID消息的响应,都向B重发.若经过指定次数之后,仍没有收到响应,则B可能断电(之类)的了.此时:A的数据都不更新,必须等到B的响应,才能更新对于B:若是上述的第(1)种情况,则A的重发的命令,对于B,其实是新的,因而:B收到后,立即响应消息(用相同的ID),并同时做数据更新. 若是上述的第(2)种情况(即:B实际上已更新过了数据了),则A的重发的命令,对于B,就是一个真正的重发的命令了,B如何才能知道:A的这个命令是一个重发的命令?消息ID!由于假设消息ID是递增的,因此:B只要记隹最新更新数据成功的那个最大的消息ID就行了.当A的消息ID<这个已成功的最大消息ID时,B就认为这是一个重复的消息(即:B立即知道这是它的响应A没有收到而重发的),因此:此时B不能再更新数据(再更新就不对了),只是重发响应消息就行了.B要处理的麻烦事是:收到A的命令,且已响应了,而且响应的消息A也已收到了,但就是它自己的数据库更新数据时,老是出错!这时尽管消息处理上同步了,但实际数据上仍不是一致的.
当然要设置retry的次数和timeout时间。