-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
72 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
GRPC Health Checking Protocol | ||
================================ | ||
|
||
Health checks are used to probe whether the server is able to handle rpcs. The | ||
client-to-server health checking can happen from point to point or via some | ||
load balancing mechanism. A server may choose to reply “unhealthy” because it | ||
has not been ready to take requests, it is shutting down or some other reason. | ||
The client can act accordingly if the response is not received within some time | ||
window or the response says unhealthy in it. | ||
|
||
|
||
A GRPC service is used as the health checking mechanism for both simple | ||
client-to-server scenario and other systems such as load-balancing. Being a high | ||
level service provides some benefits. Firstly, since it is a GRPC service | ||
itself, doing a health check is in the same format as a normal rpc. Secondly, | ||
it has rich semantics such as per-service health status. Thirdly, as a GRPC | ||
service, it is able reuse all the existing billing, quota infrastructure, etc, | ||
and thus the server has full control over the access of the health checking | ||
service. | ||
|
||
## Service Definition | ||
|
||
The server should export a service defined in the following proto: | ||
|
||
``` | ||
syntax = "proto3"; | ||
package grpc.health.v1alpha; | ||
message HealthCheckRequest { | ||
string host = 1; | ||
string service = 2; | ||
} | ||
message HealthCheckResponse { | ||
enum ServingStatus { | ||
UNKNOWN = 0; | ||
SERVING = 1; | ||
NOT_SERVING = 2; | ||
} | ||
ServingStatus status = 1; | ||
} | ||
service Health { | ||
rpc Check(HealthCheckRequest) returns (HealthCheckResponse); | ||
} | ||
``` | ||
|
||
A client can query the server’s health status by calling the `Check` method, and | ||
a deadline should be set on the rpc. The client can optionally set the host | ||
string. The client can optionally set the service name it wants to query for | ||
health status. The suggested format of service name is | ||
`grpc.health.v1alpha.Health`. | ||
|
||
The server should register all the services for all the hosts manually and set | ||
the individual status, including an empty service name and its status. For each | ||
request received, if the (host, service_name) pair can be found in the registry, | ||
a response must be sent back with an `OK` status and the status field should be | ||
set to `SERVING` or `NOT_SERVING` accordingly. If the service name is not | ||
registered, the server returns a `NOT_FOUND` GRPC status. | ||
|
||
It is recommended that the server use an empty string as the default host string | ||
and create a (“”, “”) pair as the key for server’s health status as a whole. The | ||
server can just do exact matching of the (host, service_name) pair and does not | ||
support any kind of wildcard matching. However, the service owner has the | ||
freedom to implement more complicated matching semantics that both the client | ||
and server agree upon. | ||
|
||
|
||
A client can declare the server as unhealthy if the rpc is not finished after | ||
some amount of time. The client should be able to handle the case where server | ||
does not have the Health service. |