RabbitMQ is een uitstekend open-source project waarmee u honderdduizenden berichten per seconde snel en efficiënt te leveren aan uw toepassing. Het volgende item toont de manier waarop je een RabbitMQ cluster van drie afzonderlijke hosts kunt plaatsen. Voor dit doel, We zullen Docker gebruiken, en verbinding maken met de klaar cluster met behulp van knooppunt.js.

over RabbitMQ

RabbitMQ is een wachtrijsysteem gebaseerd op het AMQP-protocol, het systeem zelf is geschreven in Erlang. Dankzij het gebruik van deze taal is RabbitMQ bij uitstek geschikt voor gebruik als centrale databus in de microservice-architectuur. Een dergelijke rail biedt een geweldig substraat voor toepassingen die een groot dynamisch ontwikkelingsbereik in het DDD-en CQRS-paradigma mogelijk maken. Aangezien de databus (wachtrij van berichten) de ruggengraat van de architectuur is, is het belangrijk dat deze altijd beschikbaar is en bestand is tegen storingen. Redundante architectuur wordt de natuurlijke keuze, dwz replicatie van gegevens in afzonderlijke uitvoerende knooppunten.

replicatie in RabbitMQ wordt native ondersteund in master-slave modus. Dit betekent dat RabbitMQ altijd één knooppunt zal selecteren voor elke gemaakte wachtrij en het zal alle berichten omleiden om het op te slaan, evenals berichten ophalen van het voor het lezen van de wachtrij, de andere knooppunten (slaves) fungeren als een data replicator klaar in het nemen van de rol van de master node te allen tijde. Hoewel de grootste zin is replicatie wanneer knooppunten worden verspreid op verschillende fysieke machines, in dit geval zal ik een voorbeeld van replicatie binnen dezelfde machine te gebruiken. RabbitMQ vanwege zijn doel – dat wil zeggen, honderdduizenden ondersteunde berichten per seconde, heeft geen voorkeur in replicatiemodus op machines die niet in hetzelfde serverrek staan. Dit is te wijten aan het feit dat berichten blijven in de wachtrij zeer kort en de veronderstellingen niet verder moeten gaan dan RAM, repliceren ze op basis van een netwerkverbinding in een ander deel van het datacenter of een volledig ander datacenter zou betekenen drastische vermindering van de prestaties, en in dit systeem klasse kan niet worden geboden. Bovendien, door RabbitMQ knooppunten dicht bij elkaar te plaatsen, minimaliseren we het risico van zogenaamde netwerkpartitie (wat zeer onwaarschijnlijk is in het geval van een roulette), dat wil zeggen het fenomeen van het onderbreken van de communicatie tussen knooppunten op een zodanige manier dat ten minste 2 knooppunten van de hele cluster zichzelf als meester beschouwen. Meer over de netwerkpartitie in de context van RabbitMQ kan hier worden gelezen.

daarom zet de praktijkgebaseerde regel RabbitMQ in replicatiemodus alleen in hetzelfde datacenter.

Docker-afbeeldingen downloaden

ik neem aan dat u weet wat Docker is en hoe het te gebruiken, omdat we het in het volgende deel van het item op grote schaal zullen gebruiken

om mee te beginnen, begin met het downloaden van de juiste RabbitMQ-afbeeldingen (samen met de admin panel plugin) en Node.js, hiervoor gebruiken we de volgende commando ‘ s:

docker pull 3.6.6-managementdocker pull node:11.10.1

Setup RabbitMQ hosts

voor de presentatie zullen we één RabbitMQ image starten waarmee we verbinding zullen maken met het docker exec commando en de Bash shell aanroepen om de configuratie op onze manier te kunnen uitvoeren. Laten we het commando gebruiken:

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

het bovenstaande commando zal de image van RabbitMQ uitvoeren die verwijderd zal worden na het verlaten van de shell. De instantie zal worden aangesloten op onze netwerkinterface, zodat we ons geen zorgen hoeven te maken over port forwarding. Als de schelp [email protected]:/# in onze ogen verscheen, betekent dit dat alles goed ging.

de volgende stap is om drie RabbitMQ processen op verschillende poorten uit te voeren, elk proces krijgt een unieke naam.

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

