أريد أن أشارك المشكلة العملية المتمثلة في تكوين وسيط قائمة انتظار RabbitMQ في Yii2. أحذر القارئ من أنه ليس لدي رأي خبير في العمل مع وسيط قائمة الانتظار هذا ، ولكنني أريد حقًا سد الثغرات الموجودة في وثائق Yii2 وإصلاح نتيجة عذابي. لذا ، إذا واجهت مشكلة في إرسال رسائل إلى جميع قوائم الانتظار الموجودة على خادم قائمة الانتظار ، فأنت توافق على أن هذه مشكلة ولا تفهم سبب حدوث ذلك ، ثم أطلب قطة.
لماذا قد تواجه هذا السلوك؟ على سبيل المثال ، إذا كنت مثلي ، لم تعمل مع RabbitMQ من قبل ، لكنك عملت على سبيل المثال مع Gearman. جيرمان نفسها ، بسيطة مثل السكك الحديدية (
مستعارة من شخصية إنترنت معروفة ومحترمة ). يمكنك إنشاء قائمة انتظار باسم معين ، ووضع البيانات هناك. يقرأ العامل من قائمة الانتظار بنفس الاسم. كل شيء بسيط. حان الوقت الآن لاستخدام تكنولوجيا الأزياء ، دون فهم سبب اختيارك لـ RabbitMQ. ثم أنت سعيد لأن Yii2
لديه تجريد جاهز للعديد من وسطاء قائمة الانتظار الشائعة. تخبر الوثائق الضئيلة التكوين الافتراضي للبدء في كل شيء:
return [ 'bootstrap' => [ 'queue',
يبدو أن كل شيء بسيط بجنون ، فيما يلي السطر المألوف مع اسم قائمة
الانتظار ، قم بنسخه ولصقه وإصلاحه وتشغيله - إنه يعمل! نصنع قوائم انتظار لمكونات النظام الأخرى. نحن بالتوازي مع ما لدينا php يمكن. الالتزام ، ادفع بالرضا وضعنا المهمة في ضمان الجودة ونذهب لقراءة هابر (
في استراحة الغداء ).
هنا ، على الأكثر إثارة للاهتمام ، مقاطعة سؤال وجواب في الدردشة تقاطعنا ، وتقول إن هناك شيئًا غريبًا يحدث. لسبب ما ، يتم تكرار البيانات التي يكتبها العمال (العاملون). ماذا ماذا لا يمكن أن يكون هكذا. نذهب للتحقق من السجلات. نرى أن الرسالة تتم كتابتها إلى قائمة الانتظار ، والتي يتم تحديد قائمة الانتظار بشكل صحيح ، تم استلام الدالة jobId. لا ، لا ، ليس لدينا أي أخطاء. نكتب ضمانات جودة راضية ، والتحقق مرة أخرى ، وهذا لا يمكن أن يكون ، ونحن في حالة جيدة.
حرفيًا بعد نصف ساعة ، تم صرف انتباهنا مرة أخرى ، وكرر الخطأ ، ثم وقع إشعار على الصابون - تم نقل المهمة إلى العمل. حسنًا ، أنا مبرمج ، الآن سنكتشف ذلك. RabbitMQ ، على عكس Gearman ، لديه واجهة ويب بها الكثير من المعلومات حول الخادم. تبدو هذه المعجزة كما يلي:

نلقي بضع رسائل أخرى في قائمة الانتظار ، ونرى في webmord أن رسائلنا تصل ومعالجتها من قبل العامل. تلاحظ نظرة عادية أنه عندما نلقي رسالة في قائمة الانتظار ، فإن مخطط "معدلات الرسائل" ينتقل في جميع قوائم الانتظار.

نتحقق من التكوين مئات المرات ، ونعيد قراءة الوثائق الضئيلة الخاصة بـ Yii. لقد فعلنا كل شيء بشكل صحيح. نذهب لقراءة الوثائق على موقع الأرنب. بعد بضع دقائق من التجول في الظلام ، نتعثر في
البرنامج التعليمي . بعد الفقرة الأولى مباشرة ، تعرفنا على سبب سوء فهمنا - التبادلات. لن أكرر الوثائق بإيجاز شديد.
في RabbitMQ ، لا نكتب رسالة إلى قائمة الانتظار ، نكتبها للتبادل ، وهو نوع من الوكيل يتلقى رسائلنا في نهاية واحدة ويتواصل مع قوائم الانتظار على الخادم في الطرف الآخر. إنه في وسعه تحديد أي قائمة انتظار لوضع بياناتنا. ومن المثير للاهتمام ، أنه لا يوجد سطر واحد حول هذا الأمر في وثائق Yii. للوهلة الأولى ، ليس من الواضح كيفية تكوين التبادل ، فنحن
نغطس في الشجاعة وفي
بائع الملفات
/ yiisoft / yii2-queue / src / drivers / amqp_interop / Queue.php: 176 ، نجد خاصية نعتز بها. هنا يجب أن أقول أن هناك العديد من السائقين ل RabbitMQ ، في حالتي
يتم استخدام enqueue / amqp-lib . وضعنا
exchangeName ، اختبار ، لا شيء يتغير. حسنًا ، نحن مثل مهندس روسي حقيقي ، أولاً نحاول ، ثم نذهب بعناية إلى قراءة الوثائق مرة أخرى. لقد قرأناه بعناية مرة أخرى ، ثم انتقل إلى وجه الأرنب على الويب ونرى ما يلي:

ترتبط العديد من قوائم الانتظار لدينا مع نفس التبادل. البنغو! هنا هو السبب ، واحد "لكن" ، أنا لم ألزمهم. نذهب مرة أخرى إلى القناة
الهابطة للسائق ، ونجد سطر طريقة
setupBroker 392
$this->context->bind(new AmqpBind($queue, $topic));
هذا هو ملزم غير المدارة.
وهكذا ، دون التفكير لفترة طويلة ، توصلنا إلى استنتاج مفاده أنه بالنسبة لكل طابور ، يجب الإعلان عن التبادل ، ثم سيكون الاتصال صحيحًا وستحتوي البورصة على قائمة انتظار واحدة متصلة فقط. بهذه الطريقة نحصل على سلوك جيرمان مماثل. بالمناسبة ، تصف الوثائق بالتفصيل سبب إجراء التبادل ، وكما أفهمها ، أحد الأسباب هو القدرة على ربط عدة قوائم انتظار مع التبادل. لكنني لم أتوصل إلى مثل هذه الحالة عندما تكون هناك حاجة إليها ، يكتب الرجال في التعليقات. واكتب ، هل واجهت الموقف الموصوف أعلاه أو هل أفعل كل شيء خطأ؟