複数のユーザー間のタスクリストを管理するWebアプリケーションを作成するために取り組んでいるプロジェクトがあります。これは、承認されたユーザーがタスクアイテムを配布するマスタータスクリストです。各ユーザーは自分のアカウントを持ち、ログインして割り当てられたタスクを表示します。複数のユーザーが1つのタスクに共通する可能性があります。
以下の状況に対処する方法の全体的な概念に取り組んでいるため、プロジェクトの詳細はこれから省くようにしていますが、それが役立つ場合は、RequestFactoryを実装したJava、EclipseLink、およびGWTを使用しています。データベースはPostgreSQLです。
だから私が和解しようとしている概念的な問題は次のとおりです:
複数のユーザーに共通する単一のタスクが何らかの方法で変更された場合。タスクの完了、削除など、このタスクを持つすべてのユーザーのタスクリストが更新されます。この機能の実装を支援する設計パターンはありますか?
2人のユーザーが同じタスクを同時に変更するとします。
最初に、そのような状況が発生することを許可する必要がありますか、それとも、1人または他の人が変更を行うまでロックをかける必要がありますか?
次に、ロックをかけない場合、どの変更を受け入れるかを調整するにはどうすればよいですか?これは、ユーザー1がデータを送信でき、ユーザー2が更新されたデータを受信する前に、先に進んで変更を送信した可能性があるため、1の状況が関係しています。
このWebアプリの複数のインスタンス間でデータを正しく同期する方法について提供できるガイドポイント、アドバイス、またはヒントを本当に探しています。よろしくお願いします!
私は ホワイトボード が#1の選択パターンになると思います。タスク(または他の共有データ)への変更を共通の場所に投稿して、すべての関係者がそれらとDTRTを見ることができるようにする必要があります。
#2の場合、 楽観的ロック を確認する必要があります。基本的に、編集可能なすべてのレコードに最終更新時刻のタイムスタンプを付ける必要があります。レコードを保存しようとするとき、最初に、データベース内のレコードの最終更新タイムスタンプがレコードと同じであることを確認します。そうでない場合は、誰かがレコードを更新したので、更新されたレコードを取得して、変更を再度入力する必要があることをユーザーに通知するか、ユーザーの変更を更新されたレコードにマージしようとすることができます(通常、単純か不可能か)。
役立つ可能性のある同様の要件を持つデスクトップアプリケーション(まだ完全にテストされていない)のデザインを思いつきました。
私の解決策は、 [〜#〜] mvc [〜#〜] パターン(単一のモデルで複数のコントローラーとビューを使用)を使用することでした。 [〜#〜] stm [〜#〜] )およびトランザクションがコミットされると、モデルは更新通知をビューにブロードキャストしました。
各クライアントは、ローカルで更新されたものもすべて追跡していましたが、それらのローカル更新が完了すると(つまり、コミットするために送信されると)、基になるモデルの情報を使用するように戻りました。
また、元に戻すことができるように、ユーザーが行ったすべての変更を元に戻すスタックも用意しました。
ただし、モデルは変更をビューにブロードキャストする必要があり、Webクライアントでは最も簡単な方法ではないため、これはWebアプリに最適なモデルではない可能性があります。
1.の場合、 publish/subscribe パターンの方が適しているかどうかを確認する必要があります。
2.の場合、状況によって異なります。
競合が発生した場合は、決してロックして報告しないことをお勧めします。
見てください:
https://github.com/spring-projects/spring-petclinic/issues/4
ビデオとサンプルコードを見ることができます。
それはあなたの要件を満たしますか?