【发布时间】:2017-08-02 07:07:29
【问题描述】:
在这种情况下最好的重试策略是什么:
Database 成功创建数据条目,但是响应需要很长时间才能到达Application。所以为了完成这项工作,Application 重试创建,当然Database 返回一个“已经存在”错误。所以最后从Application的角度来看,好像是创建失败了,其实是成功了。更糟糕的是,如果这是在一系列步骤的中间,那么Application 将无法决定是否触发前面步骤的回滚。
增加Application 的超时长度不是一个可接受的解决方案,因为 IP 网络永远不可能 100% 可靠,而且响应在网络中丢失的可能性总是很小。
在创建之前添加<data> 的存在性检查可以工作。但这只是在考虑并发性的情况下。在我的情况下,Database 可以有多个客户,我不确定竞争条件的可能性。
+-------------+ +-----------+
| Application | | Database |
+-------------+ +-----------+
| |
| CREATE <data> |
|--------------------------------------------------------->|
| |
| | creating
| |---------
| | |
| |<--------
| -------------------------------\ |
|-| timeout waiting for response | |
| |------------------------------| |
| |
| SUCCESS |
|<---------------------------------------------------------|
| -----------------------------------------------\ |
|-| response from a timed out session is ignored | |
| |----------------------------------------------| |
| |
| retry CREATE <data> |
|--------------------------------------------------------->|
| |
| ERROR: <data> ALREADY EXISTS |
|<---------------------------------------------------------|
| ---------------------------------------------------\ |
|-| no idea whether the creation actually took place | |
| |--------------------------------------------------| |
| |
【问题讨论】:
-
您的应用程序没有收到“网络连接超时”错误吗?
-
@NevilleK 是的。这就是触发重试的原因。
标签: database algorithm ldap data-consistency retrypolicy