diff --git a/Documentation/keepalive.md b/Documentation/keepalive.md new file mode 100644 index 000000000..118ac66d1 --- /dev/null +++ b/Documentation/keepalive.md @@ -0,0 +1,46 @@ +# Keepalive + +gRPC sends http2 pings on the transport to detect if the connection is down. If +the ping is not acknowledged by the other side within a certain period, the +connection will be close. Note that pings are only necessary when there's no +activity on the connection. + +For how to configure keepalive, see +https://godoc.org/google.golang.org/grpc/keepalive for the options. + +## What should I set? + +It should be sufficient for most users to set [client +parameters](https://godoc.org/google.golang.org/grpc/keepalive) as a [dial +option](https://godoc.org/google.golang.org/grpc#WithKeepaliveParams). + +## What will happen? + +(The behavior described here is specific for gRPC-go, it might be slightly +different in other languages.) + +When there's no activity on a connection (note that an ongoing stream results in +__no activity__ when there's no message being sent), after `Time`, a ping will +be sent by the client and the server will send a ping ack when it gets the ping. +Client will wait for `Timeout`, and check if there's any activity on the +connection during this period (a ping ack is an activity). + +## What about server side? + +Server has similar `Time` and `Timeout` settings as client. Server can also +configure connection max-age. See [server +parameters](https://godoc.org/google.golang.org/grpc/keepalive#ServerParameters) +for details. + +### Enforcement policy + +[Enforcement +policy](https://godoc.org/google.golang.org/grpc/keepalive#ServerParameters) is +a special setting on server side to protect server from malicious or misbehaving +clients. + +Server sends GOAWAY with ENHANCE_YOUR_CALM and close the connection when bad +behaviors are detected: + - Client sends too frequent pings + - Client sends pings when there's no stream and this is disallowed by server + config diff --git a/keepalive/keepalive.go b/keepalive/keepalive.go index f8adc7e6d..78eea1fc9 100644 --- a/keepalive/keepalive.go +++ b/keepalive/keepalive.go @@ -16,7 +16,8 @@ * */ -// Package keepalive defines configurable parameters for point-to-point healthcheck. +// Package keepalive defines configurable parameters for point-to-point +// healthcheck. package keepalive import ( @@ -24,42 +25,59 @@ import ( ) // ClientParameters is used to set keepalive parameters on the client-side. -// These configure how the client will actively probe to notice when a connection is broken -// and send pings so intermediaries will be aware of the liveness of the connection. -// Make sure these parameters are set in coordination with the keepalive policy on the server, -// as incompatible settings can result in closing of connection. +// These configure how the client will actively probe to notice when a +// connection is broken and send pings so intermediaries will be aware of the +// liveness of the connection. Make sure these parameters are set in +// coordination with the keepalive policy on the server, as incompatible +// settings can result in closing of connection. type ClientParameters struct { - // After a duration of this time if the client doesn't see any activity it pings the server to see if the transport is still alive. + // After a duration of this time if the client doesn't see any activity it + // pings the server to see if the transport is still alive. Time time.Duration // The current default value is infinity. - // After having pinged for keepalive check, the client waits for a duration of Timeout and if no activity is seen even after that - // the connection is closed. + // After having pinged for keepalive check, the client waits for a duration + // of Timeout and if no activity is seen even after that the connection is + // closed. Timeout time.Duration // The current default value is 20 seconds. - // If true, client runs keepalive checks even with no active RPCs. + // If true, client sends keepalive pings even with no active RPCs. If false, + // when there are no active RPCs, Time and Timeout will be ignored and no + // keepalive pings will be sent. PermitWithoutStream bool // false by default. } -// ServerParameters is used to set keepalive and max-age parameters on the server-side. +// ServerParameters is used to set keepalive and max-age parameters on the +// server-side. type ServerParameters struct { - // MaxConnectionIdle is a duration for the amount of time after which an idle connection would be closed by sending a GoAway. - // Idleness duration is defined since the most recent time the number of outstanding RPCs became zero or the connection establishment. + // MaxConnectionIdle is a duration for the amount of time after which an + // idle connection would be closed by sending a GoAway. Idleness duration is + // defined since the most recent time the number of outstanding RPCs became + // zero or the connection establishment. MaxConnectionIdle time.Duration // The current default value is infinity. - // MaxConnectionAge is a duration for the maximum amount of time a connection may exist before it will be closed by sending a GoAway. - // A random jitter of +/-10% will be added to MaxConnectionAge to spread out connection storms. + // MaxConnectionAge is a duration for the maximum amount of time a + // connection may exist before it will be closed by sending a GoAway. A + // random jitter of +/-10% will be added to MaxConnectionAge to spread out + // connection storms. MaxConnectionAge time.Duration // The current default value is infinity. - // MaxConnectinoAgeGrace is an additive period after MaxConnectionAge after which the connection will be forcibly closed. + // MaxConnectinoAgeGrace is an additive period after MaxConnectionAge after + // which the connection will be forcibly closed. MaxConnectionAgeGrace time.Duration // The current default value is infinity. - // After a duration of this time if the server doesn't see any activity it pings the client to see if the transport is still alive. + // After a duration of this time if the server doesn't see any activity it + // pings the client to see if the transport is still alive. Time time.Duration // The current default value is 2 hours. - // After having pinged for keepalive check, the server waits for a duration of Timeout and if no activity is seen even after that - // the connection is closed. + // After having pinged for keepalive check, the server waits for a duration + // of Timeout and if no activity is seen even after that the connection is + // closed. Timeout time.Duration // The current default value is 20 seconds. } -// EnforcementPolicy is used to set keepalive enforcement policy on the server-side. -// Server will close connection with a client that violates this policy. +// EnforcementPolicy is used to set keepalive enforcement policy on the +// server-side. Server will close connection with a client that violates this +// policy. type EnforcementPolicy struct { - // MinTime is the minimum amount of time a client should wait before sending a keepalive ping. + // MinTime is the minimum amount of time a client should wait before sending + // a keepalive ping. MinTime time.Duration // The current default value is 5 minutes. - // If true, server expects keepalive pings even when there are no active streams(RPCs). + // If true, server allows keepalive pings even when there are no active + // streams(RPCs). If false, and client sends ping when there are no active + // streams, server will send GOAWAY and close the connection. PermitWithoutStream bool // false by default. }