私は1人のスーパーバイザーと数人のワーカーでアプリケーションを開発しています。これらのワーカーはそれぞれ、tcpソケットを開き、リッスンを実行してから接続を受け入れ、クライアントが到着すると各クライアントのプロセスを生成します(これらを監視してもかまいません)。
アプリケーション構成でリスニングアドレスを構成できるようにしたいので、必要な数のアドレスをリッスンできます(少なくとも1つのアドレスが必要ですが、任意の数を指定できます)。各アドレスは、IP(またはホスト名)とポートアドレスです。これまでのところ、新しいことは何もありません。
私の質問は、未知の数の労働者をどのように宣言し、開始し、監督するかについてです。私の解決策は、次のように、スーパーバイザーコードでinit / 1関数の結果を(実行時に)動的に生成することでした。
-define(
CHILD(Name, Args),
{Name, {
?MODULE, start_listen, Args
}, permanent, 5000, worker, [?MODULE]
}
).
init([]) ->
{ok, Addresses} = application:get_env(listen),
Children = lists:map(
fun(Address) ->
{X1,X2,X3} = os:timestamp(),
ChildName = string:join([
"Listener-",
integer_to_list(X1),
integer_to_list(X2),
integer_to_list(X3)
], ""),
?CHILD(ChildName, [Address])
end,
Addresses
),
{ok, { {one_for_one, 5, 10}, Children }}.
これにより、各ワーカーの名前を動的に生成し、ワーカー定義も生成できます。それで:
この解決策は受け入れられますか?それほどエレガントではないように思えます。この種のユースケースの標準的な解決策(またはベストプラクティスなど)はありますか?
スーパーバイザーにワーカーを動的に追加できる「simple_one_for_one」戦略について知っています。しかし、ワーカーの名前を動的に生成するためにも使用できますか?「one_for_one」を使用する独自のソリューションの代わりに「simple_one_for_one」を使用する方が(とにかく)良いですか?(繰り返しますが、この特定の状況では)。
よろしくお願いします。長い投稿でごめんなさい!:)