4 ms·
> We can restart the process without losing any connections Would you mind expanding on this a bit? I'm not too familiar with Haskell, but I am familiar with
by pmahoney 13y ago
> We can restart the process without losing any connections
Would you mind expanding on this a bit? I'm not too familiar with Haskell, but I am familiar with various was of blocking new connections while allowing existing connections to complete, either at the load-balancer level or built-in each individual process.
What Haskell stack are you using, and how are graceful restarts accomplished?
Thanks.
- shadytrees 13y agoI can't answer for grandparent, but you should check out https://github.com/notogawa/graceful https://github.com/notogawa/graceful
- implicit 13y agoOne of my coworkers wrote a really cool bit of software to do this. I want him to open source it. Basically, you can share a single socket amongst many servers. The OS ensures that just one process accepts each connection. You can therefore have a manager process that owns the socket and passes it on to application processes. To update, start new processes, then politely tell the old ones to go away.
- samstokes 13y agoeinhorn [1] implements this model and is pretty effective. Used in production at Stripe and other places. (It's written in Ruby, but can run application processes in any language.) [1] https://github.com/stripe/einhorn https://github.com/stripe/einhorn
- dllthomas 13y agoOne really cool thing in Linux is that you can actually pass file descriptors between processes over unix domain sockets.
- enigmo 13y agoWindows has supported this for ~14 years too.
- dllthomas 13y agoGood to know. Does it work for everything that's an fd in Linux? I know you've got to treat sockets and files differently in some cases (or at least did once)...
- enigmo 13y agoIt works for most kernel handles, sockets might be a little more normal starting with Win7 but I stopped doing Windows development around then. Here are the official docs: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724251(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ms72...
- dllthomas 13y agoLooks like there's a separate function for sockets. Still, cool stuff there too.
- DonPellegrino 13y agoBasically, catch SIGINT, then stop listening to a socket/port. Finish all current requests and exit. The "watcher" parent process will restart the process with the new executable. Repeat for all other processes listening to the socket/port.