Как эффективно управлять данными области запроса и MDC в унарных вызовах gRPC?JAVA

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

Сообщение Anonymous »

У меня есть приложение Spring Boot, обслуживающее HTTP-запросы в мультитенантной архитектуре. Для HTTP-запросов идентификатор клиента извлекается из заголовка и сохраняется в ThreadLocal. Поскольку Tomcat обеспечивает обработку одного запроса одним потоком, этот подход работает хорошо.
Теперь приложение расширяется для обслуживания запросов gRPC (только унарные вызовы). Я понимаю, что существуют опасения по поводу использования ThreadLocal в gRPC, даже для унарных вызовов. Однако мое тестирование пока не выявило никаких проблем.
Чтобы устранить потенциальные проблемы, я изучил использование gRPC Context API для распространения данных области запроса, таких как идентификационные данные клиента, между несколькими серверными перехватчиками. Ниже приведен пример моей реализации:
Пример реализации:

Код: Выделить всё

@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 {
MDC.clear(); // Custom cleanup logic
}
}

@Override
public void onComplete() {
try {
super.onComplete();
} catch (Exception exe) {
_logger.error("Error in onComplete: " + exe.getMessage(), exe);
throw exe;
} finally {
MDC.clear(); // Custom cleanup logic
}
}
};
}
Конкретные вопросы:
  • Использование ThreadLocal в gRPC Unary Вызовы:
    Приемлемо ли использование ThreadLocal для хранения
    данных области запроса в унарных вызовах gRPC?
    Если нет, то почему это не рекомендуется, учитывая синхронную
    природу
    унарных вызовов?
  • Использование контекста gRPC для распространения:
    В приведенной выше реализации гарантирует ли создание нового объекта Context
    с использованием Context.withValue() правильную изоляцию данных
    между запросами?
    Требуется ли ручная очистка предыдущего контекста, или gRPC
    справляется с этим автоматически?
    Как я могу гарантировать, что данные, специфичные для клиента, хранящиеся в контексте,
    не будут случайно утечки или повторного использования в последующих запросах?
  • MDC и регистрация в унарных вызовах gRPC:
    Уместно ли использовать MDC (который опирается на ThreadLocal) для
    контекста регистрации в Унарные вызовы gRPC?
    Если Итак, достаточно ли переопределения onComplete() и onCancel(), чтобы
    обеспечить правильную очистку MDC после жизненного цикла запроса?
    Должны ли быть переопределены другие методы, такие как onHalfClose(), для обработки
    граничных случаев?Если MDC не рекомендуется, какой альтернативный подход мне следует использовать
    для распространения контекста журналирования между перехватчиками?


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

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

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

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

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

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

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