Рекомендации по использованию MDC и распространения контекста в вызовах унарного сервера gRPCJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Рекомендации по использованию MDC и распространения контекста в вызовах унарного сервера gRPC

Сообщение Anonymous »

У меня есть приложение Spring Boot, обслуживающее HTTP-запросы в мультитенантной архитектуре. Для HTTP мы идентифицируем идентификатор клиента через заголовок и сохраняем этот идентификатор в ThreadLocal. Поскольку Tomcat обеспечивает обработку одного запроса одним потоком, этот подход работает хорошо.
Теперь мы расширяем приложение для обслуживания запросов 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();
}`
Я понимаю, что при использовании Context.withValue создается новый объект Context, поскольку он является неизменяемым.
Удаляется ли предыдущий контекст автоматически?
Выполняется ли ручная очистка требуется, чтобы избежать риска повторного использования старого контекста для нового запроса?
Как гарантировать, что конфиденциальные данные, специфичные для клиента, хранящиеся в Контексте, не будут случайно утечки или повторного использования?
< р>Вопрос 3:
Для ведения журнала я использую MDC (сопоставленный диагностический контекст), который опирается на ThreadLocal.
Уместно ли использовать MDC для унарных вызовов сервера в gRPC?
>Если нет, то какой подход к управлению контекстом ведения журнала для запросов gRPC рекомендуется использовать?
Если допустимо использование MDC, достаточно ли переопределения onComplete() и onCancel() для обеспечения правильной очистки MDC после жизненный цикл запроса?
Нужно ли также переопределить дополнительные методы (например, onHalfClose()) для комплексной очистки?

Подробнее здесь: https://stackoverflow.com/questions/793 ... rver-calls
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»