GH GambleHub

وب سایت ها و idemotency رویداد

TL ؛ دکتر متخصص

یک webhook خوب یک رویداد امضا شده (HMAC/mTLS)، خلاصه شده و idempotent است که در یک مدل حداقل یک بار با عقب ماندگی نمایی و deduplication در گیرنده تحویل داده می شود. توافق بر روی یک پاکت نامه («event _ id»، «type»، «ts»، «version»، «attempt»، «signature»)، پنجره زمانی (≤5 دقیقه)، کدهای پاسخ، retrays، DLQ و نقطه پایانی وضعیت.

1) نقش و مدل تحویل

فرستنده (شما/ارائه دهنده): تولید یک رویداد، نشانه ها، تلاش می کند تا ارائه تا 2xx، retrait در 3xx/4xx/5xx (به جز صریح «قبول نمی کند»)، منجر DLQ، API پخش را می دهد.
گیرنده (شریک/سرویس شما): پنجره امضا/زمان را بررسی می کند، پردازش dedup و idemotent را انجام می دهد، با کد صحیح پاسخ می دهد ،/وضعیت و/ack را با «event _ id» پخش می کند.

گارانتی: حداقل یک بار گیرنده باید قادر به تکرار و تنظیم مجدد باشد.

2) پاکت از رویداد

json
{
"event_id": "01HF7H9J9Q3E7DYT5Y6K3ZFD6M",
"type": "payout. processed",
"version": "2025-01-01",
"ts": "2025-11-03T12:34:56. 789Z",
"attempt": 1,
"producer": "payments",
"tenant": "acme",
"data": {
"payout_id": "p_123",
"status": "processed",
"amount_minor": 10000,
"currency": "EUR"
}
}

فیلدهای مورد نیاز عبارتند از «event _ id», «type», «version», «ts», «attempt».
قوانین تکامل: اضافه کردن زمینه ها ؛ حذف/تغییر انواع - فقط با «نسخه» جدید.

3) امنیت: امضا و اتصال

3. 1 امضای HMAC (به طور پیش فرض توصیه می شود)

عناوین:

X-Signature: v1=base64(hmac_sha256(<secret>, <canonical>))
X-Timestamp: 2025-11-03T12:34:56Z
X-Event-Id: 01HF7...
رشته کانونی:

<timestamp>\n<method>\n<path>\n<sha256(body)>
با گیرنده چک کنید:
  • abs (در حال حاضر − 'X-Timestamp') ≤ 300 ثانیه
  • 'X-Event-Id' قبل از پردازش (dedup) پردازش نشده است
  • تطابق «X-Signature» (مقایسه ایمن در زمان)

3. 2 اضافه کردن اقدامات

mTLS برای وب سایت های بسیار حساس.
IP/ASN اجازه لیست.
DPoP (اختیاری) برای فرستنده محدود اگر webhook شروع callbacks.

4) Idempotency و deduplication

4. 1 توانمندی رویداد

رویدادی با همان «event _ id» نباید دوباره حالت را تغییر دهد. دریافت کننده:
  • event _ id 'in the idempotent cache (KV/Redis/DB) on TTL ≥ 24-72 ساعت;
  • موجب صرفه جویی در نتیجه پردازش (موفقیت/خطا، مصنوعات) برای بازگشت مجدد.

4. 2 idempotency فرمان (مخاطبین)

اگر webhook مشتری را مجبور کند API را بیرون بکشد (به عنوان مثال، «تأیید پرداخت»)، از «Idempotency-Key» در تماس REST استفاده کنید، نتیجه را در سمت سرویس ذخیره کنید (نتیجه دقیقاً یک بار).

مدل KV (حداقل):

key: idempotency:event:01HF7...
val: { status: "ok", processed_at: "...", handler_version: "..." }
TTL: 3d

5) Retray و عقب نشینی

طرح توصیه شده (نمایی با لرزش):
  • '5s، 15s، 30s، 1m، 2m، 5m، 10m، 30m، 1h، 3h، 6h، 12h، 24h' (سپس روزانه تا N روز)
راه حل های کد:
  • 2xx - موفقیت, توقف retrays.
