كيفية بناء كتلة عامل ميناء مع الكرفس و RabbitMQ في 10 دقيقة

هناك الكثير من الدروس حول كيفية استخدام الكرفس مع Django أو Flask in Docker. معظمهم عبارة عن دروس تعليمية جيدة للمبتدئين ، لكن هنا ، لا أريد أن أتحدث أكثر عن جانغو ، فقط اشرح كيفية تشغيل الكرفس ببساطة مع RabbitMQ مع Docker ، وإنشاء مجموعات عاملة باستخدام أمر واحد فقط.

بالطبع ، يمكنك إنشاء مجموعات زاحف فعالة معها!

1.فكرة خريطة المنتج والمستهلك

المصدر: test4geeks.com
الكرفس عبارة عن قائمة انتظار مهمة / قائمة انتظار غير متزامنة بناءً على تمرير الرسالة الموزعة. إنه يركز على التشغيل في الوقت الفعلي ، لكنه يدعم الجدولة أيضًا.
يتم تنفيذ وحدات التنفيذ ، التي تسمى المهام ، بشكل متزامن على خوادم فردية أو أكثر باستخدام المعالجة المتعددة أو Eventlet أو gevent. يمكن تنفيذ المهام بشكل غير متزامن (في الخلفية) أو بشكل متزامن (انتظر حتى تصبح جاهزة).

كما ذكرنا أعلاه في الموقع الرسمي ، تعد Celery قائمة انتظار مهمة موزعة ، حيث يمكنك التعامل مع الملايين أو حتى مليارات المهام في وقت قصير.

يتطلب Celery وكيل مراسلة من أجل التعامل مع الطلبات من مصدر خارجي ، وعادة ما يأتي ذلك في شكل خدمة منفصلة تسمى وسيط الرسائل.

هناك العديد من الخيارات المتاحة للوسطاء للاختيار من بينها ، بما في ذلك قواعد البيانات العلائقية وقواعد بيانات NoSQL والمتاجر ذات القيمة الرئيسية وأنظمة المراسلة. هنا ، نختار RabbitMQ لنظام المراسلة. RabbitMQ هو ميزة كاملة ومستقرة ودائمة وسهلة التركيب. إنه اختيار ممتاز لبيئة الإنتاج.

2. تثبيت Docker و Docker- يؤلف

تحقق من البرنامج التعليمي لتثبيت Docker

sudo الحصول على التحديث
sudo apt-key adv - keyserver hkp: //p80.pool.sks-keyservers.net: 80 - recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo apt-add-repository ‘deb https://apt.dockerproject.org/repo ubuntu-xenial main’

قم بتثبيت عامل الإرساء على النحو التالي أو تحقق من البرنامج التعليمي لموقع Docker الرسمي.

sudo apt-get install docker-compose

3. هيكل الكود

هيكل رمز يظهر أدناه

بعد ذلك سأشرح الكود بالتفصيل خطوة بخطوة

celery.py

الوسيطة الأولى لكيلري هي اسم حزمة المشروع ، والتي هي "test_celery".

الوسيطة الثانية هي وسيطة الكلمة الوسيطة ، والتي يجب تحديد عنوان URL للوسيط. هنا باستخدام RabbitMQ.

إشعار: admin: mypass@10.211.55.12: 5672 ، يجب عليك تغييره إلى ما قمت بإعداده لـ RabbitMQ. المستخدم: كلمة المرور @ الملكية الفكرية: منفذ

الوسيطة الثالثة هي الخلفية ، والتي ينبغي تحديد عنوان URL للواجهة الخلفية. يستخدم الخلفية في الكرفس لتخزين نتائج المهمة. لذلك إذا كنت بحاجة إلى الوصول إلى نتائج مهمتك عند الانتهاء ، فيجب عليك تعيين واجهة خلفية لـ Celery. يعني rpc إرسال النتائج مرة أخرى كرسائل AMQP. يمكن العثور على المزيد من خيارات تنسيقات الرسائل هنا.

tasks.py

في هذا الملف ، يمكنك أن ترى أننا نستورد التطبيق المحدد في وحدة الكرفس السابقة ونستخدمه كزخرف لأسلوب مهمتنا. لاحظ أن app.task هو مجرد ديكور. بالإضافة إلى ذلك ، ننام 5 ثوانٍ في مهمتنا longtime_add لمحاكاة مهمة باهظة الثمن.

run_tasks.py

هنا ، ندعو المهمة longtime_add باستخدام طريقة التأخير ، وهي ضرورية إذا أردنا معالجة المهمة بشكل غير متزامن. بالإضافة إلى ذلك ، نحافظ على نتائج المهمة ونطبع بعض المعلومات. ستُرجع الطريقة الجاهزة إلى True إذا تم إنهاء المهمة ، وإلا False. السمة الناتجة هي نتيجة المهمة ("3" في اجتماعنا). إذا لم تنته المهمة ، فإنها تُرجع بلا.

