mirror of https://github.com/grpc/grpc.git
parent
702ea25c8f
commit
72d796f2bc
1 changed files with 72 additions and 0 deletions
@ -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. |
Loading…
Reference in new issue