ようなシナリオで最高の再試行ポリシーは何です:ベスト再試行ポリシー
Database
は、データエントリを作成することに成功したが、その後、応答がApplication
に達するのに時間がかかりすぎます。したがって、作業を実行するにはApplication
が作成を再試行し、もちろんDatabase
は "already exists"エラーを返します。ですから、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はいそうです。そしてそれが再試行を引き起こすものです。 – Sah