2017-02-10 25 views
1

クライアントに状態の変更を送信するSOAPサーバーを開発中です。サーバーは他のシステムと通信して内部状態を更新します。古い状態と新しい状態の違い

私は、更新後の状態の変化を追跡できる解決策(パターンなど)を探しています。私はmemento patternを見ましたが、以前の状態は必要ないので、私が探しているものではありませんが、に変更されています。私は単に変更をクライアントに伝えることはできません。その理由は、プルアーキテクチャ(クライアントが変更をポーリングするため)です。

ユースケース

サーバ状態は3つの要素を持つオブジェクトのlistであり、更新は、新しい要素を追加して修正すると仮定する。クライアントは新しく追加された要素とではなく、の要素を4つ持つリストを受け取る必要があります。

+0

これは、http://softwareengineering.stackexchange.com/ –

+0

の方がよいかもしれません。クライアントが変更をポーリングするシステムで、サーバーがクライアントに更新を送信するようにしたいとします。それは矛盾している。クライアントがプルしているのか、サーバーがプッシュしているのかを再考する必要があります。探しているのは、サーバーが情報をプッシュすることと一貫性があります。 – Peter

+0

また、Webサービスを作成する場合は、ステートレスで冪等にするよう努力する必要があります。私はこれを行うための1つの方法は、たとえば、アップデートを列挙し、その番号を各アップデートに付けることです(これはあなたのユースケースでは意味があるかどうかわかりません)。 –

答えて

0

変更を実行する必要があるたびに生成される一連のシリアル化可能なコマンドを定義することができます(詳細はコマンド設計パターンを参照してください)。
これらのコマンドをローカルで実行して、モデルに変更を適用し、それらのコマンドをキュー内でシリアル化することができます。クライアントがそれらをプルすると、同じコマンドをそのローカルモデルに再適用して、サーバ側で達成したのと同じ結果を得ることができます。
どういうわけか、サーバーは適用される変更に関してクライアントとまったく同じように動作しますが、違いはがすぐにをプルします。

ユースケースを考慮すると、コマンドはリスト内の挿入として定義し、必要なすべてのパラメータと共に作成することができます。リストのオブジェクトの削除や更新に簡単に拡張することができます。

+0

あなたの答えは正しいと思います。もう1つの明確化:各クライアントのコマンドリストを保持する必要があるので、各送信後にリストを空にするにはどうすればよいですか?また、クライアントごとに更新された状態のコピーを保持する必要がありますか? –

+0

@MarcoStramezzi各クライアントのリストを作成する場合は、各読み取り後にリストをクリアしてください。正解は主に実際の問題に依存しますが、あなたにとって何が最善であるかを言うのは難しいです。 – skypjack

関連する問題