質問

このづ メッセージの送り方と企業.場合はどうしたらよろしいですか当S(upplier)投票受注から当社(B)簡単なHTTPに基づく方法が最善なのかの実装です。

  • そしてB社は、ウェブサーバのバックエンドデータベースのウェブサーバーは耐久性。また、わずかな可能性を考える貯蔵プロセス"Sびていくことができれば、い状態(例えばの一覧を既に伝わる特別な技術を必要)
  • インターネット接続の間でB S"は大きなばらつきを持っています。
  • しについての質問を行ってい 最終的な整合性 意味の導入時の注文はすべての間でB S"は移譲されることとなっている。

うにベストプラクティスをこのシステムを実施するために?

役に立ちましたか?

解決

この種の問題への一つのアプローチは、私はすぐにMQを考えるIBMの人物として、製品をキューイングのいくつかの種類を使用することです。しかし、私はあなたのように私はおそらくあなたが取っているサービスベースのアプローチと幸せになる。

、実際に自分自身MQ人じゃないと

頭に浮かぶ2つの可能なアプローチがあります。一つは、Webサービスへの信頼性の問題を押し下げ WS信頼できるメッセージングを、使用することですインフラ。他はあなたに簡単なの上に独自の信頼性の高いプロトコルが、信頼できない、サービスを手でクランクです。

私はWS信頼できるメッセージングを使用してシステムを実装するの深刻な実践的な経験を持っていませんでした、私はそれが仕事にすることができると信じていますが、それは、参加者のコントロールのいくつかの学位を必要としません - それは比較的最近の標準我々はだとしてすべてのITが手に実装する必要があります買い物を与えられた、とベンダー間の相互運用性が問題になることを保証することはできません。各端のSWスタックの上に私が持っているより多くの制御をより私が使用することになり傾い信頼性のあるメッセージングのWS。 [私もrealiableサービスを構築するために使用することができ、あまりにもWSアトミックトランザクションを言及する必要があり、同じインターオペ懸念が適用されます。

それでは、ロール自分で自分のでしょうか?ここで重要なのは、すべてのサービスの冪等を行うことです。我々は2つのシステムをまたがるトランザクションの保証を持っていないとして、我々は、任意のサービスコールが未知の結果で失敗することがありことを前提としていなければなりません。

私は、したがって、我々は注文が転送されたときにBとSの両方で情報を更新する必要があり、BはSが注文を取ったことの確認を持って望んでいると仮定するつもりです。

Bは、このようなサービスを提供する必要があります:

 Give me the next order(s)

 I have stored {orders ...}

それでは、どのように、私たちは「次へ」を定義します。私たちが扱っているボリュームが、私たちは、転送のシングル「スレッド」を持たせることができれば、最も簡単な場合にはうまく動作します。その後、Bは、一度に送信された注文ワンオフカチカチされ、注文が単調増加IDを有しています。私たちは、その後に簡素化することができます:

 I have stored order <65,004> please give me the next
これはべき等要求であること

注:それは安全に何回も繰り返すことができます。また、Sは二度同じ順序を得ることの可能性を予測し、重複をチェックしなければならないことに注意します。

他のヒント

あなたはおそらく探していると、フェーズ・コミット2です。これはよく、たとえばここで、インターネットに記述されます:

http://en.wikipedia.org/wiki/Two-phase_commit_protocolする

その要旨ます:

次のように進むコミット

* Phase 1
      o Each participating resource manager coordinates local 
        operations and forces all log records out:
      o If successful, respond "OK"
      o If unsuccessful, either allow a time-out or respond "OOPS" 
* Phase 2
      o If all participants respond "OK":
            * Coordinator instructs participating resource managers to "COMMIT"
            * Participants complete operation writing the log record
              for the commit 
      o Otherwise:
            * Coordinator instructs participating resource managers to "ROLLBACK"
            * Participants complete their respective local undos 

あらゆる種類のデータのための万一の仕事ます。

さて、最初にすべてのことができますないの保証の信頼性のないリンク上では何も。決定論と非決定的両方のプロトコルのためにこれを証明する 二人の将軍問題。あなたがすることができるすべては、許容できる程度に信頼性の欠如を緩和です。

サーバがポーリング要求を受信すると、最も簡単な方法は、あなたのケースでは、それはすべて同じ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は注文がスパムかも知れませんが、#はリクエストごとに送られているので、それは大したことではありません。我々の前にそれを逃した場合、私たちは今それを取得しています。我々は前にそれを取得していない場合は、woohoo!我々は今それを持っています。システムは動作します!あなたは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の一部の評論家(ISH)フレームワークと擬似的なプロトコルは、(彼らは通常、HTTP上で動作)、本質的に車輪の再発明のそれらを非難より高い抽象レベルでの

ボトムラインは、任意のシステムは、信頼できるメッセージングシステムを含む、失敗することができることである。

限り、結果整合性に関しては、私はあなたが混同されるかもしれないと思います。最終的な一貫性はWrite()後、あなたが確定しばらくRead()でそれを取得することができないかもしれない分散ストレージシステムに適用されます。これは、すべてのあなたの問題のように見えるしていません。私が意味する、私はあなたが言っているかを見るが、eventually consistentシステムでは、信頼性の高い(十分に)接続がノード間で想定されます。あなたは(TCPはかなりくそ信頼性がある..私はあなたがすべきだと思うにもかかわらず)その仮定をすることはありません。

ディナ言及したものを、上の

ビル。ウェブサービスは、上記の問題に対する完璧なソリューションになります。 いくつかのプロトコルは、レコードの数を定義することになるが合意することができます。

S ---> D ( Call a service which would list record keys)
D----> S ( provide xml of keys)
S----> D ( Request each of the records)
D----> S ( Submit record)

同期の後に行われて新たなレコードの場合は、行き先新しいレコードを扱うでしょうソースで展開サービスを呼び出すことができます。

通信は、Webサービスのエンジンを購入扱われるので、

は、あなたがメッセージパラメータを心配する必要はありません。 SSLは、セキュリティのために追加することができます。

乾杯!

私はあなたがB社は、受動的な参加者であることを言おうとしていると思います。 S(供給者)は、単にBの記事(結果整合性)というオーダーのすべてを取得する機能を必要とします。しかし、Bは注文がすでにSかについての必要性やケアは、(コミットは必要)を持っていません。

B社は、半正確なクロックを持っている場合は、イベントの解像度に応じて、単調に増加するGUIDとして日付を使用することができます - あなたはとにかくミリ秒の解像度が必要な場合は投票したくないでしょう。あなたが同期を心配する必要はありませんので、あなただけのBのクロックを使用しています。 Bは、すべての注文を発行した場合、Sはちょうどそれが最後に中断したところからの受注を拾うことができます。

私はあなたが実装しやすいシステムのためのベストプラクティスや最善のトレードオフを意味かはわかりません。ボリュームと応答時間に応じて、あなたがポーリングとにかくされている場合は、動的システムにする必要はありません。 (タイムスタンプによって名付けられた)テキストファイルとしてダンプ受注日付で指定されたディレクトリに、すべてのダウン(または選択的に)それらを引きます。あなたも、理にかなって何時間かによってディレクトリに保存することができます。 HTTP GET冪等である。

これは醜いかもしれないが、それはあなたが会社B. SSLを使用して認証から多くの複雑さを期待していないように聞こえるし、それがロックダウンされ、暗号化されています。

あなたはパフォーマンスを必要としない場合は、シンプルで何も間違っています。あなたは本当に複雑なプロトコルから何を得るのですか?

scroll top