我通常使用這種模式對於具有單個TCP資源進行交互,在active-mode
:從一個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代表一個客戶端,每個客戶端可能有3-5個到某些外部資源的TCP連接。 TCP連接的
故障/復位預計不時,重新連接試圖在每個故障,但主機GenServer不需要重新啓動
爲什麼你不想每個連接一個進程?隔離連接是有意義的,因爲單個連接可能會關閉,並且不應該影響其他連接。 –
每個GenServer用於單個客戶端實例。每個客戶端實例管理多達5個TCP連接到相同的TCP資源 –
@MartinSvalin關閉或失敗的TCP連接將被管理並重新啓動,它不應該使進程崩潰,因爲它是預期的狀態 –