RabbitMQ er en utmerket åpen kildekode-prosjekt som lar deg levere hundretusener av meldinger per sekund til søknaden din raskt og effektivt. Følgende oppføring presenterer måten du kan plassere En RabbitMQ-klynge på tre separate verter. Til dette formål vil Vi bruke Docker, og koble til klarklyngen ved Hjelp Av Node.js.

Om RabbitMQ

RabbitMQ er et køsystem basert PÅ amqp-protokollen, selve systemet ble skrevet I ERLANG. Takket være bruken Av dette språket Er RabbitMQ ideell for bruk som en sentral databuss i mikrotjenestearkitekturen. En slik skinne gir et flott substrat for applikasjoner som tillater et stort dynamisk spekter av utvikling I DDD og CQRS paradigmet. Siden databussen (kø av meldinger) er ryggraden i arkitekturen, er det viktig at den alltid er tilgjengelig og motstandsdyktig mot feil. Redundant arkitektur blir det naturlige valget, dvs. replikering av data i separate utøvende noder.

Replikering I RabbitMQ støttes opprinnelig i master-slave-modus. Dette betyr At RabbitMQ alltid vil velge en node for hver opprettet kø, og den vil omdirigere alle meldinger til den for å lagre, samt hente meldinger fra den for å lese fra køen, de andre noder (slaver) fungerer som en datareplikator klar til å overta rollen som hovednoden til enhver tid. Selv om den største følelsen er replikering når noder er spredt på forskjellige fysiske maskiner, vil jeg i dette tilfellet bruke et eksempel på replikering i samme maskin. RabbitMQ grunn av sin hensikt-det vil si hundretusener av støttede meldinger per sekund, er ikke foretrukket i replikering modus på maskiner som ikke er i samme server rack. Dette skyldes det faktum at meldinger bo i køen svært kort og forutsetningene bør ikke gå utover RAM, replikere dem basert på en nettverkstilkobling i en annen del av datasenteret eller til et helt annet datasenter ville bety drastiske reduksjoner i ytelse, og i dette systemet klassen kan ikke gis. I tillegg, ved å plassere RabbitMQ noder nær hverandre, minimerer vi risikoen for såkalt nettverkspartisjon (som er svært usannsynlig i tilfelle av en roulette), dvs.fenomenet å forstyrre kommunikasjon mellom noder på en slik måte at minst 2 noder fra hele klyngen anser seg som mester. Mer om nettverkspartisjonen i Sammenheng Med RabbitMQ kan leses her.

den praksisbaserte regelen setter Derfor RabbitMQ i replikeringsmodus bare i samme datasenter.

Nedlasting Docker images

jeg antar at du vet Hva Som Er Docker og hvordan du bruker Det, fordi i neste del av oppføringen vil vi bruke den mye

til å begynne med, start med å laste ned de riktige RabbitMQ-bildene (sammen med admin panel plugin) og Node.js, for dette formålet bruker vi følgende kommandoer:

docker pull 3.6.6-managementdocker pull node:11.10.1

Oppsett RabbitMQ hosts

i forbindelse med presentasjonen vil vi lansere et RabbitMQ-bilde som vi vil koble til med kommandoen docker exec og påkalle bash-skallet for å kunne kjøre konfigurasjonen i vår vei. La oss bruke kommandoen:

docker run --hostname rabbit --name rabbit --rm -ti --net="host" rabbitmq:3.6.6-management /bin/bash

kommandoen ovenfor vil kjøre bildet Fra RabbitMQ som vil bli slettet etter å ha forlatt skallet. Forekomsten vil bli koblet til vårt nettverksgrensesnitt, slik at vi ikke trenger å bekymre oss for port videresending. Hvis skallet [email protected]:/# dukket opp for våre øyne, betyr det at alt gikk bra.

det neste trinnet er å kjøre tre RabbitMQ prosesser på separate porter, hver prosess vil motta et unikt navn.

RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=rabbit rabbitmq-server -detachedRABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=hare rabbitmq-server -detachedRABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=john rabbitmq-server -detached

Neste, ved hjelp av rabbitmqctl, legger vi begge noder til roten med navnet rabbit :

rabbitmqctl -n hare stop_apprabbitmqctl -n hare join_cluster [email protected]`hostname -s`rabbitmqctl -n hare start_apprabbitmqctl -n john stop_apprabbitmqctl -n john join_cluster [email protected]`hostname -s`rabbitmqctl -n john start_app

