erlangでチャットサーバーを開発しようとしていますが、プロセスのグループ間でメッセージをブロードキャストしたいのですが、3つの選択肢があります。
- グループの残りの部分にメッセージを送信するマスタープロセスにすべてのメッセージを送信します。これは私にとってボトルネックのように見えます!。
- グループのすべてのpidを含むグローバルetsテーブルを使用します(過度のコピー)。
- updマルチキャストを使用します。
- 1と同じpgモジュール。
最善のアプローチは何ですか、他の選択肢はありますか?
より自然な方法は、各プロセスに、通信する他の各プロセスのpid()を認識させることです。[pid()]をプロセス状態に保ち、link / 1を使用して最新の状態に保ち、プロセスが停止したときに{'EXIT'、Pid、Reason}を受信します。
Erlangでのマルチキャスティングは、各受信者へのユニキャストです。それ以外の情報を放送する方法はありません。プロセスの数が少ないので、コピーに問題はないと思います。少なくとも、それがシステムのボトルネックになるまでは、あまり心配する必要はありません。
グループのマルチキャストとして機能するプロセスを過小評価しないでください。これは単純な解決策かもしれませんが、pid()をETSテーブルに保持するかgproc
、それを使用するだけでも大雑把に同じかもしれません。
過度のコピーを心配することは、おそらく最初は実を結ぶことはないでしょう。ここでの秘訣は、メッセージを大きなバイナリとして保存してから送信することです。次に、Marceloが書いているように、参照を渡すことしかできません。
リンクに関するVanceShipleyによる解決策は、私が避けたいものです。リンクは双方向であり、出口メッセージを取得するには出口をトラップする必要があります。呼び出しを介して生涯の知識を維持する方がおそらく良いでしょうerlang:monitor(process, Pid)
。終了するプロセスはグループから削除する必要があるため、これを行う必要があります。フォームのメッセージを受信する{'DOWN', ..., ...}
ことは、クリーンアップの世話をする必要があるサインになります。