У меня есть приложение Spring Boot, обслуживающее HTTP-запросы в мультитенантной архитектуре. Для HTTP-запросов идентификатор клиента извлекается из заголовка и сохраняется в ThreadLocal. Поскольку Tomcat обеспечивает обработку одного запроса одним потоком, этот подход работает хорошо.
Теперь приложение расширяется для обслуживания запросов gRPC (только унарные вызовы). Я понимаю, что существуют опасения по поводу использования ThreadLocal в gRPC, даже для унарных вызовов. Однако мое тестирование пока не выявило никаких проблем.
Чтобы устранить потенциальные проблемы, я изучил использование gRPC Context API для распространения данных области запроса, таких как идентификационные данные клиента, между несколькими серверными перехватчиками. Ниже приведен пример моей реализации:
Пример реализации:
Использование ThreadLocal в gRPC Unary Вызовы:
Приемлемо ли использование ThreadLocal для хранения
данных области запроса в унарных вызовах gRPC?
Если нет, то почему это не рекомендуется, учитывая синхронную
природу
унарных вызовов?
Использование контекста gRPC для распространения:
В приведенной выше реализации гарантирует ли создание нового объекта Context
с использованием Context.withValue() правильную изоляцию данных
между запросами?
Требуется ли ручная очистка предыдущего контекста, или gRPC
справляется с этим автоматически?
Как я могу гарантировать, что данные, специфичные для клиента, хранящиеся в контексте,
не будут случайно утечки или повторного использования в последующих запросах?
MDC и регистрация в унарных вызовах gRPC:
Уместно ли использовать MDC (который опирается на ThreadLocal) для
контекста регистрации в Унарные вызовы gRPC?
Если Итак, достаточно ли переопределения onComplete() и onCancel(), чтобы
обеспечить правильную очистку MDC после жизненного цикла запроса?
Должны ли быть переопределены другие методы, такие как onHalfClose(), для обработки
граничных случаев?Если MDC не рекомендуется, какой альтернативный подход мне следует использовать
для распространения контекста журналирования между перехватчиками?
У меня есть приложение Spring Boot, обслуживающее HTTP-запросы в мультитенантной архитектуре. Для HTTP-запросов идентификатор клиента извлекается из заголовка и сохраняется в ThreadLocal. Поскольку Tomcat обеспечивает обработку одного запроса одним потоком, этот подход работает хорошо. Теперь приложение расширяется для обслуживания запросов gRPC (только унарные вызовы). Я понимаю, что существуют опасения по поводу использования ThreadLocal в gRPC, даже для унарных вызовов. Однако мое тестирование пока не выявило никаких проблем. Чтобы устранить потенциальные проблемы, я изучил использование gRPC Context API для распространения данных области запроса, таких как идентификационные данные клиента, между несколькими серверными перехватчиками. Ниже приведен пример моей реализации: Пример реализации: [code]@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());
@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 } } }; } [/code] [b]Конкретные вопросы:[/b] [list] [*][b]Использование ThreadLocal в gRPC Unary Вызовы:[/b] Приемлемо ли использование ThreadLocal для хранения данных области запроса в унарных вызовах gRPC? Если нет, то почему это не рекомендуется, учитывая синхронную природу унарных вызовов?
[*][b]Использование контекста gRPC для распространения:[/b] В приведенной выше реализации гарантирует ли создание нового объекта Context с использованием Context.withValue() правильную изоляцию данных между запросами? Требуется ли ручная очистка предыдущего контекста, или gRPC справляется с этим автоматически? Как я могу гарантировать, что данные, специфичные для клиента, хранящиеся в контексте, не будут случайно утечки или повторного использования в последующих запросах?
[*][b]MDC и регистрация в унарных вызовах gRPC:[/b] Уместно ли использовать MDC (который опирается на ThreadLocal) для контекста регистрации в Унарные вызовы gRPC? Если Итак, достаточно ли переопределения onComplete() и onCancel(), чтобы обеспечить правильную очистку MDC после жизненного цикла запроса? Должны ли быть переопределены другие методы, такие как onHalfClose(), для обработки граничных случаев?Если MDC не рекомендуется, какой альтернативный подход мне следует использовать для распространения контекста журналирования между перехватчиками?
У меня есть приложение Spring Boot, обслуживающее HTTP-запросы в мультитенантной архитектуре. Для HTTP-запросов идентификатор клиента извлекается из заголовка и сохраняется в ThreadLocal. Поскольку Tomcat обеспечивает обработку одного запроса одним...
У меня есть приложение Spring Boot, обслуживающее HTTP-запросы в мультитенантной архитектуре. Для HTTP мы идентифицируем идентификатор клиента через заголовок и сохраняем этот идентификатор в ThreadLocal. Поскольку Tomcat обеспечивает обработку...
Недавно мы обнаружили производственную проблему, которая была вызвана двумя унарными вызовами RPC, запущенными в быстрой последовательности на разных RPC, которые часто принимались и обрабатывались вне очереди. Мы объединили эти два вызова в один...
Получение ошибки «io.grpc.StatusRuntimeException: CANCELLED: io.grpc.Context был отменен без ошибки» в java. при использовании newBlockingStub и при вызове stub.method() возникает эта ошибка.
Необходимо выполнить успешный вызов grpc