المقارنة بين إشعارات Webhook والاستعلام الدوري (Polling) ليست مجرد مقارنة بين وسيلة فورية وأخرى بطيئة. إنها قرار موثوقية يحدد من يكتشف التغيير، وكيف يستعيد النظام ما فاته، وما السجل الذي يحتفظ به الطرفان. قد يصل إشعار Webhook سريعاً لكنه يتكرر أو يتأخر أو يضيع، بينما يستطيع الاستعلام الدوري اكتشاف الحالة المفقودة لكنه يكرر الطلبات ويحتاج مؤشراً آمناً لمتابعة موضع التوقف.
تجمع تكاملات كثيرة بين الطريقتين: إشعار Webhook للتنبيه السريع، واستعلام دوري أو تسوية لاكتشاف ما فات. ابدأ بالحدث التجاري ودرجة الاتساق المطلوبة قبل تفضيل التقنية.
حدد هل تحتاج الحدث أم الحالة
قد تحتاج كل محاولة دفع واسترداد وانعكاس، بينما يكفي في شحنة جلب الحالة الحالية بعد التنبيه. سجل الأحداث وsnapshot الحالة عقدان مختلفان.
حدّد التأخير المقبول والحجم والترتيب ومدة الاحتفاظ وما يحدث إذا توقف أحد الطرفين ساعات. على أساس هذه القيود تختار إشعاراً وارداً أو استعلاماً تزايدياً أو تسوية دورية أو مزيجاً بينها.
افهم ضمان المزود
ترسل خدمات كثيرة الحدث مرة واحدة على الأقل، ولذلك يبقى التكرار احتمالاً طبيعياً، وقد لا تضمن ترتيب أنواع الأحداث. استجابة HTTP ناجحة تعني أن نقطة الاستقبال قبلت الطلب، لا أن قواعد العمل انتهت خلفها.
راجع وثائق إعادة المحاولة والمهلة والتوقيع ومعرف الحدث وإعادة المعالجة والاحتفاظ. لا تستنتج ضمانات التسليم من كلمة Webhook وحدها.
أمّن نقطة الاستقبال
استخدم HTTPS وتحقق من التوقيع بالطريقة التي توثقها الخدمة، وغالباً على محتوى الطلب الأصلي مع طابعه الزمني. لا تحلل المحتوى قبل التحقق. ضع سماحية زمنية معقولة وسجل معرف الحدث لمنع إعادة إرسال طلب قديم.
خزّن الأسرار في إعدادات آمنة ودوّرها بفترة تداخل تسمح بالمفتاحين أثناء الانتقال. يمكن لقائمة عناوين الشبكة المسموحة أن تضيف حماية إذا كانت العناوين ثابتة، لكنها لا تستبدل التوقيع. ولا تسجل الأسرار أو محتوى حساساً كاملاً.
أقر بسرعة وعالج لاحقاً
تتحقق نقطة الاستقبال من أصالة الطلب، وتحفظ الحدث في سجل متين، وتضع مهمة للمعالجة، ثم تعيد الاستجابة المطلوبة ضمن مهلة المزود. استدعاء خدمات داخلية كثيرة قبل الرد يزيد إعادة المحاولات ويربط توافر الأنظمة بعضها ببعض.
استخدم معاملة أو تصميماً ذرياً يمنع الإقرار بحدث لم يُحفظ. يتيح الطابور إعادة المحاولة وفق سياستك ويظهر حجم العمل المتراكم.
اجعل تكرار المعالجة آمناً
استخدم معرف حدث المزود وقيداً فريداً، وأضف معرفاً للعملية التجارية عندما يصل الأثر من أكثر من نوع حدث. إذا توقف منفذ الطابور بعد جزء من التنفيذ، فيجب أن تكون الإعادة آمنة.
منع تكرار الأثر لا يعني تجاهل كل محتوى متشابه؛ فقد يتغير المورد فعلياً عدة مرات. امنع التكرار بهوية الحدث، ثم طبّق انتقال الحالة وفق رقم الإصدار وقواعد العمل.
عالج الترتيب صراحة
قد يصل حدث التحديث قبل حدث الإنشاء، أو يصل فشل قديم بعد نجاح. قارن إصدار المورد أو وقت سريان الحدث إن وفّرهما المصدر. إذا كان التاريخ الكامل ضرورياً فاحتفظ بالأحداث ورتبها، وإذا كانت الحالة الحالية تكفي فاجعل Webhook تنبيهاً لجلب السجل الرسمي.
لا تعتمد على ترتيب الطابور ما لم يضمنه المسار كله. قد يساعد تقسيم العمل بحسب المورد، لكنه لا يغني عن التسوية الدورية.
صنّف حالات إعادة المحاولة
أعد محاولة فشل الشبكة والخدمة بفواصل زمنية متزايدة مع قدر صغير من التفاوت بين المحاولات. لا تكرر طلباً ذا توقيع خاطئ أو محتوى غير صالح بلا نهاية. صنّف الخطأ وحدد عدداً أقصى، ثم انقل ما لم يُحل إلى قائمة مراجعة.
وفّر إعادة معالجة مصرحاً بها تستخدم المعالج نفسه وتسجل الشخص والسبب. تعديل قاعدة البيانات يدوياً ليس طريقة آمنة للاستعادة.
متى يكون الاستعلام الدوري هو الأساس؟
يناسب الاستعلام الدوري مزوداً لا يرسل أحداثاً، أو حالة يكفي تحديثها على فترات، أو API يقدم مؤشراً موثوقاً يمكن استئناف القراءة منه. وقد يكون أبسط لتكامل منخفض الحجم بحدود استخدام واضحة.
استخدم updated-since وpagination وconditional requests. لا تحفظ cursor إلا بعد معالجة الصفحة بأمان. عند استخدام الوقت، أضف overlap للتأخير وتعادل timestamps ثم deduplicate.
تجنّب أخطاء الاستعلام الدوري
طلب كل مورد منفرداً يصنع N+1 ويتجاوز rate limits. اجلب التغييرات على دفعات، ونسق workers حتى لا يعالج اثنان cursor نفسه، واحترم retry headers.
اختبر clock skew وحدود inclusive/exclusive وتغير الصفحات أثناء التصفح والحذف والتحديث بين الصفحات. قد تحتاج مقارنة كاملة دورية إذا لم يكشف العقد كل تغير.
اجمع الطريقتين لاستعادة ما يفوت
استقبل webhooks للسرعة، وشغّل incremental poll أو reconciliation دورياً للبحث عن أحداث مفقودة والتحقق من الحالة النهائية. يمكن أن يحمل webhook معرفاً فقط ثم يجلب النظام المورد الموثوق.
يزيد ذلك الطلبات لكنه يقدم مسار إصلاح. حدد التكرار من أثر العمل وحدود المزود.
أنشئ سجلاً موحداً للأحداث الواردة
يمكن أن يحفظ المزود والمستأجر ومعرف الحدث والنوع والوقت ونتيجة التوقيع ومرجع الحمولة والحالة والمحاولات وتصنيف آخر خطأ والمورد المرتبط. قلل أو شفّر الحمولة حسب الحساسية.
حالات received وprocessing وapplied وignored-with-reason وretrying وneeds-review تعطي التشغيل صورة صادقة. أبق الحدث الخام غير قابل للتعديل وسجل النتائج منفصلة.
راقب النقل والأثر التجاري
مؤشرات النقل تشمل القبول وفشل التوقيع وتأخر queue وretries وdead letters. ومؤشرات العمل تشمل فواتير حدثت ومراجع مجهولة واختلاف مبالغ وتعارض حالات. قد تكون نسبة HTTP 200 ممتازة بينما لا يتغير طلب واحد.
نبه على backlog قديم وفجوات reconciliation وفشل المصادقة. استخدم correlation IDs دون بيانات شخصية أو أسرار.
اختبر المسارات السيئة
اختبر توقيعاً صحيحاً وخاطئاً وtimestamp قديماً وID مكرراً ونوعاً مجهولاً وpayload معطوباً وتأخيراً وترتيباً معكوساً وفشل worker وreplay.
في polling اختبر استئناف cursor وoverlap وpagination وrate limit وفشل صفحة والحذف والتحديث المكرر. حاكِ توقف المزود وتأكد أن العودة لا تغرق API.
تعامل مع إصدارات محتوى الحدث
قد يضيف المزود حقولاً أو يغير إصدار حدث. تجاهل الحقول المجهولة بأمان وتحقق من المطلوبة ووجه الإصدارات المعروفة إلى handlers مناسبة. احتفظ ببيانات تسمح بإعادة حدث قديم بعد تحديث كودك.
عندما ترسل webhooks لعملائك، قدم schema موثقاً ومعرفاً ثابتاً وتوقيعاً وretry وdelivery log وreplay. الموثوقية متبادلة.
اختر لكل حد على حدة
قد يحتاج الدفع أحداثاً سريعة مع تسوية يومية، ويحتاج catalog polling تدريجياً، ويكفي تقرير منخفض المخاطر ليلاً. وثق الخيار والضمان والفشل والمالك لكل تكامل.
تنفذ خدمة التكاملات هذه الأنماط، ويشرح دليل أتمتة الإشعارات كيف تغذي الأحداث الداخلية قنوات خارجية دون ربط منطق العمل بها.
قاعدة النهاية: تنبيه مع إثبات
عامل Webhook بوصفه تنبيهاً لاحتمال حدوث تغيير، وصمّم طريقة لإثبات الحالة أو تسويتها. وعامل الاستعلام الدوري بوصفه مسحاً يمكن استئنافه من دون تخطي سجل أو تكرار أثر تجاري. عندما توثّق الإقرار ومنع التكرار والترتيب وإعادة المحاولة والإصلاح بوضوح، يصبح التكامل قابلاً للتشغيل. أرسل موجز التكامل مع عقد المزود وحالات الفشل المتوقعة.


