2.7 KiB
2.7 KiB
Исправление gRPC deadline для T-Bank портфеля
Контекст
При запросе брокерского портфеля T-Bank бэкенд дополнительно обогащает позиции через
InstrumentsService/GetInstrumentBy. Для портфеля с несколькими позициями эти запросы запускаются пачкой,
но TBankClientService пропускает реальные gRPC-вызовы через локальный PQueue rate limiter.
Сейчас deadline создаётся до постановки задачи в очередь. Если вызов ждёт rate limiter, время ожидания
съедает T_BANK_REQUEST_TIMEOUT_MS, и gRPC может завершиться мгновенным
DEADLINE_EXCEEDED after 0.000/0.001s ещё до сетевого запроса.
Цель
Сделать так, чтобы локальное ожидание в PQueue не расходовало gRPC deadline, а сбой обогащения отдельного
инструмента не ломал весь ответ портфеля.
Границы
- Не менять публичный API
/api/v1/broker/accounts/:accountId/portfolio. - Не менять значения переменных окружения и конфигурацию rate limiter.
- Не добавлять retry/backoff в этом исправлении.
- Не менять стратегию кеширования инструментов.
Acceptance criteria
TBankClientService.callUnary()создаётMetadataиdeadlineнепосредственно перед фактическим gRPC-вызовом внутри задачиPQueue.T_BANK_REQUEST_TIMEOUT_MSизмеряет время выполнения upstream gRPC-вызова, а не время ожидания локальной очереди.- Есть regression test, который доказывает, что второй queued-вызов получает deadline после ожидания очереди.
BrokerPortfolioServiceстроит карту инструментов best-effort: ошибка одногоGetInstrumentByне роняет весь портфель.- Есть regression test, который доказывает, что портфель возвращается, если один инструмент не удалось обогатить.
Проверка
- Targeted tests:
npm run test -w apps/backend -- src/modules/tbank/services/tbank-client.service.spec.ts src/modules/tbank/services/broker-portfolio.service.spec.ts - Full backend tests:
npm run test:backend