tross alt kan vi åpne nettleseren og skrive inn adressen http://localhost:15672 for å bekrefte at alt gikk bra, bør cluster management console peke på alle noder som på skjermen nedenfor.

Viktig. Ikke deaktiver beholderskallet Fra RabbitMQ, da dette vil fjerne det (–rm-alternativet på Docker oppstartskommandoen)

Vi har det siste å gjøre, selv Om RabbitMQ-klyngen er klar, må vi konfigurere de riktige retningslinjene. Denne funksjonen er implementert ved hjelp av administrasjonspanelet, mer informasjon om høy tilgjengelighet (HA) I RabbitMQ kan leses i dokumentasjonen.

Ovenfor Er et eksempel PÅ HA-policykonfigurasjon. Nedenfor er verifikasjonsmetoden. Tallet + 2 ved nodenavnet betyr antall separate verter som køen replikeres til.

Installasjon og nedlasting av amqp-biblioteket På Node.js

det neste trinnet er å starte Docker container-forekomsten med Noden.js bilde, for dette formålet, kjør følgende kommando som også deler nettverksgrensesnittet.

docker run -ti --rm --net="host" node:11.10.1 /bin/bash

deretter på stedet valgt av nettstedet vårt (f. eks /home) lager vi en katalog der vi legger de nødvendige skriptene og installerer amqp-connection-manager-biblioteket som tillater tilkobling Til RabbitMQ (eller annet system som implementerer amqp-protokollen) fra Nodenivået.js.

npm install --save amqp-connection-manager

i tillegg tillater biblioteket tillegg av Flere RabbitMQ verts adresser som gir en mekanisme for å koble i tilfelle av svikt i noen vert. Dette er en veldig nyttig funksjonalitet, fordi den bryr seg om en riktig forbindelse Med RabbitMQ, og i tilfelle feil kan den oppdage meldinger i minnet til forbindelsen vises tilbake.

sample producer-consumer code

Nå som vi har alle komponentene forberedt, kan vi begynne å lage en enkel kode som er ansvarlig for å lage og motta meldinger. Til dette formål vil vi lage to filer og fylle dem med en kode.

produsent.js-skriptet kobles Til RabbitMQ eksempel og begynner å sende 10 meldinger per sekund.

let q = 'tasks';let amqp = require('amqp-connection-manager');function sleep(ms) { if(ms setTimeout(resolve, ms));}let main = async () => { var connection = amqp.connect(); var channelWrapper = connection.createChannel({ json: true, setup: function(channel) { return channel.assertQueue(q, { durable: true }); } }); console.log('Starting message stream') while (true) { await channelWrapper.sendToQueue(q, { value: Math.random() }) await sleep(100) }}main()

forbruker.js-skriptet kobles Til RabbitMQ eksempel og begynner å lese meldinger fra køen.

let q = 'tasks';let amqp = require('amqp-connection-manager');let main = async () => { var connection = amqp.connect(); var channelWrapper = connection.createChannel({ json: true, setup: function(channel) { return channel.assertQueue(q, { durable: true }); } }); channelWrapper.addSetup(function(channel) { return Promise.all() });}main()

Filer som er opprettet på denne måten, kan kjøres separat Ved Hjelp Av Node.js og se på som consumer.js mottar data produsert av producer.js. For å verifisere replikasjonsoperasjonen I RabbitMQ-klyngen, oppfordrer jeg deg til å deaktivere under utveksling av data med skript en Av RabbitMQ-prosessene for å se hvordan feilen vil bli håndtert og hvordan RabbitMQ vil velge den nye mesteren og omdirigere meldingene tilsvarende.

rabbitmqctl -n john stop_app

Deaktivering Av En Av RabbitMQ-forekomstene påvirker ikke produksjon eller nedlasting av meldinger. Køer replikeres automatisk og forbindelsen gjenopprettes uten å måtte implementere egne mekanismer.

Oppsummert Er RabbitMQ et flott køsystem som sikrer høy tilgjengelighet etter en riktig konfigurasjon som ikke forårsaker mange problemer. Et stort antall biblioteker på mange språk, for Eksempel Node.js, PHP, Java, Python, Golang, C / C++, gir enkel implementering av systemet i prosjektet. Jeg anbefaler alle å lese dokumentasjonen som forklarer veldig tydelig problemene knyttet til driften av systemet og dens korrekte konfigurasjon, som er veldig omfattende.

all kode er lagret på Github

Lignende søk: nodejs rabbitmq / nodejs queue / rabbitmq queue nodejs