Logo GH

Қайталау және backoff саясаты

Қайталаулар (retries) уақытша іркілістерден аман қалуға көмектеседі, бірақ дұрыс орнатылмаған жағдайда трафиктің көшкіні, операциялардың қосарлануы және каскадтық құлдыраулар пайда болады. Ретрациялардың сенімді саясаты әрқашан дедлайндардан/таймауттардан басталады, демпотенттілікті ескереді және backoff + джиттерді пайдаланады.

1) Базалық қағидаттар

1. Алдымен таймаут/мерзім, содан кейін ретрай. Уақыт шегініссіз қайталау істен шығуды ұзартады.
2. Ретрай - тек қауіпсіз/демпотенттік операциялар үшін. Қауіпсіз еместер үшін - idempotency-keys және транзакциялық кепілдіктер арқылы.
3. Backoff міндетті. Толқындарды синхронсыздандыру үшін экспоненциалды немесе GCRA-ұқсас.
4. Әрекеттер санын және жалпы бюджет-уақытты шектеңіз. Пайдаланушының SLO-дан шықпаңыз.
5. Инфрақұрылым сигналдарын құрметтеңіз. '429/503' + 'Retry-After', circuit breaker күйі, кезек шектеулері.

2) Таймауттар мен мерзімдер (deadline propagation)

🚨 SLO сервисінің сұрау уақыты, мерзім тізбегі бойынша төмен таралады (HTTP тақырыптары/gRPC context).

Таймауттар композициясы: жиынтық (бірінші әрекет + backoff + келесі) ≤ пайдаланушы мерзімі.
Оқу/жазу үшін әртүрлі таймауттар: жазбалар қысқа және қатаңырақ; оқу hedging рұқсат етеді.

3) Теңсіздік және қауіпсіз қайталаулар

Оқу (GET/Idempotent RPC): '5xx', 'UNAVAILABLE', желілік таймауттар кезінде қайталау қауіпсіз.

Жазбалар:
  • Шекарада 'Idempotency-Key' (HTTP) немесе request-ID пайдаланыңыз; сервер дедуплициялауы керек.
  • «upsert», «at-least-once» + өтемақы (сага) дегенді жазыңыз.
  • Сыртқы төлемдер/өзара есеп айырысулар - тек қана демпотенттік кілттермен және операциялар журналымен.

4) backoff алгоритмдері

Exponential: 'base 2 ^ attempt', шектеулі 'max _ backoff'.
Decorrelated Jitter (full/equal jitter): клиенттерді синхрондамау үшін диапазондағы кездейсоқ.
GCRA/Token-Bucket - осыған ұқсас кідірістер: rate limits-пен келісілген.
Шектері: 'initial _ backoff' (50-200 мс оқу; 200-500 мс), 'max _ backoff' (1-5 с), 'max _ elapsed' (мысалы, 3-10 с).

Ұсынылатын үлгі: экспоненциалды backoff + full jitter.

5) Шешім қабылдау саясаты «қайталау/қайталанбау»

Келесі кезде қайталаймыз:
  • Желілік қателер/таймауттар, '429' (құрметпен 'Retry-After'), 'жұмсақ' 5xx '(' 502/503/504 '), gRPC' UNAVAILABLE/DEADLINE _ EXCEEDED '.
Қайталамаймыз:
  • '4xx' (кейбір сценарийлерде '409/429/408' басқа), бизнес қателер, '401/403', валидациялық қателер, анық 'DoNotRetry' жалаушасы.
Ақылды ерекшеліктер:
  • '409 Conflict' - кейде консенсустан кейін кідіріспен қайталау.
  • eventually consistent оқу үшін '404' - шағын backoff бар бір-екі реттік ретрай.

6) Concurrency caps және «ретрайлардың дауылы»

per-client/per-tenant/per-endpoint.
Сұрау салуға талпыныстардың жиынтық лимиті (мысалы, 2-3).
Кезектерді үрлемеу үшін admission control арқылы «ыстық» эндпойнттарды тежеңіз.

7) Circuit Breaker және лимиттермен өзара іс-қимыл

Егер CB ашық болса, ретрацияны тікелей орындамаңыз - fallbackке кіріңіз немесе 'half-open' сынамасын күтіңіз.
'429' кезінде - 'Retry-After'; ол болмаған жағдайда - «жұмсақ» backoff қолданыңыз.
Ретраялар жүктемені арттыра алады; бейімделу шегін қолданыңыз (оқиға кезінде 'max _ attempts' дегенді төмендетіңіз).

8) Хаттамалар мен келісімшарттар

HTTP

Кодтар: '408/429/5xx'.
Тақырыптар: 'Retry-After', 'RateLimit-', 'Idempotency-Key', 'Request-Id'.
Клиент 'X-Request-Timeout '/' Deadline-At' (егер сіз осылай қабылдасаңыз) жіберуі керек.

gRPC

Шекті мәнмәтінді пайдаланыңыз; 'UNAVAILABLE', 'DEADLINE _ EXCEEDED' әдісін құрметтеңіз.
Демпотенттік RPC үшін - ретраларды қосыңыз; мутациялар үшін - тек қана демпотенттіктің қолдауымен.

9) Кезектер, фондық міндеттер және интеграция

At-least-once өңдеушілері → іспеттес әрекеттер, кілт бойынша дедупликация.
Әрекеттер арасындағы backoff үшін Delay queue (мысалы, 5s/30s/2m).
Әрекеттер және қолмен өңдеу лимиті бар Dead-letter queue (DLQ).
Outbox/CDC - қайталаулар транзакциялық тұтастықты бұзбауы үшін.

