Повторить временную ошибку#
RetryPolicy.safe(...) повторяет временные отказы только для операций, безопасность которых
можно доказать. Пример получает 503, заново готовит GET и принимает второй ответ.
# examples/docs/reliability_retry.py
def main() -> None:
site = GuideSite()
config = ClientConfig(
resilience=Resilience(
retry=RetryPolicy.safe(max_attempts=2, base_delay=0.0, max_delay=0.0)
)
)
with guide_client(site, config=config) as client:
result = HealthApi(client).get()
print(f"result: {result.value}")
print(f"attempts: {site.health_calls}")
Файл целиком
"""Retry a temporary server response under a safe policy."""
from dataclasses import dataclass
from pydantic import BaseModel
from eazy_sdk import ClientConfig, Http, HttpOperation, Resilience, RetryPolicy, SyncApi, op
from examples.docs.guide_site import GuideSite, guide_client
class Result(BaseModel):
value: str
@dataclass(frozen=True, slots=True, kw_only=True)
class GetHealth(HttpOperation[Result]):
__http__ = Http.get("/health")
class HealthApi(SyncApi):
get = op(GetHealth)
# region docs: reliability-retry
# examples/docs/reliability_retry.py
def main() -> None:
site = GuideSite()
config = ClientConfig(
resilience=Resilience(
retry=RetryPolicy.safe(max_attempts=2, base_delay=0.0, max_delay=0.0)
)
)
with guide_client(site, config=config) as client:
result = HealthApi(client).get()
print(f"result: {result.value}")
print(f"attempts: {site.health_calls}")
# endregion docs: reliability-retry
if __name__ == "__main__":
main()
result: ready
attempts: 2
Каждая попытка заново разрешает зависимости с политикой ATTEMPT, строит wire-представление,
шифрует и подписывает байты. Одноразовый stream можно повторить только через
ReplayableStreamBody. Для безопасного POST операция должна явно объявить idempotent=True.
Бюджет |
Что ограничивает |
|---|---|
|
Все попытки логического вызова |
|
Повторы после ошибки транспорта |
|
Повторы после обновления сессии |
|
Переходы по |
|
Методы, статусы, задержку и backoff |
Общий timeout и cancellation останавливают ожидание. Protection replay имеет отдельное доказательство и бюджет, но всё равно расходует обычную попытку отправки.