التكامل المتين مع SMPP انضباط تشغيلي لا مجرد وحدات PDU صحيحة: اختر نمط الربط الصحيح، وأدِر sequence_number والنافذة بعناية، وأعِد المحاولة مع تباطؤ تدريجي (backoff) وتشويش زمني (jitter)، واجعل الإرسال آمنًا عند التكرار (idempotent) لتجنّب الفوترة المزدوجة، وأقرّ كل deliver_sm، وأعِد الاتصال بنظافة عند الفشل. أتقِن هذه فتتولى تفاصيل البروتوكول نفسها.
bind_transceiverفتح الجلسة والمصادقة عليهاbind_transceiver_respتم قبول الجلسةsubmit_smإرسال رسالةsubmit_sm_respتم القبول، وإعادة معرف الرسالةdeliver_smإيصال استلام أو رسالة واردةdeliver_sm_respتم التأكيدenquire_linkإشارة Keepalive أثناء الخمول
استراتيجية الربط
فضّل ربط transceiver حيثما يسمح المزوّد، كي يحمل اتصال واحد الإرسال والاستقبال ويبسّط ربط DLR. اتفق على عدد عمليات الربط المتزامنة وإنتاجية كل ربط (TPS) مع المزوّد كتابةً قبل التوسّع. أكّد الإصدار المتفاوَض عليه من bind_resp، وعالِج إخفاقات الربط صراحةً — أعِد المحاولة على الحالات العابرة من نوع ESME_RALYBND، لكن عامِل ESME_RINVPASWD/ESME_RINVSYSID كأخطاء إعداد قاتلة بدل التكرار في حلقة.
sequence_number والنافذة
أسنِد sequence_number متزايدًا اطّرادًا (من 1 إلى 0x7FFFFFFF ثم يلتف) واستخدمه لربط كل استجابة بطلبها. تتبّع الطلبات المعلَّقة في خريطة مفهرسة بـ sequence_number مع مهلة، كي تُكتشَف استجابة لم تصل قط. احترم النافذة: حدّد وحدات PDU الطائرة غير المُقرّة وأوقِف الإرسال حين تمتلئ بدل الإطلاق أعمى، ما يطلق الخنق.
| الحالة | لماذا |
|---|---|
| خريطة الطلبات المعلقة (بواسطة sequence_number) | ربط الاستجابات، واكتشاف حالات انتهاء المهلة |
| عداد إشغال النافذة | الضغط العكسي قبل ESME_RTHROTTLED |
| مفتاح عدم التكرار (idempotency key) لكل رسالة منطقية | منع عمليات الإرسال المكررة عند إعادة المحاولة |
| حالة الربط (bind) + وقت آخر enquire_link_resp | اكتشاف الجلسات الميتة |
إعادة المحاولة والتباطؤ التدريجي ومنع التكرار (idempotency)
أعِد المحاولة على الإخفاقات العابرة (ESME_RMSGQFUL وESME_RTHROTTLED وأخطاء النظام والمهل) بتباطؤ أسّي (exponential backoff) وتشويش زمني (jitter) كي لا تتزامن عواصف إعادة الاتصال عبر العمّال. لا تعِد المحاولة على الأخطاء الدائمة (عنوان غير صالح، كلمة مرور غير صالحة). والأهم، اجعل الإرسال حياديًا: أرفِق مرجعًا خاصًا بك (مثلًا عبر user_message_reference) وأزِل التكرار، كي لا تؤدي إعادة محاولة بعد مهلة غامضة إلى فوترة أو تسليم مزدوج.
معالجة إيصالات التسليم
اطلب registered_delivery فقط حيث تستهلك الإيصالات. أجب دائمًا بـ deliver_sm_resp فورًا وعالِج بشكل غير متزامن. اربط الإيصالات بمعامل receipted_message_id، موحِّدًا صيغتي المعرّف السداس عشرية والعشرية، وأغلِق الرسالة فقط على stat نهائية. طابِق رموز err الشبكية على تصنيف موحَّد كي تكون الجودة قابلة للمقارنة عبر المسارات. عامِل الإشعارات الوسيطة بمعزل عن الحالات النهائية.
إبقاء الاتصال نشطًا وإعادة الاتصال
أرسِل enquire_link على مؤقّت خمول وعامِل الاستجابة المفقودة كجلسة ميتة. وعند أي قطع، أعِد الاتصال مع تباطؤ تدريجي وتشويش زمني بدل التكرار في حلقة سريعة. وعند إعادة الاتصال، استأنف من حالة نظيفة: أعِد الربط، وأعِد تعيين خريطة الطلبات المعلَّقة، واعتمد على الحيادية لإعادة إرسال أي شيء كان طائرًا بأمان. راقِب حالة الربط وإشغال النافذة وزمن الإرسال/الـ DLR ومعدّلات رموز الأخطاء، ونبّه على جميعها.
الأسئلة المتكررة
كيف ينبغي أن أسنِد sequence_number؟
استخدم عدّادًا متزايدًا اطّرادًا من 1 حتى 0x7FFFFFFF ثم يلتف. احتفظ بخريطة لأرقام sequence_number المعلَّقة مع مهل كي تربط كل استجابة وتكتشف الطلبات التي لم تحصل على استجابة قط.
كيف أتجنّب الفوترة المزدوجة عند إعادة المحاولة؟
اجعل الإرسال حياديًا. أرفِق مرجعًا خاصًا بك (مثل user_message_reference)، وأزِل التكرار اعتمادًا عليه، وصمّم إعادة المحاولة بحيث يُتعرَّف على إعادة الإرسال بعد مهلة غامضة ويُكبَح بدل تسليمه وفوترته مرتين.
أي أخطاء SMPP ينبغي أن أعيد المحاولة عليها؟
أعِد المحاولة على العابرة — ESME_RMSGQFUL وESME_RTHROTTLED وأخطاء النظام والمهل — بتباطؤ أسّي (exponential backoff) وتشويش زمني (jitter). لا تعِد المحاولة على الأخطاء الدائمة مثل ESME_RINVDSTADR أو ESME_RINVPASWD؛ بل أصلِح المدخل أو الإعداد.
ماذا ينبغي أن أراقب على ربط SMPP؟
حالة الربط، والزمن منذ آخر enquire_link_resp، وإشغال النافذة، وزمن الإرسال والـ DLR، ومعدّلات الأخطاء لكل رمز (خصوصًا ESME_RTHROTTLED). نبّه على ارتفاع الخنق أو تعطّل النافذة كإشارات مبكّرة للمشكلات.
كيف ينبغي أن أعالج إعادة الاتصال بعد جلسة مقطوعة؟
أعِد الاتصال بتباطؤ أسّي مع تشويش زمني، وأعِد الربط، وأعِد تعيين خريطة الطلبات المعلَّقة، وأعِد إرسال الرسائل الطائرة اعتمادًا على idempotency لمنع الإرسال المزدوج. لا تكرّر إعادة الاتصال في حلقة سريعة أبدًا، فقد يحجب ذلك عنوان IP لديك.
مواصفات المصدر
تستند هذه الصفحة إلى المعايير المنشورة. يفتح في علامة تبويب جديدة.