持久网络通信困境



假设我们有一家银行和一台自动取款机。他们通过网络通信,这可能会失败。是否有可能创建一个场景,其中它们之间的通信是100%持久的。在这种情况下,它的意思是:

client withdrawn physical amount of money
<=>
account balance updated accordingly

让我们检查几个场景:

  • ATM发送请求,银行发送确认。确认书丢失,银行更新了账户,客户还没拿到钱。
  • (如果银行等待ATM确认更新余额)ATM发送请求,银行发送确认,ATM返回接收。Ack迷路了。自动柜员机可以发钱,但是银行从来没有更新过账户。

所以我永远无法创造出一个解决方案,让失败的网络不会阻止双方的金钱损失。

请建议。

事实上,如果我没有误解你的问题,你可能在说Long Wait algorithm

在您的第一步—我建议您等待,直到确认没有收到(确认)的ATM或反之亦然。这是这种情况下唯一可行的解决方案。在本例中,您设置了一个最小的固定时限,在此之后,如果没有收到确认,您将以n时间单位(ATM检查银行确认的最小时间单位)的每一个固定间隔再次向银行请求相同的确认。如果它反复失败,这意味着代码或概念有问题。

另外,一定要利用Redo Log Buffer的概念,因为这是存储和更新银行余额的最佳选择!!不要只保留一份,而是保留两份或三份账户信息,并在临时副本和only update the final account info in redo log once the acknowledgement from the ATM is received to the bank or the vice-versa中进行更改!注意在重做日志中更新值之前收到确认!

最新更新