عامل ميناء-compose.yml

لقد تم الانتهاء من الكود الرئيسي للمستهلك والمنتج ، وبعد ذلك سنقوم بإعداد عامل الإرساء والإعداد.

في هذا الملف ، قمنا بتعيين إصدار ملف docker-compose على "2" ، وقمنا بإنشاء "خدمتين": rabbit and worker. ما يجب أن نلاحظه هنا هو "image" ، سنقوم بسحب صورة "rabbitmq: الأحدث" لاحقًا مع عامل ميناء.

نحن هنا بحاجة إلى بناء صورة عامل ميناء مع الكرفس للعامل. وتشغيل عندما تبدأ بـ ENTRYPOINT

الكثير من التعليمات البرمجية؟ مجرد تحميل كل منهم من جيثب

قبل بدء الخطوة التالية ، يجب علينا هدم صورة rabbitmq وبناء صورة عامل.

عامل ميناء سحب rabbitmq: آخر
cd / دليل dockerfile /
عامل بناء الإنشاء

بمجرد الانتهاء من ذلك ، سترى "celeryrabbitmq_worker" و "rabbitmq" عند كتابة cmd "docker ps -a" في المحطة الطرفية.

أشعلها!

الآن يمكننا أن نبدأ العاملين باستخدام الأمر أدناه (تشغيل في مجلد مشروعنا Celery_RabbitMQ_Docker)

عامل النطاق - يؤلف مقياس عامل = 5

بعد ذلك ، سترى المحطة الطرفية أدناه ، عندما تظهر "تم" ، وهذا يعني أن جميع العمال الخمسة قد تم إنشاؤها وبدأوا بشكل جيد.

إنشاء وبدء celeryrabbitmq_worker_2 ... تم
إنشاء وبدء celeryrabbitmq_worker_3 ... تم
إنشاء وبدء celeryrabbitmq_worker_4 ... تم
إنشاء وبدء celeryrabbitmq_worker_5 ... تم

اكتب التالي في الأمر:

عامل ميناء يؤلف

ثم سترى شيء مثل أدناه:

(تم التحديث ، شكرًا لتعليق jlkinsel. إذا كان لديك "عامل إنشاء" يعمل من قبل ، ثم توقفت ، ترسو جهاز الإرسال مرة أخرى ، فسيظهر "بدء celeryrabbitmq_rabbit_1". كلاهما يعمل هنا)

celeryrabbitmq_rabbit_1 محدّث
celeryrabbitmq_worker_2 محدث
celeryrabbitmq_worker_3 محدث
celeryrabbitmq_worker_4 محدث
celeryrabbitmq_worker_5 محدث
مرفق بـ celeryrabbitmq_rabbit_1 ، celeryrabbitmq_worker_5 ، celeryrabbitmq_worker_2 ، celeryrabbitmq_worker_4 ، celeryrabbitmq_worker_3 ، celeryrabbitmq_worker_1

الآن ، بدأت جميع الأعمال الخمسة ، وهي جاهزة لتلقي الرسائل. إذا كان هناك أي رسائل من الإنتاج ، فسترى النتائج هنا.

حسنًا ، افتح محطة أخرى وانتقل إلى دليل المشروع ، عامل ميناء-الكتلة-مع الكرفس و rabbitmq. لنبدأ المنتج:

عامل ميناء exec -i -t-scaleable-crawler-with-docker-cluster_worker_1 / bin / bash python -m test_celery.run_tasks

* شكرا لتصحيح fizerkhan.

يمكنك الآن رؤية نتائج لقطة الشاشة هذه. الرقم 12 خلف "Task test_celery.tasks.longtime_add" هو النتيجة المحسوبة بواسطة "task.py".

أنا هنا فقط أغير "النتيجة = longtime_add.delay (1،2)" إلى (10،2) ، ثم النتيجة 12 ، يمكنك تغييرها إلى أي تريد اختباره إذا كان يعمل بشكل جيد.

استنتاج

إنه مجرد عرض توضيحي بسيط لإظهار كيفية إنشاء كتلة عامل ميناء مع الكرفس و RabbitMQ في وقت قصير. سوف تساعدك على فهم جيد ل Docker و Celery و RabbitMQ. مع جهاز واحد قوي أو مجموعة سحابية ، ستتعامل مع المهام الكبيرة بسهولة. إذا كان لديك جهاز واحد بتفاصيل منخفضة ، فربما يكون الخيار المتعدد هو المعالجة الأفضل.