Как да изградите докер клъстер с целина и RabbitMQ за 10 минути

Има много уроци за това как да използвате Целина с Django или Flask в Docker. Повечето от тях са добри уроци за начинаещи, но тук, не искам да говоря повече за Django, просто обяснявам как просто да стартирате Celery с RabbitMQ с Docker и да генерирате работни групи от само една команда.

Разбира се, бихте могли да направите ефикасни клъстер за обхождане с него!

1.Концепция карта на производителя и потребителя

Източник: test4geeks.com
Целина е асинхронна опашка за задачи / опашка за работа въз основа на разпределено предаване на съобщение. Тя е фокусирана върху работа в реално време, но също така поддържа планиране.
Единиците за изпълнение, наречени задачи, се изпълняват едновременно на един или повече работни сървъри, използвайки мултипроцесор, Eventlet или gevent. Задачите могат да се изпълняват асинхронно (на заден план) или синхронно (изчакайте до готовност).

Както бе споменато по-горе в официалния уебсайт, Celery е разпределена опашка за задачи, с него можете да се справите с милиони или дори милиарди задачи за кратко време.

Целина изисква агент за съобщения, за да обработва заявки от външен източник, обикновено това идва под формата на отделна услуга, наречена брокер на съобщения.

Има много възможности за избор на брокери, включително релационни бази данни, бази данни NoSQL, магазини с ключови стойности и системи за съобщения. Тук избираме RabbitMQ за система за съобщения. RabbitMQ е пълнофункционален, стабилен, издръжлив и лесен за инсталиране. Това е отличен избор за производствена среда.

2. Инсталирайте Docker и Docker-compose

Проверете ръководството за инсталиране на Docker

sudo apt-get update
sudo apt-key adv - keyserver hkp: //p80.pool.sks-keyservers.net: 80 - ключове recv 58118E89F3A912897C070ADBF76221572C52609D
sudo apt-add-repository „deb https://apt.dockerproject.org/repo ubuntu-xenial main“

Инсталирайте docker-compose както е по-долу или проверете ръководството на официалния уебсайт на Docker.

sudo apt-get install docker-compose

3.Структура на кода

Структурата на кода показва по-долу

След това ще обясня подробно кода подробно стъпка по стъпка:

celery.py

Първият аргумент на Celery е името на проектния пакет, който е „test_celery“.

Вторият аргумент е аргументът за ключова дума за брокер, който трябва да бъде посочен URL на брокера. Тук използвайте RabbitMQ.

Забележка: admin: mypass@10.211.55.12: 5672, трябва да го промените на това, което сте задали за вашия RabbitMQ. потребител: парола @ IP: порт

Третият аргумент е бекенд, който трябва да бъде посочен бекенд URL. Резерв в Целина се използва за съхранение на резултатите от задачата. Така че, ако трябва да получите достъп до резултатите от вашата задача, когато тя приключи, трябва да зададете бекенд за Celery. rpc означава изпращане на резултатите обратно като AMQP съобщения. Повече опции за формати на съобщения можете да намерите тук.

tasks.py

В този файл можете да видите, че импортираме приложението, дефинирано в предишния модул за целина, и го използваме като декоратор за нашия метод на задачи. Обърнете внимание, че app.task е само декоратор. В допълнение, ние спим 5 секунди в нашата longtime_add задача, за да симулираме скъпа във времето задача.

run_tasks.py

Тук наричаме задачата longtime_add, използвайки метода на забавяне, който е необходим, ако искаме да обработим задачата асинхронно. Освен това запазваме резултатите от задачата и отпечатваме малко информация. Готовият метод ще върне True, ако задачата е завършена, в противен случай False. Атрибутът за резултат е резултат от задачата („3“ в нашето аси). Ако задачата не е приключила, тя връща None.

докер-compose.yml

Основният код на потребителя и производителя е завършен, след това ще настроим docker-compose и docker.

В този файл задаваме версията на докер-композиционния файл на „2“ и настройваме две „услуги“: заек и работник. Това, което трябва да забележим тук, е „изображение“, ще изтеглим изображението „rabbitmq: last“ по-късно с докер.

Тук трябва да изградим изображение на докер с целина за работник. И стартирайте, когато започне с ENTRYPOINT

Много код? Просто изтеглете всички от Github

Преди началото на следващата стъпка трябва да свалим изображението rabbitmq и да изградим имидж на работника.

docker дръпнете rabbitmq: най-късно
CD / директория на dockerfile /
docker-compose build

След като го направите, ще видите „celeryrabbitmq_worker“ и „rabbitmq“, когато въведете cmd „docker ps -a“ в терминала.

Запали го!

Сега можем да стартираме работниците, използвайки командата по-долу (стартирайте в папката на нашия проект Celery_RabbitMQ_Docker)

докер-композитен мащаб работник = 5

След това ще видите показанията на терминала по-долу, когато се появи „готово“, това означава, че всичките 5 работници са създадени и са започнали добре.

Създаване и стартиране на celeryrabbitmq_worker_2 ... направено
Създаване и стартиране на celeryrabbitmq_worker_3…
Създаване и стартиране на celeryrabbitmq_worker_4 ... направено
Създаване и стартиране на celeryrabbitmq_worker_5 ... направено

Следващ тип в командата:

докер-композиране

Тогава ще видите нещо като по-долу:

(Актуализирано, благодаря за коментара на jlkinsel. Ако сте пуснали „docker-compose up“ преди и след това спрете, docker-compose отново, ще се покаже „Starting 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

Към момента всичките пет работи са стартирани и готови за получаване на съобщения. Ако има съобщения от продукцията, ще видите резултатите тук.

ОК, отворете друг терминал и отидете в директорията на проекта, docker-cluster-with-celery-and-rabbitmq. Нека започнем продуцента:

docker exec -i -t мащабируем-crawler-с-docker-cluster_worker_1 / bin / bash python -m test_celery.run_tasks

* Благодаря за корекцията на fizerkhan

Сега можете да видите резултатите от тази екранна снимка. Числото 12 зад „Task test_celery.tasks.longtime_add“ е резултатът, изчислен от „task.py“.

Тук просто променям „result = longtime_add.delay (1,2)“ на (10,2), тогава резултатът е 12, можете да го промените на всеки, който искате да го тествате, ако работи добре.

заключение

Това е просто демонстрация, за да покажете как да изградите докер клъстер с Celery и RabbitMQ за кратко време. Ще ви помогне да разберете добре Docker, Celery и RabbitMQ. С мощна единична машина или облачен клъстер ще се справите лесно с големи задачи. Ако просто разполагате с една машина с ниска специфичност, многопроцесовата работа или многопоточността може би е по-добър избор.