Сиёсати такрорӣ ва бозгашт
Такрори такрорӣ (такрорӣ) барои наҷот ёфтан аз хатогиҳои муваққатӣ кӯмак мекунад, аммо агар нодуруст танзим карда шуда бошад, онҳо тармаҳои трафик, такрори амалиёт ва афтидани садамаҳоро ба вуҷуд меоранд. Сиёсати боэътимоди бозгашт ҳамеша аз мӯҳлатҳо/таъхирҳо оғоз меёбад, idempotency-ро ба назар мегирад ва backoff + jitter-ро истифода мебарад.
1) Принсипҳои асосӣ
1. Вақти аввал/мӯҳлати ниҳоӣ, баъд ақибнишинӣ. Такрор бидуни маҳдудияти вақт танҳо нокомиро дароз мекунад.
2. Retray - танҳо барои амалиёти бехатар/idempotent. Барои шахсони хатарнок - тавассути калидҳои idempotency ва кафолати муомилот.
3. Backoff ҳатмист. Ба монанди экспоненсиалӣ ё GCRA бо jitter ба desynchronize мавҷҳо.
4. Шумораи кӯшишҳо ва вақти умумии буҷаро маҳдуд кунед. SLO-и корбарро тарк накунед.
5. Эҳтиром ба сигналҳои инфрасохтор. '429/503' + 'Retry-After', ҳолати танаффус, маҳдудиятҳои навбат.
2) Мӯҳлатҳо ва мӯҳлатҳо (паҳнкунии мӯҳлат)
Вақти таъхирро дархост кунед <Хидмати SLO, мӯҳлати ниҳоӣ занҷирро паҳн мекунад (сарлавҳаҳои HTTP/GRPC контекст).
Таркиби вақт: ҳамагӣ (кӯшиши аввал + бозгашт + баъд) ≤ мӯҳлати корбар.
Вақтҳои гуногун барои хондан/сабтҳо: сабтҳо кӯтоҳтар ва сахттар мебошанд; хондан ба хеджинг иҷозат медиҳад.
3) Такрори беасос ва бехатар
Хонда мешавад (GET/idempotent RPC): бехатар бо '5xx', 'UNAVAILABLE', танаффуси шабака такрор карда мешавад.
Сабтҳо:- Истифодаи 'Idempotency-Key' (HTTP) ё дархост-ID дар сарҳад; сервер бояд дубора сабт кунад.
- Коркунони idempotent нависед: "upsert", "ҳадди аққал як бор" + ҷуброн (saga).
- Пардохтҳо/ҳисоббаробаркуниҳои беруна - танҳо бо калидҳои idempotent ва сабти транзаксия.
4) Алгоритмҳои бозгашт
Экспоненсиалӣ: 'base 2 ī кӯшиш', бо 'max _ backoff' маҳдуд карда шудааст.
Jitter ороишӣ (jitter пурра/баробар) - тасодуфӣ дар доираи desynchronize мизоҷон.
Таъхирҳои ба монанди GCRA/Token-Bucket: мутобиқ бо маҳдудиятҳои нархҳо.
Сарҳадҳо: 'ибтидоӣ _ бозгашт' (50-200 мс хонда мешавад); 200-500 мс сабт), 'max _ backoff' (1-5 s), 'max _ elapsed' (масалан, 3-10 s).
Намунаи тавсияшуда бозгашти экспоненсиалӣ + jitter пурра аст.
5) Такрор кунед/Сиёсати тасмимро такрор накунед
Мо такрор мекунем:- Хатогиҳо/таъхирҳои шабака, '429' (эҳтиромона 'Retry-After'), "нарм" '5xx' ('502/503/504'), gRPC 'UNAVAILABLE/DEADLINE _ EXCESTED'.
- '4xx' (ба истиснои '409/429/408' дар баъзе сенарияҳо), хатогиҳои тиҷорат, '401/403', хатогиҳои тасдиқкунӣ, возеҳи 'Do' Retry 'flag.
- '409 Низоъ' - баъзан бо таъхир пас аз ризоият/қуфлҳо такрор карда мешавад.
- '404' for ба таври доимӣ мехонад - як ё ду маротиба бо бозгашти хурд бармегардад.
6) Сарпӯшҳои мувофиқат ва "тӯфони бозгашт"
Маҳдудияти бозпардохтҳои якхела барои як муштарӣ/ба ҳар як иҷорагир/нуқтаи ниҳоӣ.
Маҳдудияти умумии кӯшишҳо барои як дархост (масалан, 2-3).
Нуқтаҳои гармро тавассути назорати қабул суст кунед, то навбатҳоро напартоед.
7) Ҳамкорӣ бо шикастани гардиш ва маҳдудиятҳо
Агар CB кушода бошад, бозпардохтро мустақиман иҷро накунед - ба ақибмонӣ равед ё намунаҳои "нисфи кушода" -ро интизор шавед.
Дар '429' - эҳтиром 'Retry-After'; дар акси ҳол, пушти "мулоим" -ро истифода баред.
Рафторҳо метавонанд шиддатро зиёд кунанд; ҳадди мутобиқшавиро истифода баред ('max _ кӯшишҳо' барои ҳодиса камтар).
8) Протоколҳо ва шартномаҳо
HTTP
Рамзҳо: '408/429/5xx'.
Сарлавҳаҳо: 'Retry-After', оила 'Rate' Limit- ',' Idempotency-Key ',' Request-Id '.
Мизоҷ бояд 'X-Request-Timeout '/' Мӯҳлати ниҳоӣ' (агар ин тавр бошад) фиристад.
GRPC
Контекстро бо мӯҳлат истифода баред; Эҳтиром 'UNAVAILABLE', 'DEADLINE _ EXCESTED', сиёсати бозгардонидани ҳар як усул.
Барои RPC-ҳои idempotent, бозпас гирифтан; барои мутатсияҳо - танҳо бо дастгирии idempotency.
9) Навбатҳо, вазифаҳои пасзамина ва ҳамгироӣ
Ҳадди аққал як маротиба коркардкунандагон → амалҳои idempotent, ихтисороти калидӣ.
Навбати таъхир барои бозгашт байни кӯшишҳо (масалан, 5s/30s/2m).
Навбати мактуби мурда (DLQ) бо маҳдудияти кӯшишҳо ва коркарди дастӣ.
Outbox/CDC - то ки реплейҳо тамомияти транзаксияро вайрон накунанд.
10) Hedging vs Reties
Хеджинг барои хондани танқидӣ дар таъхири дум муфид аст.
Маҳдудият: на бештар аз X% дархостҳо, таъхири оғози файз (масалан, таъхири p95), бекор кардани зиёнкорон.
Барои навиштани амалиётҳо бидуни номутобиқатии сахт ҳиҷобро истифода набаред.
11) Телеметрия ва мушоҳида
Теги: 'иҷорагир _ ид', 'нуқтаи ниҳоӣ', 'кӯшиш', 'қарор' (retry/skip), 'сабаб', 'backoff _ ms', 'deadline _ ms', 'idempotency _ key'.
Нишондиҳандаҳо: ҳиссаи ақибнишинӣ, муваффақият пас аз ақибмонӣ, p95/p99 "то ба охир", шумораи мӯҳлатҳои аз ҳад зиёд, триггери CB.
Гузоришҳои аудит: калидҳои болоии N "ғавғо "/нуқтаҳои ниҳоӣ, таносуб бо 429/503.
12) Озмоиш ва бетартибӣ
Профилҳо: "дид" (таркиш), "тӯфон" (танаффуси оммавӣ), хатогиҳои "часпанда" (ҳар Nth), думҳои ниҳонӣ.
Нокомии Torus limiter/кэш/навбат, соати-skew.
Санҷед, ки давомнокии умумии (кӯшиши + бозгашт) ба 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 бо jitter; параметрҳое, ки бо санҷиши сарборӣ тасдиқ карда шудаанд.
- ID empotence: калидҳо/гузоришҳо/ҷубронпулӣ барои сабтҳо.
- Сиёсати бозгашт барои хондан ва сабт фарқ мекунад; эҳтиром 'Retry-After'.
- Рақобатпазирии бозгашт ва шумораи умумии кӯшишҳо маҳдуд аст.
- Интегратсия бо схемаи барқ ва маҳдудиятҳои суръат танзим карда шудааст.
- Телеметрия: барчаспҳо, ченакҳо, гузоришҳои сабабҳо; панели панели p95/p99, ҳиссаи муваффақият пас аз бозгашт.
- Санҷишҳои "тӯфонҳо" ва думҳои ниҳонӣ, DLQ барои вазифаҳо.
- Ҳуҷҷатҳои муштариён: рамзҳо/унвонҳо, намунаҳои бозгашт ва бекоркунӣ.
16) Хатогиҳои маъмулӣ
Такрори бидуни танаффус/мӯҳлат "интизориҳои абадӣ" мебошанд.
Таваққуфҳои собит бидуни ҷиттер - мавҷҳои синхронӣ ва худидоракунии DD jo
Кашидани сабтҳои хатарнок бидуни номутобиқатӣ - нусхабардорӣ ва desynchronization.
Нодида гирифтани сигналҳои 'Retry-After' ва CB - ҳодисаи шадид.
Мушкилот дар навбат бо сабаби набудани ҳадди аққал ва назорати қабул.
Набудани телеметрияи сабабҳо/роҳҳои ҳалли бозгашт - "парвози нобино".
17) Дорухатҳои зуд
API-и ҷамъиятӣ мехонад: 3 кӯшиши 'ибтидоӣ = 100ms', 'max = 1s', jitter пурра, ҳимоя то 5% трафик.
Сабтҳои интиқодӣ (пардохт): 1-2 кӯшиши максималӣ, танаффуси қатъӣ, ҳатмии 'Idempotency-Key', ҳимоя нест.
Интегратсияҳои беруна: эҳтиром '429/Retry-After', 'max _ truds = 3', 'max _ backoff = 2-5s', маҳдудиятҳои ҷараёни баромад.
Вазифаҳои пасзамина: таъхири бозгашт (5s → 30s → 2m), DLQ, коркардкунандагони idempotent.
Хулоса
Сиёсати хуби такрорӣ мувозинати байни барқароршавии босуръат ва нокомии назоратшаванда мебошад. Мӯҳлатҳо, аблаҳӣ, бозгашти экспоненсиалӣ бо ҷиттер, маҳдуд кардани рақобат ва эҳтироми сигналҳои инфрасохтор бозгаштро аз "тӯфон" ба воситаи баланд бардоштани эътимоднокӣ ва нигоҳдории SLO табдил медиҳанд.