grpc / grpc-go

The Go language implementation of gRPC. HTTP/2 based RPC
https://grpc.io
Apache License 2.0
21.14k stars 4.4k forks source link

Example code doesn't gracefully shutdown #7843

Open bkane-msft opened 1 week ago

bkane-msft commented 1 week ago

What version of gRPC are you using?

https://github.com/grpc/grpc-go/blob/89737ae09d06cf745ebeb3c414a83c94b58709e5/examples/helloworld/greeter_server/main.go

What version of Go are you using (go version)?

n/a

What operating system (Linux, Windows, …) and version?

n/a

What did you do?

I looked to see a good example for graceful shutdown

What did you expect to see?

The example ( https://github.com/grpc/grpc-go/blob/89737ae09d06cf745ebeb3c414a83c94b58709e5/examples/helloworld/greeter_server/main.go ) to show graceful shutdown on a signal

What did you see instead?

The following:

    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    log.Printf("server listening at %v", lis.Addr())
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }

There is also nothing in the Go docs ( https://grpc.io/docs/languages/go/basics/#starting-the-server ) about draining requests / etc on shutdown or signal.

I think this should be in the docs/example as every app needs this. Would you accept a PR to add it?

bkane-msft commented 1 week ago

I think the correct code is:

    // graceful stop
    ch := make(chan os.Signal, 1)
    signal.Notify(ch, os.Interrupt, syscall.SIGTERM)
    go func() {
        <-ch
        server.GracefulStop()
    }()

    // startup
    lis, err := net.Listen("tcp", ":27166")
    if err != nil {
        panic(fmt.Sprintf("failed to listen: %v", err))
    }
    slog.Info("server listening", "addr", lis.Addr())
    if err := server.Serve(lis); err != nil {
        panic(fmt.Sprintf("failed to serve: %v", err))
    }

but I'm new to gRPC and would like an authoritative example

purnesh42H commented 1 week ago

@bkane-msft yes, GracefulStop() https://github.com/grpc/grpc-go/blob/master/server.go#L1901 is the correct way of stopping the gRPC server gracefully. We don't have any official documentation mentioning it though. I will ask the other maintainers if there is any and if not, should we add it.

purnesh42H commented 5 days ago

@bkane-msft we have decided to add a separate example to demonstrate graceful stop for server