How to hand-over a TCP listening socket with minimal downtime?

Posted by Shtééf on Stack Overflow See other posts from Stack Overflow or by Shtééf
Published on 2010-02-05T11:52:38Z Indexed on 2010/05/29 14:12 UTC
Read the original article Hit count: 272

While this question is tagged EventMachine, generic BSD-socket solutions in any language are much appreciated too.


Some background:

I have an application listening on a TCP socket. It is started and shut down with a regular System V style init script.

My problem is that it needs some time to start up before it is ready to service the TCP socket. It's not too long, perhaps only 5 seconds, but that's 5 seconds too long when a restart needs to be performed during a workday. It's also crucial that existing connections remain open and are finished normally.

Reasons for a restart of the application are patches, upgrades, and the like. I unfortunately find myself in the position that, every once in a while, I need to do this kind of thing in production.


The question:

I'm looking for a way to do a neat hand-over of the TCP listening socket, from one process to another, and as a result get only a split second of downtime. I'd like existing connections / sockets to remain open and finish processing in the old process, while the new process starts servicing new connectinos.

Is there some proven method of doing this using BSD-sockets? (Bonus points for an EventMachine solution.)

Are there perhaps open-source libraries out there implementing this, that I can use as is, or use as a reference? (Again, non-Ruby and non-EventMachine solutions are appreciated too!)

© Stack Overflow or respective owner

Related posts about sockets

Related posts about high-availability