Skip to content

Commit

Permalink
Address more documentation comments from doug
Browse files Browse the repository at this point in the history
  • Loading branch information
purnesh42H committed Dec 20, 2024
1 parent 07ec527 commit 53a97a5
Showing 1 changed file with 29 additions and 22 deletions.
51 changes: 29 additions & 22 deletions content/en/docs/guides/server-graceful-stop.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,37 @@
---
title: Gracefull Shutdown
title: Graceful Shutdown
description: >-
Explains how to gracefully stop/shutdown a gRPC server.
Explains how to gracefully shut down [or stop, if you prefer] a gRPC server
to avoid causing RPC failures for connected clients.
---

### 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
are completed within a reasonable time frame 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
or a specified deadline is reached. Once all active RPCs finish or the deadline
expires, the server shuts down completely.
When the "Graceful shutdown function" is called, the server immediately
notifies all clients that they should stop sending new RPCs. Then after the
clients have received that notification, the server will stop accepting new
RPCs. In-flight RPCs are allowed to continue until they complete 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.
Because graceful shutdown helps prevent clients from encountering RPC failures,
it should be used if possible. However, gRPC also provides a forceful shutdown
mechanism which will immediately cause the server to stop serving and close all
connections, which results in the failure of any in-flight RPCs.

### 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
- Initiating the graceful shutdown process by calling the "Graceful shutdown
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.
Expand All @@ -35,11 +40,11 @@ involves:
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
some in-flight RPCs don't complete within a reasonable time frame. 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
stop is invoked, in-flight RPCs continue to process, but new RPCs are
rejected. If some in-flight RPCs are not finished in time, server is forcefully
shutdown.
```mermaid
Expand All @@ -48,7 +53,7 @@ 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
Client->>Client: Detects server shutdown and go finds other servers if available
alt RPCs complete within timeout
Server->>Client: Completes RPC 1
Server->>Client: Completes RPC 2
Expand All @@ -63,19 +68,21 @@ The following is a state based view
stateDiagram-v2
[*] --> RUNNING : Server Started
RUNNING --> GRACEFUL_STOP_INITIATED : Graceful Stop Called (with Timeout)
GRACEFUL_STOP_INITIATED --> GRACEFUL_STOPPING : Reject New RPCs
GRACEFUL_STOPPING --> TERMINATED : Complete In-Flight RPCs (Before Timeout)
GRACEFUL_STOPPING --> FORCE_STOP : Timeout Reached
FORCE_STOP --> TERMINATED : Force Terminate Pending RPCs and Shutdown
GRACEFUL_STOP_INITIATED --> GRACEFUL_STOPPING
GRACEFUL_STOPPING --> TERMINATED : In-Flight RPCs Completed (Before Timeout)
GRACEFUL_STOPPING --> TIMER_EXPIRED : Timeout Reached
TIMER_EXPIRED --> TERMINATED : Force Stop Called
```

### Language Support

| Language | Example |
|----------|-------------------|
| Java | [Java example] |
| Go | [Go example] |
| Python | |
| Language | Example |
|----------|------------------|
| C++ | |
| Go | [Go Example] |
| Java | [Java Example] |
| Python | |


[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

0 comments on commit 53a97a5

Please sign in to comment.