全局禁用 GRPC 上下文取消

Globally disable GRPC context cancelation

在我们的 GRPC 服务器中,我们经常使用 GRPC FutureStub 异步调用其他 GRPC 服务器,并且我们通常不介意此 RPC 是否在当前 RPC 之后完成。

目前,我们每次都被迫fork上下文,否则我们的代码会主动取消传出的RPC,从而导致问题。

不幸的是,忘记这样做非常容易,因此我们在生产中发生了多起事故。

此功能导致更多 issues/incidents,我们想完全禁用它。

您不能完全禁用上下文取消。但是你可以避免gRPC服务器影响客户端。

您可以使用服务器拦截器来分叉所有 RPC:

public class ForkContextInterceptor implements ServerInterceptor {
  @Override
  public <ReqT,RespT> ServerCall.Listener<ReqT> interceptCall(
      ServerCall<ReqT,RespT> call, Metadata headers,
      ServerCallHandler<ReqT,RespT> next) {
    return Contexts.interceptCall(
        Context.current().fork(), call, headers, next);
  }
}