Re: [zeromq-dev] Detecting abandoned clients (ie, half closed sockets)
Thanks Justin, I'll look into that. -chuck On Tue, Jul 25, 2017 at 8:48 AM Justin Karneges wrote: > Hi Chuck, > > libzmq doesn't allow setting an activity timeout as far as I know, so the > nearest way to solve this is with TCP keep alives. You can configure them > using zmq_setsockopt and the ZMQ_TCP_KEEPALIVE* options. With TCP keep > alives turned on, the TCP subsystem will close the socket if it doesn't > receive special keep alive packets from the client after awhile. This > ensures libzmq will always properly clean up the socket. If you're using > PULL or SUB sockets this is essential. > > One issue to be aware is that TCP keep alives allegedly may not be > supported by some mobile devices/networks. I've never done any > investigation myself about this, it's just something I've heard. However, I > don't think this actually matters too much. If the server is unable to > receive keep alives from a client, then it'll just always timeout the > client after awhile, forcing the client to reconnect. You could set a long > keep alive timeout so this doesn't happen very often (which is already > standard practice, the default on Linux is something like 4 hours). > > Hope that helps. > > Justin > > On Tue, Jul 25, 2017, at 06:35 AM, Chuck Price wrote: > > I have a service processing periodic messages (periodic could be every 1 > to 10 seconds or so per client) from mobile clients connecting over > intermittent LTE connections. The server is using a PULL socket. It is > written in Go, using goczmq. > > The communication is one way, no reply is ever sent to the client. There > can be many clients per server. The connection is encrypted. > > The server only cares about the latest messages from the client. If the > LTE connection drops, the client does not queue messages, but instead just > eats the error and waits for connectivity to resume. > > On the server side, the result appears to be a socket (file descriptor) > leak. When the client reconnects, the server side doesn't notice that the > old connection is defunct, and doesn't have any way to destroy the socket. > The server is running on Linux (Debian). > > Is there a way to track when a client connects to a PULL socket and record > the socket? With some sort of hook like that, I could attach a timer and > garbage collect abandoned sockets. > > Thanks, > > -chuck > > *___* > zeromq-dev mailing list > zeromq-dev@lists.zeromq.org > https://lists.zeromq.org/mailman/listinfo/zeromq-dev > > > ___ > zeromq-dev mailing list > zeromq-dev@lists.zeromq.org > https://lists.zeromq.org/mailman/listinfo/zeromq-dev ___ zeromq-dev mailing list zeromq-dev@lists.zeromq.org https://lists.zeromq.org/mailman/listinfo/zeromq-dev
Re: [zeromq-dev] Detecting abandoned clients (ie, half closed sockets)
Hi Chuck, libzmq doesn't allow setting an activity timeout as far as I know, so the nearest way to solve this is with TCP keep alives. You can configure them using zmq_setsockopt and the ZMQ_TCP_KEEPALIVE* options. With TCP keep alives turned on, the TCP subsystem will close the socket if it doesn't receive special keep alive packets from the client after awhile. This ensures libzmq will always properly clean up the socket. If you're using PULL or SUB sockets this is essential. One issue to be aware is that TCP keep alives allegedly may not be supported by some mobile devices/networks. I've never done any investigation myself about this, it's just something I've heard. However, I don't think this actually matters too much. If the server is unable to receive keep alives from a client, then it'll just always timeout the client after awhile, forcing the client to reconnect. You could set a long keep alive timeout so this doesn't happen very often (which is already standard practice, the default on Linux is something like 4 hours). Hope that helps. Justin On Tue, Jul 25, 2017, at 06:35 AM, Chuck Price wrote: > I have a service processing periodic messages (periodic could be every 1 to > 10 seconds or so per client) from mobile clients connecting over intermittent > LTE connections. The server is using a PULL socket. It is written in Go, > using goczmq. > > The communication is one way, no reply is ever sent to the client. There can > be many clients per server. The connection is encrypted. > > The server only cares about the latest messages from the client. If the LTE > connection drops, the client does not queue messages, but instead just eats > the error and waits for connectivity to resume.> > On the server side, the result appears to be a socket (file descriptor) leak. > When the client reconnects, the server side doesn't notice that the old > connection is defunct, and doesn't have any way to destroy the socket. The > server is running on Linux (Debian). > > Is there a way to track when a client connects to a PULL socket and record > the socket? With some sort of hook like that, I could attach a timer and > garbage collect abandoned sockets.> > Thanks, > > -chuck > _ > zeromq-dev mailing list > zeromq-dev@lists.zeromq.org > https://lists.zeromq.org/mailman/listinfo/zeromq-dev ___ zeromq-dev mailing list zeromq-dev@lists.zeromq.org https://lists.zeromq.org/mailman/listinfo/zeromq-dev
[zeromq-dev] Detecting abandoned clients (ie, half closed sockets)
I have a service processing periodic messages (periodic could be every 1 to 10 seconds or so per client) from mobile clients connecting over intermittent LTE connections. The server is using a PULL socket. It is written in Go, using goczmq. The communication is one way, no reply is ever sent to the client. There can be many clients per server. The connection is encrypted. The server only cares about the latest messages from the client. If the LTE connection drops, the client does not queue messages, but instead just eats the error and waits for connectivity to resume. On the server side, the result appears to be a socket (file descriptor) leak. When the client reconnects, the server side doesn't notice that the old connection is defunct, and doesn't have any way to destroy the socket. The server is running on Linux (Debian). Is there a way to track when a client connects to a PULL socket and record the socket? With some sort of hook like that, I could attach a timer and garbage collect abandoned sockets. Thanks, -chuck ___ zeromq-dev mailing list zeromq-dev@lists.zeromq.org https://lists.zeromq.org/mailman/listinfo/zeromq-dev