Теперь мы расширяем приложение для обслуживания запросов gRPC (только унарные вызовы). Однако я видел предупреждения против хранения данных области запроса в ThreadLocal для gRPC. Несмотря на тестирование ThreadLocal с унарными вызовами и не обнаружение проблем.
Я хочу прояснить следующее:
Вопрос 1:
Это приемлемо ли использовать ThreadLocal для хранения данных области запроса в gRPC для унарных вызовов? Если нет, то почему?
Альтернативная реализация.
Я использовал контекстный API gRPC для распространения данных области запроса через несколько серверных перехватчиков. Ниже приведен пример:
Вопрос 2:
Правильно ли выглядит описанный выше подход к использованию контекста gRPC для распространения данных на уровне запроса?
Код: Выделить всё
`@Override
public ServerCall.Listener interceptCall(
ServerCall serverCall,
Metadata metadata,
ServerCallHandler serverCallHandler
) {
Context ctx = Context.current()
.withValue(GrpcContextStorage.grpcRequestKey, Boolean.TRUE)
.withValue(GrpcContextStorage.grpcRequestDateTimeKey, DateTimeUtil.getCurrentLocalTime());
ServerCall.Listener listener = Contexts.interceptCall(ctx, serverCall, metadata, serverCallHandler);
return new InterceptorForwardingCallListener(listener) {
@Override
public void onCancel() {
try {
super.onCancel();
} catch (Exception exe) {
_logger.error("Error in onCancel: " + exe.getMessage(), exe);
throw exe;
} finally {
this.onRequestCancellation();
}
}
@Override
public void onComplete() {
try {
super.onComplete();
} catch (Exception exe) {
_logger.error("Error in onComplete: " + exe.getMessage(), exe);
throw exe;
} finally {
this.onRequestCompletion();
}
}
};
}
private void onRequestCancellation() {
// Custom cleanup logic (e.g., clearing MDC)
MDC.clear();
}
private void onRequestCompletion() {
// Custom cleanup logic (e.g., clearing MDC)
MDC.clear();
}`
Удаляется ли предыдущий контекст автоматически?
Выполняется ли ручная очистка требуется, чтобы избежать риска повторного использования старого контекста для нового запроса?
Как гарантировать, что конфиденциальные данные, специфичные для клиента, хранящиеся в Контексте, не будут случайно утечки или повторного использования?
< р>Вопрос 3:
Для ведения журнала я использую MDC (сопоставленный диагностический контекст), который опирается на ThreadLocal.
Уместно ли использовать MDC для унарных вызовов сервера в gRPC?
>Если нет, то какой подход к управлению контекстом ведения журнала для запросов gRPC рекомендуется использовать?
Если допустимо использование MDC, достаточно ли переопределения onComplete() и onCancel() для обеспечения правильной очистки MDC после жизненный цикл запроса?
Нужно ли также переопределить дополнительные методы (например, onHalfClose()) для комплексной очистки?
Подробнее здесь: https://stackoverflow.com/questions/793 ... rver-calls