主进程和子进程共享如何在golang中监听fd并接受新连接?

时间:2016-05-23 02:25:49

标签: go

我几天都被困在这个问题上了:

我在主过程中使用fd监听端口。然后我分叉了一个新的子进程,它包含了fd。

我不想杀死主进程,如何在主进程或子进程中接受无连接的连接????

我尝试了一些:如果主进程处于活动状态,只有它可以接受连接;它会被杀死,孩子会这样做。

我的golang版本是1.6.2。

谢谢,期待您的回复!!!

1 个答案:

答案 0 :(得分:0)

杀掉你的主人 - 让你的孩子处理新的联系(孩子将成为主人)。

http://grisha.org/blog/2014/06/03/graceful-restart-in-golang/

作为旁注......

我做了一段时间,优雅地重新启动专用服务器和VM上的服务。但是我总是遇到Canary Testing和Blue / Green部署的问题,在我转换开关以使其上线之前在暂存环境中尝试新代码。一旦你运行200个应用程序实例(或者实际上超过2或3个!),它就变得相当困难。

我一直认为必须管理所有连接并且不要在我的专用虚拟机上删除单个软件包。但是学习使用托管云工具亚马逊的Elastic Beanstalk和Azure网站来打包可执行文件(现在,在Beanstalk中支持Docker)并将它们部署在新的VM上,并丢弃旧的VM,它真的让我从这种负担大规模。我只是让亚马逊处理"旋转"并且"关闭"不同虚拟机上的docker实例,删除旧的实例。它将在新VM上部署新代码,并将保持旧代码处于活动状态,直到通过负载均衡器不再有连接为止。然后它最终关闭了旧的。连接零丢弃,零问题。

通过切换到这些托管方法,您可以在有限的流量中测试我们的代码(比如指向新版本服务的流量的5%,您可以进行金丝雀测试),您可以优雅地推出新版本,甚至硬切换到新系统的所有新连接。

试着为你节省几年的心痛和经验教训。 :)