0

tty の stdout と stderr を RabbitMQ にストリーミングしています (正確にはログ)。これらのログは Web サイトで表示でき、コンテンツが RabbitMQ にストリーミングされる間、Web サーバーによって消費され、WebSocket を使用してクライアントに転送されます。ログは、RabbitMQ に送信されるとすぐに永続化されます。

ユーザーが Web サイトにアクセスすると、永続化されたログがレンダリングされ、連続した部分が WebSocket を使用してストリーミングされます。問題は、永続化されたログに、サイトのレンダリングと WebSocket 経由の最初のチャンクの受信の間に発生したログのチャンクが欠落している可能性があるため、競合状態が発生することです。

私の考えは、すべてのチャンクをキューに保持し、接続後にそれらを WebSocket 経由で送信することでした。さらに、ワーカーを追加して、ある種の「終了」イベントをリッスンし、キュー内のすべてを一度に保持します。

問題は、RabbitMQ を使用してこれが可能かどうか、またはその方法がわからないことです。アイデアやその他の解決策はありますか?

特に問題はないと思いますが、私のスタックは Ruby Sinatra と Bunny RabbitMQ クライアントを使用しています。

4

1 に答える 1

0

中断したところから再開するというあなたの一般的な考えには同意しますが、最初のページを読み込んだ後、あなたがやろうとしていることは、RabbitMQ から行うべきことではありません。

以前のブログ記事で概説したように、これが引き起こす潜在的な問題はたくさんあります。

RMQ を使用してこれを行う代わりに、データベース層からこれを行います。

物事をデータベースにプッシュすると、ID が得られます。できれば連続した ID です。そうでない場合は、エントリにシーケンスを追加します。

ユーザーのページをロードするときに、ユーザーがいる現在の ID をブラウザーに送信します。

ページの読み込みが完了し、websocket 接続を設定したら、websocket を介してメッセージのリストでユーザーの現在の場所を送信します。次に、Websocket接続はそのIDを使用して、「このIDの後にすべてのメッセージを渡して、それらのストリーミングを開始してください」と言うことができます

繰り返しますが、これは RabbitMQ 経由ではなく (これが悪い考えである理由については私の記事を参照してください)、データベースとシーケンシャル ID 経由で行われます。

于 2015-10-26T14:26:54.057 に答える