rpcxio/rpcx-examples

使用restart

Opened this issue · 6 comments

发信号
kill -SIGHUP 12068
之后报这个错误
jsonrpc2.go:201: ERROR: error in JSONRPC server: *errors.errorString http: Server closed
虽然可以成功起动一个新进程来监听端口,但是这个错误是正常的吗?

type Server struct {
	engine    *server.Server
	apiRouter *Router
}

func (s *Server) Start() {
	s.apiRouter.With(s.engine)
	s.engine.Serve("tcp", "localhost:8972")
	//s.engine.Serve("reuseport", "localhost:8972")
}


func (s *Server) StartShutdownListener() {
	go func(s *Server) {

		log.Println("server pid:", os.Getpid())

		// channel to receive notifications of SIGTERM and SIGHUP
		ch := make(chan os.Signal, 1)
		signal.Notify(ch, syscall.SIGTERM, syscall.SIGHUP)

		// handle signal SIGTERM and SIGHUP
		switch <-ch {
		case syscall.SIGTERM:
			s.engine.RegisterOnShutdown(func(s *server.Server) {
				log.Println("graceful shutdown...")
			})
			s.engine.Shutdown(context.Background())
		case syscall.SIGHUP:
			s.engine.Restart(context.Background())
			s.engine.RegisterOnRestart(func(s *server.Server) {
				log.Println("graceful restart...")
			})
			s.engine.Restart(context.Background())
		}
	}(s)
}

go版本:
go version go1.20.1 linux/amd64
rpcx : v1.8.24

@smallnest 辛苦看一下 感谢

不用担心,这个是正常的.后续我会把这个log级别改成info

@smallnest
还有一个问题请教下,就是调用restart()进行重启的时候,在重启过程中还是会有拒绝对外请求:

2024/02/21 14:48:26 client.go:764: ERROR: rpcx: client protocol error: unexpected EOF
2024/02/21 14:48:26 client.go:764: ERROR: rpcx: client protocol error: unexpected EOF
2024/02/21 14:48:26 client.go:764: ERROR: rpcx: client protocol error: unexpected EOF
2024/02/21 14:48:26 client.go:764: ERROR: rpcx: client protocol error: unexpected EOF
2024/02/21 14:48:26 client.go:764: ERROR: rpcx: client protocol error: unexpected EOF
2024/02/21 14:48:26 client.go:764: ERROR: rpcx: client protocol error: unexpected EOF
2024/02/21 14:48:26 client.go:764: ERROR: rpcx: client protocol error: unexpected EOF
2024/02/21 14:48:26 failed to call: %v dial tcp 127.0.0.1:8972: connect: connection refused
2024/02/21 14:48:26 false
2024/02/21 14:48:27 failed to call: %v dial tcp 127.0.0.1:8972: connect: connection refused
2024/02/21 14:48:27: false
2024/02/21 14:48:27 failed to call: %v dial tcp 127.0.0.1:8972: connect: connection refused
2024/02/21 14:48:27: false
2024/02/21 14:48:27 failed to call: %v dial tcp 127.0.0.1:8972: connect: connection refused
2024/02/21 14:48:27 false
2024/02/21 14:48:28 failed to call: %v dial tcp 127.0.0.1:8972: connect: connection refused
2024/02/21 14:48:28 false
2024/02/21 14:48:28 true
2024/02/21 14:48:28 true
2024/02/21 14:48:28 true

不应该是重启的时候,单独起一个进程进行监听同一个端口,然后关闭其中一个(处理完活动连接),这种是正确的做法吗?
或者说,如何优雅的处理重启呢?能平滑的过度。有没有现成的例子呢?
感谢

使用graceful restart, 要求你的操作系统支持reuseport. windows不支持,现在的linux都支持了

https://github.com/rpcxio/rpcx-examples/tree/master/graceful_restart

@smallnest 嗯 我也尝试用过 有两个问题
1.每次重启都会产生新的进程,会导致越来越多的进程监听同一个端口,产生的进程ID是随机的,如何处理旧的进程呢?
2. 重启的一瞬间会产生这样的日志:

...
024/02/21 15:42:17 client.go:764: ERROR: rpcx: client protocol error: unexpected EOF
2024/02/21 15:42:17 client.go:764: ERROR: rpcx: client protocol error: unexpected EOF
2024/02/21 15:42:17 true

这种错误是正常的吗?谢谢

如果我用supervisor来守护进程的话,好像会有冲突,supervisor的拉起一个进程,程序的reuseport 拉起一个进程
这种怎么处理呢?