Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

guides/features: add document for how to gracefully shutdown server #1388

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions content/en/docs/guides/server-graceful-stop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
---
title: Gracefull Shutdown
dfawley marked this conversation as resolved.
Show resolved Hide resolved
description: >-
Explains how to gracefully stop/shutdown a gRPC server.
dfawley marked this conversation as resolved.
Show resolved Hide resolved
---

### Overview

gRPC servers often need to shut down gracefully, ensuring that in-flight RPCs
are completed within a reasonable timeframe and new RPCs are no longer
accepted. The "Graceful shutdown function" facilitates this process, allowing
the server to transition smoothly without abruptly terminating active
connections.

When the "Graceful shutdown function" is called, the server immediately stops
accepting new RPCs. In-flight RPCs are allowed to continue until they complete
dfawley marked this conversation as resolved.
Show resolved Hide resolved
or a specified deadline is reached. Once all active RPCs finish or the deadline
expires, the server shuts down completely.

While a graceful shutdown is optional, it's highly recommended. You can
shutdown without a graceful shutdown first but that would not be recommended.
dfawley marked this conversation as resolved.
Show resolved Hide resolved

### How to do Graceful Server Shutdown

The exact implementation of the "Graceful shutdown function" varies depending on
the programming language you are using. However, the general pattern
involves:

- Initiating the graceful shutdown process by calling "Graceful shutdown
dfawley marked this conversation as resolved.
Show resolved Hide resolved
function" on your gRPC server object. This function blocks until all
currently running RPCs complete. This ensures that in-flight requests are
allowed to finish processing.
- Specify a timeout period to limit the time allowed for in-progress RPCs to
finish. It's crucial to separately call the "Forceful shutdown function" on
the server object using a timer mechanism (depending on your language) to
trigger a forceful shutdown after a predefined duration. This
acts as a safety net, ensuring that the server eventually shuts down even if
some in-flight RPCs don't complete within a reasonable timeframe. This
prevents indefinite blocking.

The following shows the sequence of events that occur, when a server's graceful
stop is invoked, in-flight RPCs continue to prorcess, but new RPCs are
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

*process -- please run a spell check.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed all the spellings

rejected. If some in-flight RPCs are not finished in time, server is forcefully
shutdown.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verb form, so should be "shut down"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

```mermaid
sequenceDiagram
Client->>Server: New RPC Request 1
Client->>Server: New RPC Request 2
Server-->>Server: Graceful Shutdown Invoked
Server->>Client: Continues Processing In-Flight RPCs
Client->>Client: Detects server shutdown and go find other servers if available
dfawley marked this conversation as resolved.
Show resolved Hide resolved
alt RPCs complete within timeout
Server->>Client: Completes RPC 1
Server->>Client: Completes RPC 2
Server-->>Server: Graceful Shutdown Complete
else Timeout reached
Server->>Client: Forceful Shutdown Invoked, terminating pending RPCs
Server-->>Server: Forceful Shutdown Complete
end
```
The following is a state based view
```mermaid
stateDiagram-v2
[*] --> RUNNING : Server Started
RUNNING --> GRACEFUL_STOP_INITIATED : Graceful Stop Called (with Timeout)
GRACEFUL_STOP_INITIATED --> GRACEFUL_STOPPING : Reject New RPCs
dfawley marked this conversation as resolved.
Show resolved Hide resolved
GRACEFUL_STOPPING --> TERMINATED : Complete In-Flight RPCs (Before Timeout)
GRACEFUL_STOPPING --> FORCE_STOP : Timeout Reached
FORCE_STOP --> TERMINATED : Force Terminate Pending RPCs and Shutdown
dfawley marked this conversation as resolved.
Show resolved Hide resolved
```

### Language Support

| Language | Example |
|----------|-------------------|
| Java | [Java example] |
| Go | [Go example] |
| Python | |
dfawley marked this conversation as resolved.
Show resolved Hide resolved

[Go example]: https://github.com/grpc/grpc-go/tree/master/examples/features/gracefulstop
[Java example]: https://github.com/grpc/grpc-java/tree/master/examples/example-hostname/src/main/java/io/grpc/examples/hostname