Sådan oprettes docker-klynge med selleri og RabbitMQ på 10 minutter

Der er masser af tutorials om, hvordan man bruger selleri med Django eller kolbe i Docker. De fleste af dem er gode tutorials for begyndere, men her vil jeg ikke tale mere om Django, bare forklare, hvordan man simpelthen kører Celery med RabbitMQ med Docker og genererer arbejdsklynger med kun EN kommando.

Selvfølgelig kan du lave en effektiv crawler-klynge med det!

1.Koncept af producent og forbruger

Kilde: test4geeks.com
Selleri er en asynkron opgavekø / jobkø, der er baseret på distribueret meddelelsesafvikling. Det er fokuseret på realtidsdrift, men understøtter også planlægning.
Udførelsesenhederne, kaldet opgaver, udføres samtidigt på en enkelt eller flere arbejdsservere ved hjælp af multiprocessing, Eventlet eller gevent. Opgaver kan udføres asynkront (i baggrunden) eller synkront (vent indtil klar).

Som nævnt ovenfor på det officielle websted er Selleri en distribueret opgavekø, med den kunne du håndtere millioner eller endda milliarder af opgaver på kort tid.

Selleri kræver en messaging-agent for at håndtere anmodninger fra en ekstern kilde, normalt kommer dette i form af en separat tjeneste kaldet en meddelelsesmægler.

Der er mange muligheder for mæglere, der er tilgængelige at vælge imellem, herunder relationsdatabaser, NoSQL-databaser, nøgleværdibutikker og meddelelsessystemer. Her vælger vi RabbitMQ til messaging-system. RabbitMQ er funktions-komplet, stabil, holdbar og let at installere. Det er et fremragende valg for et produktionsmiljø.

2. Installer Docker og Docker-compose

Kontroller selvstudiet for at installere Docker

sudo apt-get-opdatering
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'

Installer docker-compose som nedenfor, eller tjek tutorial på Docker officielle hjemmeside.

sudo apt-get install docker-compose

3. Opbygning af koden

Kodestrukturen viser nedenfor

Dernæst vil jeg forklare koden i detaljer trin for trin:

celery.py

Det første argument til Celery er navnet på projektpakken, der er “test_celery”.

Det andet argument er mæglerens søgeordsargument, som skal specificeres mæglerens URL. Her ved hjælp af RabbitMQ.

Bemærk: admin: mypass@10.211.55.12: 5672, du skal ændre det til det, du konfigurerede til din RabbitMQ. bruger: password @ ip: port

Det tredje argument er backend, som skal specificeres en backend-URL. En backend i selleri bruges til at gemme opgavens resultater. Så hvis du har brug for adgang til resultaterne af din opgave, når den er færdig, skal du angive en backend til Selleri. rpc betyder at sende resultaterne tilbage som AMQP-meddelelser. Flere muligheder for meddelelsesformater kan findes her.

tasks.py

I denne fil kan du se, at vi importerer den app, der er defineret i det forrige sellerimodul, og bruger den som dekoratør til vores opgavemetode. Bemærk, at app.task kun er en dekoratør. Derudover sover vi 5 sekunder i vores longtime_add-opgave for at simulere en tidskrævende opgave.

run_tasks.py

Her kalder vi opgaven longtime_add ved hjælp af forsinkelsesmetoden, som er nødvendig, hvis vi vil behandle opgaven asynkront. Derudover opbevarer vi resultaterne af opgaven og udskriver nogle oplysninger. Den klare metode vender sandt, hvis opgaven er afsluttet, ellers falsk. Resultatattributten er resultatet af opgaven (“3” i vores ase). Hvis opgaven ikke er afsluttet, returnerer den Ingen.

havnearbeider-compose.yml

Hovedkoden for forbruger og producent er færdig, næste gang vi opsætter docker-komponere og docker.

I denne fil satte vi versionen af ​​docker-compose-fil til '2 "og sætter to" services ": kanin og arbejder. Hvad vi skal bemærke her er' image ', vi vil trække" rabbitmq: seneste "billede senere med docker.

Her er vi nødt til at opbygge et dockerbillede med selleri til arbejdstageren. Og kør, når det starter med ENTRYPOINT

Masser af kode? Download bare dem alle fra Github

Før næste trin starter, skal vi trække kaninmq-billedet ned og opbygge arbejderbillede.

docker pull rabbitmq: seneste
cd / directory-of-dockerfile /
docker-komponere build

Når det er gjort, vil du se 'celeryrabbitmq_worker' og 'rabbitmq', når du skriver cmd 'docker ps -a' i terminalen.

Ild det op!

Nu kan vi starte medarbejderne ved hjælp af kommandoen nedenfor (kør i mappen til vores projekt Celery_RabbitMQ_Docker)

docker-komponere skala-arbejder = 5

Så vil du se terminalen viser nedenfor, når 'færdig' dukker op, det betyder, at alle de 5 arbejdere er oprettet og startet godt.

Oprettelse og start af sellerirabbitmq_worker_2… færdig
Oprettelse og start af sellerirabbitmq_worker_3… færdig
Oprettelse og start af sellerirabbitmq_worker_4… færdig
Oprettelse og start af sellerirabbitmq_worker_5… færdig

Næste type i kommandoen:

docker-komponere

Så vil du se noget lignende nedenfor:

(Opdateret, tak for jlkinsels kommentar. Hvis du har "docker-compose up" kørt før og derefter stoppet, docker-compose up igen, viser den "Start celeryrabbitmq_rabbit_1". Begge fungerer her)

celeryrabbitmq_rabbit_1 er opdateret
celeryrabbitmq_worker_2 er ajour
celeryrabbitmq_worker_3 er ajour
celeryrabbitmq_worker_4 er opdateret
celeryrabbitmq_worker_5 er ajour
Vedhæftning til celeryrabbitmq_rabbit_1, celeryrabbitmq_worker_5, celeryrabbitmq_worker_2, celeryrabbitmq_worker_4, celeryrabbitmq_worker_3, celeryrabbitmq_worker_1

I øjeblikket er alle de fem arbejde startet og klar til at modtage meddelelser. Hvis der er nogen meddelelser fra producere, vil du se resultaterne her.

OK, åbn en anden terminal og gå til projektmappen, docker-klynge-med-selleri-og-kaninmq. Lad os starte producenten:

docker exec-jeg-t skalerbar-crawler-med-docker-cluster_worker_1 / bin / bash python -m test_celery.run_tasks

* Tak for fizerkhan's korrektion.

Nu kan du se resultaterne fra dette skærmbillede. Tallet 12 bag “Task test_celery.tasks.longtime_add” er resultatet beregnet af “Tasks.py”.

Her ændrer jeg bare “result = longtime_add.delay (1,2)” til (10,2), så er resultatet 12, du kan ændre det til ethvert, du vil teste det, hvis det fungerer godt.

Konklusion

Det er bare simpelt demo at vise, hvordan man bygger en docker-klynge med Celery og RabbitMQ på kort tid. Det vil hjælpe dig med en god forståelse af Docker, selleri og kaninMQ. Med en kraftfuld enkelt maskine eller sky-klynge håndterer du let store opgaver. Hvis du bare har en enkelt maskine med lave detaljer, er multiprocessering eller multetrådning måske et bedre valg.