全局禁用 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);
}
}
在我们的 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);
}
}