4xx:
  • '400/ 401/403/404/422' - اگر امضا/فرمت خوب باشد (خطای مشتری) قابل پرداخت نیست.
  • '429' - retrayim توسط 'Retry-After' or برگشت.
  • 5xx/شبکه - retrayim.

هدرهای فرستنده: «User-Agent»، «X-Webhook-Producer»، «X-Attempt».

6) پردازش جانبی گیرنده

شبه خط لوله:
pseudo verify_signature()
if abs(now - X-Timestamp) > 300s: return 401

if seen(event_id):
return 200//idempotent response

begin transaction if seen(event_id): commit; return 200 handle (data )//domain logic mark_seen (event_id )//write to KV/DB commit return 200

Transactionality: برچسب «دیده شده» باید با اثر عملیات (یا پس از تثبیت نتیجه) به صورت اتمی تنظیم شود تا از پردازش دوگانه در شکست جلوگیری شود.

7) تضمین سفارش و عکس های فوری

نظم تضمین شده نیست. از «ts» و «seq »/« version» در «data» برای تأیید ارتباط استفاده کنید.
برای تاخیرهای طولانی/تلفات - اضافه کردن/پخش در فرستنده و/resync در گیرنده (دریافت عکس فوری و دلتاها در پنجره زمان/شناسه).

8) وضعیت، پخش و DLQ

8. 1 نقاط پایانی فرستنده

'POST/webhooks/replay' - توسط لیست 'event _ id' یا توسط پنجره زمان.
'GET/webhooks/events/: id' - بسته منبع و تاریخچه تلاش ها را نشان می دهد.
DLQ: رویدادهای «مرده» (حد مجاز خسته شده است) → ذخیره سازی جداگانه، هشدار.

8. 2 نقاط پایانی گیرنده

'GET/ webhooks/status/:event_id' -' seen = true/false ',' processed _ at ',' handler _ version '.
'POST/webhooks/ack' - (اختیاری) تایید پردازش دستی از DLQ.

9) قراردادهای خطا (پاسخ گیرنده)

http
HTTP/1. 1 422 Unprocessable Entity
Content-Type: application/json
Retry-After: 120
X-Trace-Id: 4e3f...

{
"error": "invalid_state",
"error_description": "payout not found",
"trace_id": "4e3f..."
}

توصیه ها: همیشه یک کد روشن را بازگردانید و در صورت امکان دوباره امتحان کنید. جزئیات امنیتی را گزارش ندهید.

10) نظارت و SLO

معیارها (فرستنده):
  • تحویل p50/p95، میزان موفقیت، retray/event، drop-rate DLQ، سهم 2xx/4xx/5xx، پنجره تاخیر تا 2xx.
معیارها (گیرنده):
  • تأیید نرخ شکست (امضا/زمان)، dup-rate، latency handler p95، 5xx.
معیارهای SLO:
  • تحویل: ≥ 99. 9٪ از رویدادها 2xx <3 c p95 (پس از اولین تلاش موفقیت آمیز) دریافت می کنند.
  • تأیید رمزنگاری: اعتبار امضا ≤ 2-5 ms p95.
  • Dedup: 0 اثرات تکراری (دقیقا یک بار نتیجه در سطح دامنه).

11) امنیت داده ها و حریم خصوصی

هنوز PAN/PII در بدن از webhook انتقال نیست ؛ از شناسه ها استفاده کنید و سپس جزئیات را در برابر یک API مجاز بکشید.
زمینه های حساس ماسک در سیاهههای مربوط ؛ رویدادهای فروشگاه تنها به حداقل، با TTL.
ذخیره و پخش DLQ را رمزگذاری کنید.

12) نسخه و سازگاری

نسخه در 'نسخه' (پاکت) و در حمل و نقل: '/webhooks/v1/payments '.
زمینه های جدید اختیاری هستند ؛ حذف - تنها پس از دوره «غروب».
مستند تغییرات در changelog ماشین قابل خواندن (برای خودکار چک).

