五個關鍵的API啟動集成錯誤
錯誤1。No Idementity and 「Storm」 Retrae
癥狀:訂單/付款單、金額差異、有爭議的退款、DLQ異序上升。
根:重新交付查詢/webhook和網絡flappi-正常。如果「創建/註銷」操作不是偶然的,則retrai會增加損壞。
如何正確
Idempotency-Key/'operation_id'對所有不安全方法(POST/PATCH)。
通過「operation_id」在DB中唯一索引。重播-返回過去的結果。
Webhooks通過Inbox表(「event_id+signature」上的dedupe)。出站事件是Outbox。
Retrai:最多1-2次,參展商+jitter,僅用於安全操作。
HTTP約定(示例):http
POST /v1/payments
Idempotency-Key: ik_f35a2
Content-Type: application/json
{"amount": 5000, "currency": "EUR", "source": "card_..."}sql
ALTER TABLE payments ADD CONSTRAINT uniq_op UNIQUE (operation_id);python for i in range(2):
try: return call_api(payload, timeout=0.6)
except Timeout:
sleep(0.05 2i + random.uniform(0, 0.05))
raise UpstreamUnavailable- 所有「貨幣/創建」邏輯都具有「operation_id」和uniq索引。
- 僅通過Inbox與Idempotent Worker收件箱收件箱。
- 客戶端SDK自動設置Idempotency-Key。
錯誤2。超時/中繼對SLO: 依賴性的「過熱」
癥狀:p95突然漂浮,隊列上升,巡回休息員「飛濺」。
根:通用響應SLO為400-600毫秒,而外部API的超時時間為1-2秒,至今仍為3 ×。你做的時間比你能做的時間長,並且通過重復來攻擊成癮。
如何正確
預算時間:如果SLO 400毫秒,則上遊超時:250-300毫秒;請求的總超時時間≤ SLO。
Limits/Backpressure:每個依賴項的調用信號燈/工作池。429/503 →立即溢出。
巡回賽決勝局:在超時/5xx處處於「開放」狀態,「半開放」處方。
管理控制:限制並行(每個線程,在endpoint/PSP)。
示例(Go):go sem:=make(chan struct{},64)//競爭限制PSP func callPSP(ctx context。Context, req Req) (Res, error) {
select {
case sem <- struct{}{}:
defer func(){ <-sem }()
c, cancel:= context.WithTimeout(ctx, 300time.Millisecond)
defer cancel()
return psp.Do(c, req)
default:
return Res{},ErrBusy/立即拒絕代替沒有結束的隊列
}
}- 超時時間短於SLO;retrai ≤ 2;有一個搖擺人。
- 外部API的池/信號器;帶有度量的電路斷路器。
- 在「繁忙」路線上,我們返回429/Retry-After而不是保持連接。
錯誤3。弱安全性: webhook簽名,秘密,TLS
癥狀:「陌生人」webhooks通過,密碼/博客中的秘密,MITM風險。
根:沒有簽名/新鮮度檢查,env文件中存在秘密,舊TLS和弱頭。
如何正確
Webhooks簽名HMAC-SHA256+'X-Timestamp'(窗口≤ 5-10分鐘),嚴格的簽名比較。
用於關鍵集成或IP allow-list的mTLS。
通過Vault/Cloud KMS輪換秘密;最低限度的權利;減法審核。
TLS 1.2/1.3 only,HSTS,正確的CORS(窄源列表)。
簽名驗證(Python):python def verify(sig_hdr, ts_hdr, body, secret):
if abs(time.time() - int(ts_hdr)) > 600: raise Expired()
calc = hmac.new(secret, (ts_hdr + "." + body).encode(), hashlib.sha256).hexdigest()
if not hmac.compare_digest(calc, sig_hdr): raise BadSig()- 所有webhooks均已簽名並經過驗證;清新窗口是有限的。
- KMS/Vault的秘密,有輪換和審計。
- TLS/HSTS包括在內;CORS點點;IP/mTLS在適當時。
錯誤4。合同漂移: 計劃「過著自己的生活」
癥狀:prod「僅在部分客戶中」下降,在日誌中下降500/422,不同版本的SDK和API爭論不休。
根: 沒有嚴格的合同描述,背面不兼容的更改,「安靜」的字段,不同的含義在相同的標題.
如何正確
合同一:OpenAPI/AsyncAPI+服務器/客戶端生成;活動-Avro/Protobuf+Schema Registry。
轉化:「v1 → v2」(URI/頭部),deprecation計劃,grace時期。
Backward-compat:僅對次要版本進行附加更改;禁止刪除/重命名而不使用v-bump。
合同測試:Pact/Buf-提供商/領事在CI進行驗證。
示例:yaml
OpenAPI:amount_minor次要單位中的清晰和類型:
type: integer minimum: 0 description:以貨幣最低單位計算的總和(整數)- 合同存儲在git中,CI在不兼容時驗證/斷開。
- 事件模式寄存器,「back/forward」兼容性。
- 更改塢頁、剝離日期、合作夥伴測試臺。
錯誤5。「盲人」發射: 沒有指標/標誌/預告片和沙箱
癥狀:「什麼都看不見」,支持被淹沒,debag被賣掉。
根:不包括觀察力,沒有合成物,沙盒被「言語」測試。
如何正確
RED/USE度量標準:rate/error/latency在每個endpoint,路線/方法。
相關性:所有邏輯和答案中的「trace_id」;zapros↔vebkhuk韌帶。
合成:健康樣本(login/deposit-sand),webhooks的T+60 SLA監測。
沙箱/站點:完全隔離的鑰匙/域,虛構的PSP,記錄「不屬於報告」。
使用trace ID的響應:http
HTTP/1.1 202 Accepted
Trace-Id: 7f2b3d8e9c1a4
Location: /v1/ops/req_42/status- RED/USE度量標準,dashbords,alerta(癥狀+原因)。
- 終結軌道;JSON logs,沒有PII,帶有「trace_id」。
- 主要區域的合成品;沙箱是強制性的,鑰匙是不同的。
Prelounch計劃(T-7 → T-0)
T-7天:- 最終合同掃描:是否沒有不兼容的更改;凍結電路。
- 秘密/證書:檢查輪換、訪問、KMS策略。
- 合成24 × 7,Alertes綁在電話上。
- 負荷迷你運行(burst 2-5 min): p95/池/綠區隊列。
- DRY-RUN webhook(重播,5xx,jitter),DLQ檢查。
- 合作夥伴的「電話簿」:L1/L2聯系人,戰爭室頻道。
T-0:
SLO門的金絲雀流量為5% → 25% → 50%;已準備好回滾。
包括基於風險碼頭的殺手-switch/feature-flags。
戰爭室處於活動狀態,準備了模板狀態。
Rollback計劃(如果出了問題)
1.刪除到先前穩定版本/路線的流量。
2.禁用ficheflagom有爭議的更改。
3.穩定隊列/池,在「暴風雨」中停止撤退。
4.後事件:收集時間線,根,任務(虛構前鋒/合同小說)。
啟動自檢表(短)
常見問題「如果……怎麼做」
……提供商不支持Idempotency-Key?
儲存'hash (body)'+'partner_request_id'並輸入您的等效性。
……webhooks有時「提前」回答?
按「operation_id」縫合,暫時保持「未知→重新發現」狀態;定期reconciler將關閉差異。
……需要支持老客戶和新客戶嗎?
轉化endpoint 's ('/v1'和'/v2'), 通過標題/URI進行路由,保持最少N個月的後端兼容性。
二.總結
集成的失敗幾乎總是相同的:沒有冪等性,超時和後退,webhook簽名弱,合同漂移和缺乏可見性。預先確定合同,啟用可觀察性,放置限制/becpresher,簽署所有外部交互並啟動合成。然後,即使合作夥伴失敗,您的版本仍然可以管理-沒有在後臺丟失的錢,也沒有整個團隊的不眠之夜。
