在这种情况下,最好的重试策略是什么:
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 | |
| |--------------------------------------------------| |
| |