POSTS
Timeout vs Deadline
One of the first few things I feel strange about gRPC is that gRPC terminate unfinished request based on a deadline mechanism instead of the more common timeout mechanism.
In pseudo-code:
var timeout = 5 * time.Second;
var deadline = time.Now() + 5 * time.Second;As you can see, the deadline mechanism is less straight-forward at first glance. So why bother?
I thought this might be another “Google” thing, so I didn’t put my mind to it until recently. But now I realize it is a quite clever design.
Suppose we have three services chaining together:
ShopService->OrderService->PaymentService.
Suppose the ShopService sends a request to the OrderService and ask it to timeout after 5 seconds. How soon should OrderService timeout the requests to PayService? Another 5 seconds? 3 seconds? Either way, you are placing your self in a guessing game, since there is no way to know how long has gone before the OrderService actually receives the request from ShopService. You end up terminating the subsequent call either too early or too late.
The above dilemma vanishes with the help of deadline. The ShopService simply asks the OrderService for a response before Thu Jan 23 2020 15:48:24 and OrderService then can mindlessly obey and ask the same to PaymentService. You are guaranteed only the necessary period of waiting will be happen between services so long they have a consistent notion of time.
While a little bit unintuitive, deadlines are more microservice friendly than timeouts.
PS. I read a blog post saying deadlines are distributed timeouts. Precisely!