何千ものプロセスを含む erlang アプリケーションがあるとします。タプル、リスト、または任意の erlang 用語である単一のリソース X があり、これらすべてのプロセスがいつでもそこから何かを読み取り/選択する必要があるとします。
このような状況の例としては、クライアント プロセスがリモート マシンで読み書きする必要がある API システムなどがあります。読み取り/書き込み要求ごとに、新しい接続を作成したくない場合があります。したがって、接続のプールを作成し、それらを開いているパイプ/ソケット/チャネルのプールと見なします。
現在、このリソースのプールは、読み取りまたは書き込みの要求ごとに、そのプロセスが利用可能な開いているチャネル/リソースを取得するように、何千ものプロセスによって共有されます。
質問は、プロセス (単一のプロセス) がこの情報をプロセス ディクショナリまたは受信ループに保持している場合はどうなるかということです。これは、空きリソースが必要になるたびに、すべてのプロセスがこのプロセスにメッセージを送信する必要があることを意味します。この単一のリソースに対する需要が高いため、この単一のプロセスは常に巨大なメールボックスを持つことになります。
または、ETS テーブルを使用して、行を 1 つだけにすることもできます#resources{key=pool,value= List_of_openSockets_or_channels}
。しかし、これは、すべてのプロセスが (高い確率で) 同じ瞬間に ETS テーブルから同じ行を読み取ろうとすることを意味します。
10,000 のプロセスが同じ行/レコードに対して同時に/ほぼ同時に読み取りを試行した場合、ETS テーブルはどのように処理しますか? それでも、プロセスを使用する場合、そのメールボックスは、10,000 のプロセスが同時に同じリソースに対してメッセージを送信する場合 (各リクエスターに返信する必要があります)。そして、このアクションは非常に頻繁に発生する可能性があることを覚えておいてください. プロセスが必要なものをより速く取得できるように、どのオプション(プロセスが何とかダウンするという可用性の問題を無視する)は、より高いスループットを提供しますか?
Erlang VM で需要の高いデータ構造を処理して、数百万のプロセスに非常に高速にアクセスできるようにする、他に良い方法はありますか?