golang 服务器零停机热重启原理详解

关于TCP服务的实现过程

首先需要了解tcp服务器,socker机制,这些和语言无关。

一个简单的tcp server实现过程:
创建socket资源,socker1 ,是一个打开的文件描述符。
bind绑定到Hosu, Port。
开始监听listen。

经过以上过程,一个tcp服务就搭建好了。

客户端发起tcp连接请求
操作系统与其完成三次握手阶段,此连接就算建立了,操作系统根据tcp协议中的端口号标识将此连接放入指定的 backlog 队列中。

tcp server 从 backlog 队列中 accept 请求,也就是消费此队列,那么,它该从哪个 backlog 中消费呢,所以 accept 操作时需要带上自己的 socket1 。
被成功 accept 的请求才算和 tcp server 建立了连接,在此之前只是完成了三次握手。

于是 client 和 server 之间开始 read & write 。

于是,只要你得到了 socket1 ,你就可以冒充 tcp server ,也就可以 accept 客户端,并与之通讯。

关于fork子进程

我们还知道 fork 出的子进程会继承父进程的 socket 资源,于是便有了通常的操作:产生多个子进程来并行接受请求以达到提高并发能力的效果。

但是fork出的子进程是继承了父进程的上下文,和父进程用有相同的程序和代码,然而我们希望子进程加载新的程序从而实现热重启,所以fork操作显然无法满足需求。

关于exec系统调用

你可能感兴趣的:(golang)