10) Hedging vs Retries

Hedging (айналы сұрау) артқы жасырындылықта жоғары сыни оқылымдар үшін пайдалы.
Шектеңіз: X% артық емес сұраулар, «старт-грейс» кідірісі (мысалы, p95-жасырындылығы), жеңілгендерді болдырмау.
Жазу әрекеттеріне күшті ұқсамаушылықсыз hedging қолданбаңыз.

11) Телеметрия және бақылау

Теги: `tenant_id`, `endpoint`, `attempt`, `decision` (retry/skip), `reason`, `backoff_ms`, `deadline_ms`, `idempotency_key`.
Метрика: ретрайлардың үлесі, ретрайлардан кейінгі табыстылық, p95/p99 «end-to-end», асып кеткен мерзімдер саны, CB іске қосылуы.
Аудит логтары: «шулы» кілттердің/эндпойнттардың жоғарғы N, 429/503 корреляциясы.

12) Тестілеу және хаос

Профильдер: «аралар» (burst-тыныштық), «дауыл» (жаппай таймауттар), «жабысқақ» қателер (әрбір N-і), латенттілік қалдықтары.
Лимитер/кэш/кезек сторының істен шығуы, clock-skew.
Жалпы ұзақтығы (attempts + backoff) SLO-ға сәйкестігін тексеру.

13) Саясаттың жалған құжаты

pseudo handle(req, deadline):
attempt = 0 backoff = initial()
while attempt < MAX_ATTEMPTS and now() < deadline:
attempt += 1 with timeout(per_attempt_timeout(deadline, attempt)):
try:
resp = call(req)
if isRetryableStatus(resp): raise Retryable(resp. status)
return resp except Retryable as e:
if circuit. isOpen(dep) or! isIdempotent(req): break sleep(jitter(backoff))
backoff = min(exp(backoff), MAX_BACKOFF)
except NonRetryable:
break return fail_or_fallback(req)

14) Конфигурациялық үлгі (мысал)

yaml retries:
default:
max_attempts: 3 initial_backoff_ms: 150 max_backoff_ms: 2000 strategy: exponential_full_jitter respect_retry_after: true per_attempt_timeout_fraction: 0. 4 # 40% of remaining deadline hedging:
enabled: false read_heavy:
max_attempts: 4 initial_backoff_ms: 80 max_backoff_ms: 1200 hedging:
enabled: true start_after_p95_ms: 300 max_extra_requests_ratio: 0. 05 write_strict:
max_attempts: 2 initial_backoff_ms: 250 max_backoff_ms: 1000 idempotency_required: true

limits:
concurrent_retries_per_tenant: 100 concurrent_retries_per_endpoint: 20

15) Азық-түлік алдындағы чек-парағы

  • Мерзімдер шақырулар арқылы таратылады; SLO ≤ жиынтық ұзақтығы.
  • Джиттермен backoff алгоритмі; параметрлері жүктеме тестімен валидацияланған.
  • Сәйкестік: жазбалар үшін кілттер/журналдар/өтемақылар.
  • Ретрай-саясаткерлер оқу және жазу үшін ерекшеленеді; respect `Retry-After`.
  • Ретрайлардың бәсекелестігі және әрекеттердің жалпы саны шектеулі.
  • circuit breaker және rate limits жүйесімен біріктіру теңшелді.
  • Телеметрия: тегтер, метрика, себептер логы; p95/p99 дашбордтар, ретраялардан кейінгі табыстардың үлесі.
  • Тапсырмалар үшін «дауыл» және латенттілік, DLQ сынақтары.
  • Клиенттерге арналған құжаттама: кодтар/тақырыптар, backoff мысалдары және болдырмау.

16) Типтік қателер

Таймаусыз/мерзімсіз қайталау - «мәңгілік күту».
Джиттерсіз бекітілген үзілістер - синхронды толқындар және DDoS-өздігінен жұмыс істеу.
Іспеттілігі жоқ қауіпсіз жазбалардың ретрайлері - дубль және рассинхронизация.
'Retry-After' және CB сигналдарын елемеу - оқыс оқиғаның өршуі.
caps және admission control болмағандықтан кезектегі тар жерлер.
Ретрайлардың себептері/шешімдері телеметриясының болмауы - «соқыр ұшу».

17) Жылдам рецепттер

API көпшілік оқулары: 3 әрекеттер, 'initial = 100ms', 'max = 1s', full jitter, 5% трафикке дейін hedging.
Сыни жазбалар (төлем): 1-2 әрекет макс, қатаң таймаут, міндетті 'Idempotency-Key', hedging жоқ.
Сыртқы интеграциялар: '429/Retry-After', 'max _ attempts = 3', 'max _ backoff = 2-5s', шығыс ағынының лимиттерін құрметтеу.
Фондық тапсырмалар: delay-backoff (5s → 30s → 2m), DLQ, демпотенттік өңдегіштер.

Қорытынды

Қайталаудың жақсы саясаты - бұл жедел қалпына келтіру мен бақыланатын бас тарту арасындағы теңгерім. Дедлайндық, демпотенттік, джиттермен экспоненциалды backoff, бәсекелестікті шектеу және инфрақұрылым сигналдарын құрметтеу ретрацияны «дауылдан» сенімділікті арттыру және SLO-ны ұстап тұру құралына айналдырады.

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Telegram
@Gamble_GC
Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.