43 lines
2.7 KiB
Markdown
43 lines
2.7 KiB
Markdown
# Исправление 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`
|