خبرة technical

بناء صفوف SMS المضادة مع Redis (Laravel Horizon، Bull، BullMQ)

File waiting resiliente sms redis : دليل تقني مع أمثلة الكود للمطورين في المغرب.

بناء صفوف SMS المضادة مع Redis (Laravel Horizon، Bull، BullMQ)
محتويات هذا المقال
  1. إذا قمت بإرسال رسائل SMS التداولية أو التسويقية مباشرة في نفس الخط الذي يتم إرساله إلى العملاء من خلال HTTP (على سبيل المثال، إذا قررت المستخدم إرسالها، فإنه يتم إرسال رسالة [API SMS](/fr/api-sms-maroc/) المزمع إرسالها، ثم يتم إرسال صفحة الويب) ، فإن الأكاديمية الخاصة بك مجهولة.
  2. لماذا لا يكفي مجرد "ل" في الإنتاج
  3. نموذج Laravel Horizon للرسائل المشتركة (PHP)
  4. مثال Node.js مع BullMQ

إذا قمت بإرسال رسائل SMS التداولية أو التسويقية مباشرة في نفس الخط الذي يتم إرساله إلى العملاء من خلال HTTP (على سبيل المثال، إذا قررت المستخدم إرسالها، فإنه يتم إرسال رسالة [API SMS](/fr/api-sms-maroc/) المزمع إرسالها، ثم يتم إرسال صفحة الويب) ، فإن الأكاديمية الخاصة بك مجهولة.

إذا كان الرسالة SMS المارونية (IAM، الأرجنتيني، inwi) يستغرق 3 ثانية لإجابة بسبب ضغط الشبكة، فإنه يستغرق المستخدم 3 ثانية أمام شاشة بيضاء. أسوأ من ذلك، إذا كانت API غير متصلة مؤقتًا، سيبقى الكتاب الخاص بك، وسوف يظهر المستخدم صفحة خطأ 500، وسوف يختفي SMS إلى الأبد.

من أجل إنتاج قوي ، يجب أن يكون إرسال رسائل SMS دائما متوازنًا من خلال ملف الانتظار التي يتم إدارةها من قبل Redis.

لماذا لا يكفي مجرد "ل" في الإنتاج

دعونا نقول إنك بحاجة إلى توجيه حملة إلى 50 ألف عميل مغربي. سيؤدي سباق "foreach" أو "for" بسيطًا إلى تدمير ذاكرة المورد الخاص بك (Memory Exhaust) وخاصة إلى إطلاق آلية Rate Limiting (Throttling) من API. سوف تحصل على عشرات الآلاف من أخطاء 429 Too Many Requests.

يتم حل هذه المشكلة مع الهيكل العصبي: 1. الخروج (المنتج): تطبيقات الويب الخاصة بك تضع على الفور 50،000 وظيفة (العملات) التي تحتوي على الرقم والرسالة في قاعدة Redis (في الذاكرة، سريعة للغاية).الصفحة الإلكترونية تتردد على العملاء في أقل من 50ms.2. ممارسة (المستهلك / العامل): عملية في الخلفية "تقسيم" طلبات Redis في سرعة خاصة (على سبيل المثال: 50 طلباً في الدقيقة) للبقاء دون حد مفتاح API الخاص بك.

نموذج Laravel Horizon للرسائل المشتركة (PHP)

في بيئة PHP/Laravel، Horizon (مشاركة مع Redis) هو أداة مثالية، ويمكنك بسهولة تثبيت صفوف محددة، ودمج، ومقاطع الفيديو.

1.إعداد Throttling (App/Jobs/SendSmsJob.php): بدلاً من تدمير API، سنقوم بتحفيز عميل Laravel لا تتجاوز 50 طلبًا في الدقيقة، مع إدارة التحويلات تلقائيًا.

php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\Middleware\RateLimited;

class SendSmsJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $contact;
    public $message;

    // Définir la limite de débit : "sms-api" (défini dans AppServiceProvider)
    public function middleware()
    {
        return [new RateLimited('sms-api')];
    }

    public function handle()
    {
        // Appel API réel vers EnvoiSMS.ma
        $response = EnvoiSms::send($this->contact->phone, $this->message);
        
        if ($response->failed()) {
            throw new \Exception("Erreur API, Horizon relancera le job selon l'exponential backoff.");
        }
    }
}

