У меня есть сервер gRPC, и я реализовал постепенное отключение моего сервера gRPC примерно так
fun main() {
//Some code
term := make(chan os.Signal)
go func() {
if err := grpcServer.Serve(lis); err != nil {
term <- syscall.SIGINT
}
}()
signal.Notify(term, syscall.SIGTERM, syscall.SIGINT)
<-term
server.GracefulStop()
closeDbConnections()
}
Это отлично работает.
Если вместо этого я напишу логику grpcServer.Serve()
в основной процедуре и вместо этого добавлю логику обработчика выключения в другую процедуру, операторы после server.GracefulStop()
обычно не выполняются. Некоторые DbConnections закрываются, если closeDbConnections()
выполняется вообще.
server.GracefulStop()
- это блокирующий вызов. Определенно grpcServer.Serve()
заканчивается до server.GracefulStop()
завершения. Итак, сколько же времени занимает остановка основной программы после возврата этого вызова?
проблемный код
func main() {
term := make(chan os.Signal)
go func() {
signal.Notify(term, syscall.SIGTERM, syscall.SIGINT)
<-term
server.GracefulStop()
closeDbConnections()
}()
if err := grpcServer.Serve(lis); err != nil {
term <- syscall.SIGINT
}
}
Этот случай не работает, как ожидалось. После выполнения server.GracefulStop()
, closeDbConnections()
может запускаться или не запускаться (обычно не выполняется до завершения). Я тестировал последний случай, отправив SIGINT, нажав Ctrl-C с моего терминала.
Может кто-нибудь объяснить это поведение?