Re: [zeromq-dev] Detecting abandoned clients (ie, half closed sockets)

2017-07-25 Thread Chuck Price
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)

2017-07-25 Thread Justin Karneges
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)

2017-07-25 Thread Chuck Price
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