2. إزالة الدورات المهمة: في config/horizon.php، قم بتحديد عملية "العملات" المختلفة.العملة واحدة خصيصاً لخط otp_critical (الذي لا ينبغي أن يبطئ أبداً) والعملة الأخرى خصيصاً لخط marketing_bulk (الذي يمكن أن يتحول بسهولة إلى مهمة أساسية).

مثال Node.js مع BullMQ

إذا كنت تستخدم Express أو NestJS، فإن BullMQ (مستقبل Bull) هو المعايير الصناعية المتبعة في Redis لإدارة الملايين من الوظائف.

تحديث الحد الأصلي في BullMQ:

javascript
import { Queue, Worker } from 'bullmq';

// Création de la file d'attente liée à Redis
const smsQueue = new Queue('sms_dispatch', {
  connection: { host: 'localhost', port: 6379 }
});

// Ajout d'un SMS dans la file (Hyper rapide, le client n'attend pas)
await smsQueue.add('send_otp', { phone: '+212600000000', message: 'Code: 1234' });

// Le Worker qui traite l'envoi en respectant les limites de l'opérateur
const smsWorker = new Worker('sms_dispatch', async job => {
  const { phone, message } = job.data;
  
  try {
    await sendSmsViaApi(phone, message); // Votre appel HTTP axios ou fetch
  } catch (error) {
    // Si l'erreur est temporaire (ex: 503), BullMQ relancera le job
    throw new Error('Erreur API, réessayer plus tard.');
  }
}, {
  connection: { host: 'localhost', port: 6379 },
  limiter: {
    max: 50, // Maximum 50 requêtes...
    duration: 60000 // ...par minute, sous la limite de votre clé API (60 à 1 200 req/min selon l'offre).
  }
});

من خلال استخدام هذه الأدوات، أنت لا تضمن فقط أن تكلفة API متوافقة تمامًا، ولكن أبرز ما يميزها هو أنه إذا تم إغلاق جهاز الكمبيوتر الخاص بك في منتصف إرسال الحملة، لا يتم تخزين رسائل SMS التي لم يتم إرسالها في Redis. عند إعادة تشغيل جهاز الكمبيوتر، سوف تستمر العمالة بالضبط حيث تم وقفها.

لماذا تختار EnvoiSMS لشركتك؟

التوصيل نحو المشغلين

مسارات محلية نحو اتصالات المغرب وأورنج وإنوي، مع تحويل تلقائي بين المسارات وإرسال حالة التسليم عبر webhook.

تحسين الميزانية

واجهة برمجة تطبيقات WhatsApp Business ابتداءً من 0.65 درهم لكل رسالة. أفضل عائد على الاستثمار.

سيادة البيانات (CNDP)

استضافة ومعالجة متوافقة تماماً مع لوائح حماية المعطيات ذات الطابع الشخصي CNDP.

كيف تتابع التوجيه على شبكات IAM وInwi وOrange؟
تُرسل مساراتنا المحلية نحو اتصالات المغرب (IAM) وأورنج وإنوي، مع تحويل تلقائي بين المسارات، حالة التسليم من المشغل لكل رسالة عبر webhook. ويتوقف زمن التسليم على مشغل المستلم وشبكته.
كيف تدير المنصة تنسيق الأرقام المغربية؟
يقوم EnvoiSMS تلقائيًا بتسوية الأرقام المدخلة (06..., 07..., 00212...) إلى معيار E.164 (+212) لتجنب أي فشل في التسليم.

مقالات مقترحة

تنسيق الرسائل القصيرة في المغرب: فواصل الأسطر، تشفير GSM-7 مقابل UCS-2 وتحسين التكلفة
technical

تنسيق الرسائل القصيرة في المغرب: فواصل الأسطر، تشفير GSM-7 مقابل UCS-2 وتحسين التكلفة

تنسيق واتساب للأعمال في المغرب: نص معزز ورموز تعبيرية وأزرار تفاعلية
technical

تنسيق واتساب للأعمال في المغرب: نص معزز ورموز تعبيرية وأزرار تفاعلية

التحقق عبر واتساب بنقرة واحدة وتعبئة تلقائية One-Tap Autofill OTP في المغرب
technical

التحقق عبر واتساب بنقرة واحدة وتعبئة تلقائية One-Tap Autofill OTP في المغرب