2017-12-01 17 views
1

websocketフィードのイベントを消費するアプリがあります。 Registry.dispatch/3を呼び出して、購​​読しているgenserversにメッセージを送信し、genserversはそれをコンソールに出力します。パイプライン処理は、Genstageによって処理されます。プロデューサはソケットに着座し、受信コールでイベントを生成します。状態が特定の方法で影響を受ける場合、コンシューマーは状態を管理し、レジストリ内のプロセスにイベントをディスパッチします。レジストリに登録されたプロセスは、handle_info/2経由でメッセージを受信したときにイベントを記録します。誰もRegistry.dispatchを持っていただけで、イベントのディスパッチをランダムに停止しましたか?

アプリを約20分間実行した後、イベントは何も起こらずにコンソールに記録されなくなります。コンソールでは、レジストリプロセスを見て、そのキーに関連付けられたレジストリがないため、プロセスの登録が解除されているのを確認しましたが、エラーはスローされず、何も起こりませんでした。また、私はまだイベントを取得していたので、ユーザーはまだイベントを消費していたので、レジストリのディスパッチポイントを突破しました。 websocket接続が閉じず、イベントがまだ読み込まれていることを確認できます。

これは複製可能な問題です。イベントは、各実行でほぼ同じ遅延の後に印刷されるのを止めます。これは難解です。そうすればどこかの種類のリークがあると思うかもしれませんが、観察者の負荷グラフはすべてが上手であることを示しているようです。

免責事項:私はエリクサーの初心者であり、わかりやすい何かを見逃しているかもしれませんが、私の知識の範囲外です。

答えて

0

パイプライン処理はGenStageで処理されます。

これはほとんどがGenStage要求のデッドロックのようです。 コンシューマがデマンドを送信し、プロデューサhandle_demandからイベントの空のリストを返すと、コンシューマはデマンドの送信を停止します

これはdone on purposeあり、それは、要求された需要を収集し、その後それを提供するためにプロデューサーの義務です。

+0

ねえ。つまり、GenStageのコンシューマは実際には2つのことを行います。つまり、etsテーブルに書き込み、Registry.dispatchを通じてイベントを送出します。 etsテーブルがまだ書き込まれているのがわかりますが、レジストリに登録されているプロセスはディスパッチイベントを受け取っていません。だから私はそれがGenStageの問題だとは思わないのです。 –

関連する問題