2017-03-29 3 views
0

問題は、単一のユーザーからの複数の同時リクエストをサポートするように設計されていなかったレガシーシステムと統合された最新のWebアプリケーションです。基本的には、レガシーシステムが1人のユーザーから1つずつしか処理できない要求の種類があります。これは、異なるユーザーからの複数の同時リクエストを処理できますが、技術的な理由から、単一のユーザーから複数のリクエストを処理することはできません。このような状況では、ユーザーの最初の要求は正常に完了しますが、最初の要求の実行中に入ってきた同じユーザーからの後続の要求は失敗します。RabbitMQ(または同様のメッセージキューイングシステム)を使用して、ユーザーごとにシングルスレッド要求を行うことはできますか?

私たちのアプリは、マルチタブ/マルチブラウザに対応しているので、複数のアプリがあるという事実だけで、ユーザーがこれらのタイプのリクエストを複数持つことになるかもしれないシナリオがあります。同時にレガシーシステムに送信されます。

私はRabbitMQのようなものがレガシーシステムの前に置かれ、ユーザー/ IPごとのシングルスレッド要求を利用できるかどうかを判断しようとしています。 WebアプリケーションはすべてのリクエストをMQに送信し、ユーザー単位のキューにスタックして、レガシーシステムに一度に1つずつ渡します。

キューが作成する潜在的な数について懸念があるかどうかはわかりません。私たちは約4,000のユーザーベースを持っています。

私はこれをウェブアプリで個別に扱うことができると知っていますが、複数のアプリがあるためロジックが重複しているため、2つの異なるアプリが同時にリクエストを開始する可能性があります。

フィードバックは高く評価されます。ありがとう-

答えて

0

動的に作成する必要があるキューのメッセージをリスンするバックエンドワーカープロセスが必要となるため、ユーザーあたりの一意のキューが機能するかどうかはわかりません。

以下は1つのオプションですが、1つのバックエンドプロセスがすべての要求を順番に処理するため、パフォーマンスのボトルネックの可能性があります。複数のワーカープロセスを使用することもできますが、アプリケーションが特定の一連の操作を必要とする場合、競合状態を引き起こす前に完了したかどうかはわかりません。

(すべてのユーザーからの)すべてのトランザクションを単一のキューに入れ、バックエンドプロセスにそのキューをプルして要求を処理させることができます。要求が処理された後にユーザーに返答する必要がある場合、ワーカー・プロセスは、正しいユーザーに応答日を返すために使用できる相関IDを持つ別のキューに返答する可能性があります。

次流れが発生する場所私はExpressJSのアプリで前にこれをやった:

  1. ユーザー/プロセス/ Ajaxは
  2. Expressはrequestオブジェクトからペイロードを受け取り、それを送信要求を行います一意のcorrelationId(例えばUUID)を持つRabbitMQキュー。
  3. Expressは、その後、バックエンドのワーカープロセスがキューからアイテムを引っ張るcorrelationId
  4. 一方であるキーを持つresponseStoreオブジェクトにresponseオブジェクト格納それを取るいくつかの作業を行い、その後、別の応答にメッセージを送信します同じcorrelationId
  5. 付きキューExpressJSアプリケーションが応答キューへの接続を有し、それはメッセージを受信すると、応答からcorrelationIdを受け取り、responseStore同じcorrelationIdと共に格納responseオブジェクトを探し。それはそれを見つけた場合、それはメッセージからペイロードを受け取り、これを行うには、あなたも一緒にresponseStoreresponseオブジェクトの作成時間を保存する仕組みを持っている必要がありresponse.send(payload)またはresponse.json(payload)

のような何かをしますresponseオブジェクトです。その後、バックエンドプロセスに問題がある場合に備えて、一定のタイムアウト後にresponseStoreをチェックして古い応答オブジェクトをクリーンアップする別のプロセスを実行します。

のRabbitMQとRPC詳細はここを見て:

https://www.rabbitmq.com/tutorials/tutorial-six-javascript.html

・ホープ、このことができます。

関連する問題