1

メッセージをワーカー プロセスに送信するデータ ソース プロセスがあります。メモリの消費を抑えるには、メールボックスからのメッセージの取得が遅いワーカーを終了する必要があります。

私はErlangを初めて使用します。ポインタをいただければ幸いです。これが Erlang メッセージで実現するのが難しい場合、ソケットを使用できますか? もしそうなら、例はありますか?

編集:

Web から読み取り、大量のデータを生成するプロセスを登録しています。これらのデータは、Erlang メッセージを使用してすべての「サブスクライブ」プロセスに送信されます。特定のデータごとに、すべてのサブスクライバーに同じメッセージを送信します。

登録されたプロセスが読み取るデータをストリーミングする Web サーバーもあります。したがって、http クライアントが接続すると、Web サーバーはプロセスを作成し、このプロセスは登録されたプロセスにサブスクライブして、そのメッセージの受信を開始します。

登録されたプロセスは、モニターを使用してサブスクライバーを監視します。サブスクライバーは Web サーバーによって制御され、接続が閉じられると、この接続を提供していたプロセスが終了します。

受信確認はありません。つまり、サブスクライバは、メッセージが送信されたときに応答しません。このようにプログラムすることはできますが、トラフィックが多すぎると思います。

基本的に、http クライアントが遅すぎる場合は接続を閉じたいと考えています。

4

3 に答える 3

3

etsを使用して、登録されたプロセスによって読み取られているデータを保存し、キーのみをサブスクライバー プロセスに送信することをお勧めします。すべてのサブスクライバーは、いつでも ets テーブルから読み取ることができるようになりました。このようにして、複数のメッセージの大量のデータがプロセス メッセージ キューに常駐しないため、メモリの消費量が削減されます。

ets テーブルから読み取るときに各プロセスへのデータのコピーがまだ存在していても、サブスクライバーによって処理されているメッセージのみがコピーされます。

メッセージ参照をサブスクライバー プロセス状態に保持し、保留中のメッセージの数に基づいて、サブスクライバーの動作が遅い (遅い HTTP クライアント) かどうかを判断し、接続を削除することができます。

これで、登録されたプロセス (または、確認応答を蓄積してキューからメッセージを削除することをジョブとする他のプロセス) に確認応答を送信して、ets からメッセージを削除できるようになりました (ets はガベージ コレクションではないため、削除する必要があります)。エッツから)。

于 2013-09-21T07:08:16.813 に答える