まず第一に、信頼できないリンクでは何も保証できません。二人の将軍の問題は、決定論的プロトコルと非決定論的プロトコルの両方についてこれを証明しています。あなたにできることは、信頼性の低さを許容できる程度に軽減することだけです。
あなたの場合、最も簡単な方法は、サーバーがポーリング要求を受信するx
と、すべて同じGUID
. 例えば。
S: B, anything new?
S: B, anything new?
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
...
S
は注文でスパムされる可能性がありますが、すべてのリクエストで # が送信されるため、大したことではありません。以前に見逃していた場合は、今取得しています。前にそれを取得できなかった場合は、ウーフー! 私たちは今それを持っています。システムは動作します!B
私の例では、 がメッセージを送信する5
回数に気付くでしょう。現実的なシナリオでは、必要な信頼性が得られるまで、おそらく何百回または何千回もメッセージを送信することになります。
上記のソリューションは処理と帯域幅を集中的に使用しますが、機能します。より巧妙な方法は、TCP と同じことを行うことです。つまり、スリーウェイ ハンドシェイクを行います。
S: Hello B. Are you there? -> SYN
B: Hello S, yep I'm here. What's up? -> SYN+ACK
S: Oh good, you're there. -> ACK
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
しかし.. HTTPはすでにこれを行っています。そのため、何かがどこかに届かない場合は、わかります。接続タイムアウト、接続切断など。
ここで、これらのシナリオをアプリケーション レベル (WS-ReliableMessaging に入る) 内で書き直すことができますが、実際には TCP は既に信頼性があります。これらの SOAP(っぽい) フレームワークと偽のプロトコル (通常は HTTP の上で動作します) に対する一部の批評家は、それらが本質的に車輪 (および車輪の問題) をより高いレベルの抽象化で再発明していると非難します。
肝心なのは、信頼できるメッセージング システムを含め、どのシステムも失敗する可能性があるということです。
結果整合性に関する限り、混乱する可能性があると思います。結果整合性は、分散ストレージ システムにのみ適用されます。分散ストレージ システムでは、 の後、しばらくの間Write()
で確定的に取得できない場合がありますRead()
。これはあなたの問題のようには見えません。おっしゃることはわかりますが、eventually consistent
システムでは、ノード間に信頼できる (十分な) 接続が想定されています。あなたはその仮定をしません(私はそうすべきだと思いますが.. TCPはかなり信頼できます)。