我通常使用这种模式对于具有单个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连接将被管理并重新启动,它不应该使进程崩溃,因为它是预期的状态 –