私は、典型的なバックエンドコンポーネントとフロントエンドコンポーネントを持つアプリケーションのアーキテクチャを設計しています。フロントエンドアプリケーションは準リアルタイムである必要があります。この要件では、バックエンドがキューにメッセージをプッシュし、フロントエンドがそのキューを消費しています。ほとんどの場合、これにはRabbitMQを使用します。説明させてください。
ユーザーがフロントエンドアプリケーションにログインすると、バックエンドでセッションが作成されます。このセッションが有効である限り、フロントエンドアプリケーションは動作を許可されます。通常、ログイン後、フロントエンドは最初にREST API(彼のセッションを認証資格情報として)から)からすべてのデータをロードし、その後のすべての更新はメッセージキューを介して受信されます。
現在の設計では、各フロントエンドセッションに独自のキューがあります。そのため、バックエンドで何かが変更されるたびに、関連するすべてのセッションキューにメッセージが送信されます。言ったように、フロントエンドはこのキューを消費しています。
問題は、フロントエンドがキューから切断されている場合です。たとえば、ユーザーが勤務時間の終わりにラップトップを休止状態にしたとき。それ以降、メッセージが蓄積され始めます。実際の問題は、キューに重複したメッセージが入力されることです。クライアントがキューから切断されている時間が長いほど、この問題は大きくなります。
小さな付記、duplicate messages
付き実際はsemantically identical messages
を意味します。たとえば、証券取引所のアプリケーションを見てみましょう。 2つのprice of stock xyz has been changed
メッセージは、意味的に同一です。それらは異なるイベント/トランザクションからのものですが、同じ変更を定義します。そのため、以前のメッセージは新しいメッセージによって古くなっています。詳細についてはコメントを参照してください。
これを解決するためのアーキテクチャを探しています。私の考えを振り返ってみましょう:
session queue
の代わりに、session exchange
を作成することもできます。ログイン後、専用の自動削除専用キューが作成され、その交換にバインドされます。切断/タイムアウト後、このキューはブローカーによって削除されます。次に、フロントエンドアプリケーションが戻ってくると、新しいキューが作成されます。つまり、フロントエンドアプリケーションは空のキューで戻ります。
したがって、これをバックエンドで解決することは理にかなっています。つまり、セッションキューでメッセージが重複しないようにする方法が必要です。特定のメッセージがすでにキューにある場合、同じメッセージを再度キューに入れることはありません。
私の質問はこれに要約されます:切断後にクライアントを最新の状態にするにはどうすればよいですか?
どんなアイデアや洞察も大歓迎です。
ここにキューの値が表示されるかどうかはわかりませんが、直接双方向通信の方が優れており、現在の問題を解決します。ユーザーがコンピューターを休止状態から復帰したとき、ページを完全に更新して双方向通信をトリガーする必要がありますコミュニケーション。
Webアプリケーションを使用している場合は、STOMP/Webソケットを探します。そうでない場合でも、STOMPとWebソケットを使用できますが、単純なTCP接続で作業を行うこともできます。
これらは非常に信頼できるライブラリを提供していることに注意してくださいTCP自動再接続を使用した接続など、ネットワークの問題を処理するために、再度コーディングする方法はありません。そのようなことは本当に苦痛です適切に開発およびテストします。
その他の方法: