私は一般的にactive-mode
では、単一のTCPリソースと対話するため、このパターンを使用します。1 GenServerからアクティブモードで複数のTCP接続の管理
def connect(ip, port) do
t = System.system_time(1000)
case :gen_tcp.connect(ip, port, [:binary, active: :once, keepalive: true, nodelay: true]) do
{:ok, socket} ->
log "Connected to #{ip}:#{port} in #{System.system_time(1000) - t}ms"
socket
{:error, err} ->
log "Connect Error - #{ip}: #{port} [#{inspect err}]"
Process.send_after(self(), :retry_connect, 3000)
nil
end
end
def handle_info({:tcp, _, data}, s) do
s = proc_raw(s.extra <> data, %{s | extra: ""})
:inet.setopts(s.socket, active: :once)
{:noreply, s}
end
これは中
複数 TCP接続を処理するために拡張することができますどのように
同じGenServer
?
は、これまでのところ、これはactive-mode
更新
各GenServerが監督の下で管理されている中で、単一のTCPソケットのために素晴らしい作品。また、各GenServerは1つのクライアントを表し、各クライアントはいくつかの外部リソースに対して3〜5のTCP接続を持つことがあります。 TCPコネクションの
失敗/リセットは再接続がそれぞれの障害に試され、随時予想されますが、ホストGenServerは、私はあなたがGenServerではなくSupervisorを使用することをお勧めしたい
接続ごとに1つのプロセスが必要なのはなぜですか?個々の接続が終了する可能性があり、他の接続に影響を与えるべきではないため、接続を分離することは理にかなっています。 –
各GenServerは単一のクライアントインスタンス用です。各クライアントインスタンスは、同じTCPリソースへの最大5つのtcp接続を管理します。 –
@MartinSvalinクローズまたは失敗したTCP接続が管理され再開されます。プロセスが予期された動作であるためクラッシュしません。 –