Панҷ хатои муҳими ҳамгироии API ҳангоми оғозёбӣ
Хатои № 1. Не idempotence ва "тӯфони" ақибнишинӣ
Аломатҳо: фармоишҳо/пардохтҳои такрорӣ, номутобиқатӣ дар миқдор, бозгашти баҳснок, огоҳиҳои DLQ меафзоянд.
Реша: таҳвили такрории дархостҳо/webhooks ва flappies шабака муқаррарӣ аст. Агар амалиёти "эҷод/хориҷ кардан" номувофиқ бошад, бозсозӣ зарарро зиёд мекунад.
Чӣ тавр
Idempotency-Key/' operation _ id 'ба ҳама усулҳои хатарнок (POST/PATCH).
Индекси беназир дар пойгоҳи додаҳо барои 'operation _ id'. Бозсозӣ - натиҷаи қаблиро баргардонед.
Webhooks тавассути ҷадвали паёмдони (dedupe by 'event _ id + signature'). Чорабиниҳои берунӣ - Outbox.
Retrai: ҳадди аксар 1-2 маротиба, экспонент + ҷиттер, танҳо барои амалиёти бехатар.
Конвенсияи HTTP (мисол):http
POST/v1/пардохтҳо
Калиди Idempotency: ik_f35a2
Намуди мундариҷа: барнома/json
{"маблағ": 5000, "асъор": "EUR", "манбаъ": "card_..."}sql
Пардохтҳои ALTER TABLE ADD CONSTRAINT uniq_op UNIAL (operation_id);)python барои i дар диапазон (2):
кӯшиш кунед: баргардонидани call_api (сарборӣ, вақти корӣ = 0. 6)
Ғайр аз мӯҳлат:
хоб (0. 05 2i + тасодуфӣ. либоси ягона (0, 0. 05))
баланд бардоштани Upstream дастнорас- Ҳама "мантиқи пулӣ/эҷодӣ" дорои шохиси амалиёт _ id 'ва uniq мебошад.
- Веб-китобҳои воридотӣ танҳо тавассути паёмдони бо коргари idempotent.
- Муштарӣ SDK ба таври худкор Idempotency-Key -ро танзим мекунад.
Хатои рақами 2. Вақтсанҷӣ/бозсозӣ ва SLO: Гармии аз ҳад зиёд
Аломатҳо: p95 ногаҳон шино мекунад, навбатҳо меафзоянд, печутоби ноҳиявӣ "таркиш".
Реша: Ҷамъи SLO-и посух 400-600 мс ва танаффус ба API-ҳои беруна 1-2 с мебошанд ва ҳатто 3-ро бозмедоранд. Шумо аз ҳадди имкон зиёдтар кор мекунед ва шумо бо такрори нашъамандӣ дучор мешавед.
Чӣ тавр
Вақти буҷа: агар SLO 400 мс бошад, мӯҳлати болооб: 250-300 мс; Мӯҳлати умумии дархости ≤ SLO.
Маҳдудиятҳо/ақибмонӣ: семафорҳо/ҳавзи коргарон барои зангҳо ба ҳар як вобастагӣ. Дар як вақт серодам § 429/503.
Қатъи гардиш: 'кушода' бо танаффус/5xx, 'нисфи кушода'.
Назорати дохилшавӣ: мувофиқати маҳдудро (барои як ришта, дар нуқтаи ниҳоӣ/PSP) маҳдуд кунед.
Намуна (Гузаштан):go sem: = make (chan struct {}, 64 )//маҳдудияти рақобат ба PSP func call .PSP (контексти ctx). Контекст, req Req) (Res, хато) {
интихоби {
парвандаи sem <- struct {} {}:
defer func () {<-sem} ()
в, бекор кунед: = контекст. Бо Timeout (ctx, 300 вақт). Миллисекунд)
defer бекоркунӣ ()
бозгашт psp. Иҷро кунед (c, req)
пешфарз:
ба ҷои навбати беохир, Res {} -ро баргардонед, нокомии фаврӣ//фаврӣ
}
}- Вақт аз SLO кӯтоҳтар аст; retrai ≤ 2; ҷиттер ҳаст.
- Ҳавзҳо/семафорҳо ба API-ҳои беруна; шикастани ноҳиявӣ бо ченакҳо.
- Дар хатсайрҳои банд мо 429/Retry-After бармегардем, пайвастшавиро давом намедиҳем.
Хатои рақами 3. Амнияти заиф: Имзоҳои Webhook, Асрори, TLS
Аломатҳо: веб-китобҳои "одамони дигар" мегузаранд, асрори код/журнал, хатари MITM.
Реша: санҷиши имзо/тару тоза нест, асрори файлҳои env, TLS-и кӯҳна ва сарлавҳаҳои суст зиндагӣ мекунанд.
Чӣ тавр
Имзои webhooks HMAC-SHA256 + 'X-Timestamp' (тиреза ≤ 5-10 дақиқа), муқоисаи қатъии имзо.
MTLS барои ҳамгироии интиқодӣ ё IP-рӯйхати иҷозат.
Гардиши асрҳо тавассути Vault/Cloud KMS; ҳуқуқҳои ҳадди аққал; аудити тарҳ.
TLS 1. 2/1. 3 танҳо, HSTS, CORS дуруст (рӯйхати манбаъҳои танг).
Санҷиши имзо (Python):санҷиши python def (sig_hdr, ts_hdr, бадан, махфӣ):
агар abs (вақт. вақт () - int (ts_hdr))> 600: баланд бардоштани мӯҳлати истифода ()
calc = hmac. нав (махфӣ, (ts_hdr +. "" + бадан). рамз (), ҳашлиб. ша256). hexdigest ()
агар хмак набошад. compare_digest (calc, sig_hdr): баланд бардоштани Бад Сиг ()- Ҳамаи webhooks имзо ва тасдиқ карда мешаванд; равзанаи тару тоза маҳдуд аст.
- Асрҳо дар KMS/Vault, гардиш ва аудит мавҷуданд.
- TLS/HSTS фаъол аст; Нуқтаи CORS; Агар мувофиқ бошад, IP/MTLS.
Хатои рақами 4. Кашиши шартнома: нақшаи "зиндагии худро" гузаронд
Аломатҳо: prod "танҳо дар баъзе мизоҷон афтод", 500/422 дар гузоришҳо, версияҳои гуногуни SDK ва API баҳс мекунанд.
Реша: тавсифи қатъии шартномаҳо, тағироти номувофиқ ба қафо, майдонҳои "ором", маъноҳои гуногун барои ҳамон номҳо вуҷуд надоранд.
Чӣ тавр
Шартнома-аввал: Open барои чорабиниҳо - Феҳристи Avro/Protobuf + Schema.
Версия: 'v1 → v2' (URI/сарлавҳа), нақшаи дуршавӣ, давраи файз.
Қафо-компат: танҳо тағироти иловагӣ дар варақаҳои хурд; бе v-bump нест карда намешавад/тағир дода намешавад.
Санҷишҳои шартномавӣ: Pact/Buf - провайдер/супер дар CI санҷида мешаванд.
Намунаҳо:ямл
Кушодани API: намуди равшани маблағ дар воҳидҳои amount_minor хурд:
намуд: ҳадди ақали адад: 0 тавсиф: Ҷамъи воҳидҳои ҳадди ақали асъор (адад)- Шартномаҳо дар git нигоҳ дошта мешаванд, CI агар номувофиқ бошад, тасдиқ/танаффус мекунад.
- Схема барои рӯйдодҳо, мутобиқати "бозгашт/ба пеш" сабт мекунад.
- Саҳифаи docking тағирот, санаи ихроҷ, курсии санҷишӣ барои шарикон.
Хатои рақами 5. Оғози "нобино": ченакҳо/гузоришҳо/роҳҳо ва қуттиҳо нестанд
Аломатҳо: "ҳеҷ чиз намоён нест", дастгирӣ пур мешавад, debag - дастҳо дар prod.
Реша: мушоҳида дохил карда нашуд, синтетика вуҷуд надорад, қуттича "бо калимаҳо" озмуда шудааст.
Чӣ тавр
Нишондиҳандаҳои RED/USE: суръат/хатогӣ/таъхир дар ҳар як нуқта, бо масир/усул.
Таносуб: 'пайгирӣ _ ид' дар ҳама гузоришҳо ва ҷавобҳо; бастаи zapros↔vebkhuk.
Синтетика: санҷишҳои саломатӣ (қум вуруд/амонат), назорати SLA T + 60 барои вебхукҳо.
Sandbox/марҳила: калидҳо/доменҳои комилан ҷудошуда, PSP-ҳои афсонавӣ, вурудот "ба гузоришҳо дохил карда нашудаанд".
Ҷавоб бо ID пайгирӣ:http
HTTP/1. 1 202 Қабул карда шуд
Trace-Id: 7f2b3d8e9c1a4
Ҷойгиршавӣ :/ v1/ops/req_42/status- Нишондиҳандаҳои RED/USE, панели панелҳо, огоҳиҳо (аломатҳо + сабабҳо).
- Роҳҳои ниҳоӣ; Гузоришҳои JSON, ҳеҷ PII, бо 'trace _ id'.
- Синтетика аз минтақаҳои калидӣ; қуттии регзор лозим аст, калидҳои гуногун.
Нақшаи Prelaunch (T-7 → T-0)
T-7 рӯзҳо:- Санҷиши ниҳоии шартнома: ягон тағироти номувофиқ мавҷуданд; схемаҳоро ях кунед.
- Асрҳо/Шаҳодатномаҳо: ротатсияи санҷиш, дастрасӣ, сиёсати KMS.
- Синтетикаи 24 × 7, огоҳиҳо бо занг баста мешаванд.
- Боркунии мини-давидан (2-5 дақиқа тӯл мекашад): p95/ҳавзҳо/навбатҳо дар минтақаи сабз.
- Webhooks DRY-RUN (такрорӣ, 5xx, jitter), санҷиши DLQ.
- "Китоби телефонӣ" -и шарикон: тамосҳои L1/L2, канали ҳуҷраи ҷанг.
- Трафики канал барои дарвозаҳои SLO 5% → 25% → 50%; бозгашти тайёр.
- Kill-switch/feature-парчамҳо дар хусусиятҳои хатарнок дохил карда мешаванд.
- Хонаи ҷанг фаъол аст, қолабҳои вазъ омода карда мешаванд.
Нақшаи бозгашт (агар ягон хатогӣ рӯй дода бошад)
1. Озод кардани трафик ба версияи/масири қаблии устувор.
2. Тағироти баҳсноки phicheflagро хомӯш кунед.
3. Навбат/ҳавзҳоро мӯътадил кунед, дар тӯфон ақибнишиниро қатъ кунед.
4. Ҳодисаи пас аз ҳодиса: ҷамъоварии ҷадвал, решаҳо, вазифаҳо (ислоҳи пешакӣ/шартномавӣ).
Оғози ҷадвали худсанҷӣ (кӯтоҳ)
Аксар вақт мепурсиданд, ки "чӣ мешавад"...
... оё провайдер Idempotency-Key-ро дастгирӣ намекунад?
'Hash (бадан)' + 'partner _ request _ id' -ро нигоҳ доред ва номутобиқатии худро ворид кунед.
... webhooks баъзан ҷавоби "пеш" меоянд?
Дар ҳолати 'operation _ id' дӯхтан ва муваққатан нигоҳ доштани "номаълум → оштӣ кардан"; мусолиҳаи даврӣ ихтилофотро қатъ мекунад.
... бояд муштариёни кӯҳна ва навро дастгирӣ кунад?
Нуқтаи ниҳоӣ ('/v1 'ва '/v2'), масир бо сарлавҳа/URI, ҳадди аққал N моҳро ба қафо нигоҳ доред.
Хулосаи дубора
Нокомии интегратсия қариб ҳамеша як чиз аст: бе номутобиқатӣ, танаффуси нодуруст ва ақибнишинӣ, имзои заифи вебхукҳо, кашиши шартнома ва набудани намоён. Шартномаҳоро пешакӣ ислоҳ кунед, мушоҳидаҳоро фароҳам оваред, маҳдудиятҳо/рэкпрессерро ҷойгир кунед, ҳама амалҳои берунаро имзо кунед ва синтетикаро идора кунед. Сипас, ҳатто дар сурати нокомии шарикон, раҳоии шумо идорашаванда боқӣ хоҳад монд - бидуни пул дар бозгашт ва бидуни шаби бехобӣ барои тамоми даста.
