2

非常に大量のメッセージ (レコード) を処理するサーバーを erlang で作成しています。各メッセージには、ユーザー ID のようなタグ (アトム) があります。

そのようなプロセスが存在しない場合、「ルーター」はこのユーザー専用の永続的なプロセスを生成します (メッセージを保存して渡す前に数分間メッセージを蓄積するため)。それ以外の場合は、既存のプロセス メールボックスにメッセージとして渡します。

問題はルーティング テーブルの簿記です。

ルーターをシリアル化することを考えることができます。各メッセージは、userId によって PID を見つけるための ETS ルックアップになり、終了しなかった場合は最終的に Spawn と ETS が挿入されます。しかし、それは数秒で混雑しました。

別の方法として、プロセスを直接生成して各メッセージをルーティングすることもできますが、1 人のユーザーへのいくつかのメッセージが連続して受信され、ETS で対応する PID が見つからず、永続的なプロセスが生成された場合、競合状態が発生する可能性があります。メッセージは失われ、最後に生成されたプロセスのみが有効になり (ETS で他のプロセスを上書きします)、他のプロセスはアイドル状態になり、追跡されなくなります。

また、私はすべて間違って考えているかもしれません。このシナリオを処理するより良い方法はありますか?

4

2 に答える 2

1

あなたの最初の解決策は、この場合に適しています。私にとっては、大量のメッセージがある場合に、受信するすべてのメッセージに対してプロセスを開始するのは正しくないように思えます。ETS は高速で、大量のデータを処理できるはずです。

erlang OTP の使用を検討することをお勧めしgen_serverます。詳細については、こちらこちら、およびこちらをご覧ください。

さらに、多くのプロセスから ETS にアクセスする場合は、{read_concurrency, true}および{read_concurrency, true}オプションを検討することをお勧めします。詳細については、こちらこちらをご覧ください。

于 2016-07-12T08:11:14.077 に答える