vervolgens, met behulp van de rabbitmqctl, hechten we beide knopen aan de root met de naam 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

tenslotte kunnen we de browser openen en het adres http://localhost:15672 invoeren om te controleren of alles goed is gegaan, de clusterbeheerconsole moet naar alle knooppunten wijzen zoals op het onderstaande scherm.

belangrijk. Schakel de container shell van RabbitMQ niet uit, omdat dit het zal verwijderen (de –rm optie bij het Docker opstart Commando)

we hebben het laatste wat we moeten doen, hoewel het RabbitMQ cluster klaar is, moeten we de juiste beleidsregels instellen. Deze functie wordt geïmplementeerd met behulp van het administratiepaneel, meer informatie over high availability (HA) in RabbitMQ kan worden gelezen in de documentatie.

hierboven is een voorbeeld van Ha-beleidsconfiguratie. En Hieronder is de verificatiemethode. Het nummer +2 bij de knooppuntnaam betekent het aantal afzonderlijke hosts waarnaar de wachtrij wordt gerepliceerd.

installatie en download van de AMQP-bibliotheek op Knooppunt.js

de volgende stap is om de Docker container instantie te starten met de Node.js image, voor dit doel, voer het volgende commando uit dat ook de netwerkinterface deelt.

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

vervolgens maken we op de door onze site gekozen plaats (bijv. /home) een directory waarin we de benodigde scripts plaatsen en de AMQP-connection-manager bibliotheek installeren die verbinding met RabbitMQ (of een ander systeem dat het AMQP protocol implementeert) mogelijk maakt vanaf het niveau van Node.js.

npm install --save amqp-connection-manager

daarnaast staat de library het toevoegen van meerdere RabbitMQ host adressen toe die een mechanisme bieden om opnieuw verbinding te maken in het geval van een storing van een host. Dit is een zeer nuttige functionaliteit, omdat het zorgt voor een goede verbinding met RabbitMQ en in het geval van een storing kan het berichten in het geheugen detecteren totdat de verbinding weer verschijnt.

Sample producer-consumer code

nu we alle componenten voorbereid hebben, kunnen we beginnen met het maken van een eenvoudige code die verantwoordelijk is voor het aanmaken en ontvangen van berichten. Hiervoor maken we twee bestanden aan en vullen ze met een code.

producent.js – het script maakt verbinding met de RabbitMQ instantie en begint met het verzenden van 10 berichten per seconde.

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()

consumenten.js – het script maakt verbinding met de RabbitMQ instantie en begint met het lezen van berichten uit de wachtrij.

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()

bestanden die op deze manier zijn aangemaakt, kunnen afzonderlijk worden uitgevoerd met Node.js and watch as consumer.js ontvangt gegevens geproduceerd door producer.js. Om de replicatiebewerking in het RabbitMQ-cluster te verifiëren, raad ik u aan om tijdens de uitwisseling van gegevens door scripts een van de RabbitMQ-processen uit te schakelen om te zien hoe de fout zal worden behandeld en hoe RabbitMQ de Nieuwe master zal selecteren en de berichten dienovereenkomstig omleiden.

rabbitmqctl -n john stop_app

het uitschakelen van een van de RabbitMQ-instanties heeft geen invloed op de productie of het downloaden van berichten. Wachtrijen worden automatisch gerepliceerd en de verbinding wordt hersteld zonder de noodzaak om zijn eigen mechanismen te implementeren.

samenvattend is RabbitMQ een geweldig wachtrijsysteem dat hoge beschikbaarheid garandeert na een juiste configuratie die niet veel problemen veroorzaakt. Een groot aantal bibliotheken in vele talen, bijvoorbeeld Node.js, PHP, Java, Python, Golang, C / C++, maakt eenvoudige implementatie van het systeem in het project. Ik raad iedereen aan om de documentatie te lezen die heel duidelijk de problemen met betrekking tot de werking van het systeem en de juiste configuratie uitlegt, die echt uitgebreid is.

alle code wordt bewaard in de repository op Github

soortgelijke zoekopdrachten: nodejs rabbitmq / nodejs queue / rabbitmq queue nodejs