RetryExecutor (Deal.SharedKernel.Resilience) — повтор операции при транзиентном сбое: экспоненциальная задержка, предикат транзиентности, отмена не заглатывается (при отменённом токене повтор не делается), пауза инъектируется для тестов.
GrpcRetry (Deal.Infrastructure.Integrations.Resilience) — 2 повтора, база 200 мс, джиттер 0.5–1.5×; транзиентными считаются Unavailable/DeadlineExceeded.
Применено к идемпотентным вызовам: ai-service (Filter, Classify, generate-keywords, evaluate-fit), ml-service (Predict, Status). Мутирующие вызовы (TrainBatch, Reset, telegram-операции) намеренно не повторяются, чтобы не задваивать побочные эффекты.
Тесты: RetryExecutor (успех/повтор/исчерпание/нетранзиент/отмена/экспоненциальный рост) и GrpcRetry (предикат, повтор, исчерпание); обновлены тесты, ранее ожидавшие один вызов.
Проверки
Сборка 5 решений: 0 предупреждений / 0 ошибок.
Тесты: core 1357, telegram 130, ai 52, ml 38, storage 9 — зелёные.
Не сделано (блокеры/риски)
Ретраи уровня БД (EF EnableRetryOnFailure) не включены: в репозиториях есть явные транзакции, которые под retry-стратегией требуют обёртки CreateExecutionStrategy().ExecuteAsync(...) — отдельная аккуратная правка.
Повторный нагрузочный прогон (критерий приёмки) зависит от задачи #6 «Прогнать нагрузочное тестирование» (нужен живой стек/владелец).
Ретраи telegram gRPC-клиента не добавлены: у него единый CallAsync, включающий неидемпотентные операции (send/join/leave) — нужен per-method флаг.
Ссылка на задачу: https://gitea.khomegeneric.keenetic.pro/rust/Deal/issues/2
## Что сделано
- `RetryExecutor` (`Deal.SharedKernel.Resilience`) — повтор операции при транзиентном сбое: экспоненциальная задержка, предикат транзиентности, отмена не заглатывается (при отменённом токене повтор не делается), пауза инъектируется для тестов.
- `GrpcRetry` (`Deal.Infrastructure.Integrations.Resilience`) — 2 повтора, база 200 мс, джиттер 0.5–1.5×; транзиентными считаются `Unavailable`/`DeadlineExceeded`.
- Применено к идемпотентным вызовам: ai-service (`Filter`, `Classify`, `generate-keywords`, `evaluate-fit`), ml-service (`Predict`, `Status`). Мутирующие вызовы (`TrainBatch`, `Reset`, telegram-операции) намеренно не повторяются, чтобы не задваивать побочные эффекты.
- Тесты: `RetryExecutor` (успех/повтор/исчерпание/нетранзиент/отмена/экспоненциальный рост) и `GrpcRetry` (предикат, повтор, исчерпание); обновлены тесты, ранее ожидавшие один вызов.
## Проверки
- Сборка 5 решений: 0 предупреждений / 0 ошибок.
- Тесты: core 1357, telegram 130, ai 52, ml 38, storage 9 — зелёные.
## Не сделано (блокеры/риски)
- Ретраи уровня БД (EF `EnableRetryOnFailure`) не включены: в репозиториях есть явные транзакции, которые под retry-стратегией требуют обёртки `CreateExecutionStrategy().ExecuteAsync(...)` — отдельная аккуратная правка.
- Повторный нагрузочный прогон (критерий приёмки) зависит от задачи #6 «Прогнать нагрузочное тестирование» (нужен живой стек/владелец).
- Ретраи telegram gRPC-клиента не добавлены: у него единый `CallAsync`, включающий неидемпотентные операции (send/join/leave) — нужен per-method флаг.
Filter/Classify, generate-keywords/evaluate-fit и Predict/Status оборачиваются в GrpcRetry; мутирующие вызовы (train/reset/telegram) не повторяются. Тесты учли повторы.
stepan
requested review from rust 2026-09-13 14:43:14 +03:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ссылка на задачу: #2
Что сделано
RetryExecutor(Deal.SharedKernel.Resilience) — повтор операции при транзиентном сбое: экспоненциальная задержка, предикат транзиентности, отмена не заглатывается (при отменённом токене повтор не делается), пауза инъектируется для тестов.GrpcRetry(Deal.Infrastructure.Integrations.Resilience) — 2 повтора, база 200 мс, джиттер 0.5–1.5×; транзиентными считаютсяUnavailable/DeadlineExceeded.Filter,Classify,generate-keywords,evaluate-fit), ml-service (Predict,Status). Мутирующие вызовы (TrainBatch,Reset, telegram-операции) намеренно не повторяются, чтобы не задваивать побочные эффекты.RetryExecutor(успех/повтор/исчерпание/нетранзиент/отмена/экспоненциальный рост) иGrpcRetry(предикат, повтор, исчерпание); обновлены тесты, ранее ожидавшие один вызов.Проверки
Не сделано (блокеры/риски)
EnableRetryOnFailure) не включены: в репозиториях есть явные транзакции, которые под retry-стратегией требуют обёрткиCreateExecutionStrategy().ExecuteAsync(...)— отдельная аккуратная правка.CallAsync, включающий неидемпотентные операции (send/join/leave) — нужен per-method флаг.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.