و RabbitMQ غير واضحة في Yii2 أو لماذا RabbitMQ يكتب لجميع قوائم الانتظار في وقت واحد


أريد أن أشارك المشكلة العملية المتمثلة في تكوين وسيط قائمة انتظار RabbitMQ في Yii2. أحذر القارئ من أنه ليس لدي رأي خبير في العمل مع وسيط قائمة الانتظار هذا ، ولكنني أريد حقًا سد الثغرات الموجودة في وثائق Yii2 وإصلاح نتيجة عذابي. لذا ، إذا واجهت مشكلة في إرسال رسائل إلى جميع قوائم الانتظار الموجودة على خادم قائمة الانتظار ، فأنت توافق على أن هذه مشكلة ولا تفهم سبب حدوث ذلك ، ثم أطلب قطة.

لماذا قد تواجه هذا السلوك؟ على سبيل المثال ، إذا كنت مثلي ، لم تعمل مع RabbitMQ من قبل ، لكنك عملت على سبيل المثال مع Gearman. جيرمان نفسها ، بسيطة مثل السكك الحديدية ( مستعارة من شخصية إنترنت معروفة ومحترمة ). يمكنك إنشاء قائمة انتظار باسم معين ، ووضع البيانات هناك. يقرأ العامل من قائمة الانتظار بنفس الاسم. كل شيء بسيط. حان الوقت الآن لاستخدام تكنولوجيا الأزياء ، دون فهم سبب اختيارك لـ RabbitMQ. ثم أنت سعيد لأن Yii2 لديه تجريد جاهز للعديد من وسطاء قائمة الانتظار الشائعة. تخبر الوثائق الضئيلة التكوين الافتراضي للبدء في كل شيء:

return [ 'bootstrap' => [ 'queue', // The component registers its own console commands ], 'components' => [ 'queue' => [ 'class' => \yii\queue\amqp_interop\Queue::class, 'port' => 5672, 'user' => 'guest', 'password' => 'guest', 'queueName' => 'queue', 'driver' => yii\queue\amqp_interop\Queue::ENQUEUE_AMQP_LIB, // or 'dsn' => 'amqp://guest:guest@localhost:5672/%2F', // or, same as above 'dsn' => 'amqp:', ], ], ]; 

يبدو أن كل شيء بسيط بجنون ، فيما يلي السطر المألوف مع اسم قائمة الانتظار ، قم بنسخه ولصقه وإصلاحه وتشغيله - إنه يعمل! نصنع قوائم انتظار لمكونات النظام الأخرى. نحن بالتوازي مع ما لدينا 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)); 

هذا هو ملزم غير المدارة.

وهكذا ، دون التفكير لفترة طويلة ، توصلنا إلى استنتاج مفاده أنه بالنسبة لكل طابور ، يجب الإعلان عن التبادل ، ثم سيكون الاتصال صحيحًا وستحتوي البورصة على قائمة انتظار واحدة متصلة فقط. بهذه الطريقة نحصل على سلوك جيرمان مماثل. بالمناسبة ، تصف الوثائق بالتفصيل سبب إجراء التبادل ، وكما أفهمها ، أحد الأسباب هو القدرة على ربط عدة قوائم انتظار مع التبادل. لكنني لم أتوصل إلى مثل هذه الحالة عندما تكون هناك حاجة إليها ، يكتب الرجال في التعليقات. واكتب ، هل واجهت الموقف الموصوف أعلاه أو هل أفعل كل شيء خطأ؟

Source: https://habr.com/ru/post/ar439080/


All Articles