13) موارد آزمون (چک لیست UAT)

  • دوباره ارائه همان «event _ id» → یک اثر و «200» به تکراری.
  • امضا: کلید صحیح، کلید نادرست، کلید قدیمی (چرخش)، «X-Timestamp» خارج از پنجره.
  • برگشت: گیرنده می دهد '429' با 'سعی-پس از' → مکث درست است.
  • سفارش: رویدادها... پردازش شده قبل از... ایجاد شده → پردازش صحیح/انتظار.
  • خرابی پایگاه داده در گیرنده بین اثر و 'mark _ seen' → اتمی بودن/تکرار.
  • DLQ و پخش دستی → تحویل موفق.
  • توده «طوفان» (ارائه دهنده بسته می فرستد) → بدون از دست دادن، محدودیت انجام بحرانی خفه نیست.

14) قطعه های کوچک

امضای فرستنده) شبه (:
pseudo body = json(event)
canonical = ts + "\n" + "POST" + "\n" + path + "\n" + sha256(body)
sig = base64(hmac_sha256(secret, canonical))
headers = {"X-Timestamp": ts, "X-Event-Id": event. event_id, "X-Signature": "v1="+sig}
POST(url, body, headers)
بررسی و مقصد) شبه (:
pseudo assert abs(now - X-Timestamp) <= 300 assert timingSafeEqual(hmac(secret, canonical), sig)

if kv. exists("idemp:"+event_id): return 200

begin tx if kv. exists("idemp:"+event_id): commit; return 200 handle(event. data )//domain logic kv. set("idemp:"+event_id, "ok", ttl=259200)
commit return 200

15) خطاهای مکرر

بدون deduplication → اثرات تکرار (refands دو/پرداخت).

Signature without timestamp/window → آسیب پذیری بازپخش

ذخیره یک راز HMAC در همه شرکا.
پاسخ '200' قبل از تثبیت نتیجه → از دست دادن حوادث سقوط.
جزئیات امنیتی «شستشو» را به پاسخ/سیاهههای مربوط.
عدم وجود DLQ/پخش - حوادث غیر قابل حل است.

16) ورق تقلب پیاده سازی

امنیت: HMAC v1 + 'X-Timestamp' + 'X-Event-Id'، پنجره ≤ 5 دقیقه ؛ mTLS/IP اجازه لیست به عنوان مورد نیاز است.
Конверт: 'event _ id', 'type', 'version', 'ts', 'attempt', 'data'.
تحویل: حداقل یک بار، عقب نشینی با jitter، 'Retry-After'، DLQ + پخش API.
Idempotency: KV-cache 24-72 h، تثبیت اتمی اثر + 'mark _ seen'.

قابلیت مشاهده: تحویل، امضا، معیارهای تکراری ؛ ردیابی _ شناسه

مستندات: نسخه، کدهای پاسخ، نمونه ها، چک لیست UAT.

خلاصه

Webhooks مداوم بر روی سه نهنگ ساخته شده است: یک پاکت امضا شده، حداقل یک بار تحویل و پردازش idempotent. قرارداد را رسمی کنید، HMAC/mTLS و پنجره زمان را فعال کنید، retray + DLQ را اجرا کنید و پخش کنید، برچسب های idempotent را ذخیره کنید و جلوه های اتمی را ضبط کنید. سپس رویدادها حتی با خرابی شبکه، قله های بار و «تکرار سرنوشت» نادر قابل اعتماد باقی می مانند.

Contact

با ما در تماس باشید

برای هرگونه سؤال یا نیاز به پشتیبانی با ما ارتباط بگیرید.ما همیشه آماده کمک هستیم!

Telegram
@Gamble_GC
شروع یکپارچه‌سازی

ایمیل — اجباری است. تلگرام یا واتساپ — اختیاری.

نام شما اختیاری
ایمیل اختیاری
موضوع اختیاری
پیام اختیاری
Telegram اختیاری
@
اگر تلگرام را وارد کنید — علاوه بر ایمیل، در تلگرام هم پاسخ می‌دهیم.
WhatsApp اختیاری
فرمت: کد کشور و شماره (برای مثال، +98XXXXXXXXXX).

با فشردن این دکمه، با پردازش داده‌های خود موافقت می‌کنید.