RabbitMQ on erinomainen avoimen lähdekoodin projekti, jonka avulla voit toimittaa satoja tuhansia viestejä sekunnissa hakemukseesi nopeasti ja tehokkaasti. Seuraava merkintä esittelee, miten voit sijoittaa RabbitMQ klusterin kolme erillistä isäntää. Tätä tarkoitusta varten, Käytämme Docker, ja yhteyden valmis klusterin solmun avulla.js.

noin RabbitMQ

RabbitMQ on jonotusjärjestelmä, joka perustuu AMQP-protokollaan, itse järjestelmä kirjoitettiin Erlangilla. Tämän kielen käytön ansiosta RabbitMQ soveltuu erinomaisesti käytettäväksi keskitettynä dataväylänä microservice-arkkitehtuurissa. Tällainen rautatie tarjoaa suuren alustan sovelluksia, jotka mahdollistavat suuren dynaamisen alueen kehitystä DDD ja CQRS paradigma. Koska dataväylä (viestien jono) on arkkitehtuurin selkäranka, on tärkeää, että se on aina käytettävissä ja kestää vikoja. Tarpeeton arkkitehtuuri tulee luonnollinen valinta, eli replikointi tietojen erillisiin executive solmut.

replikointia RabbitMQ: ssa tuetaan natiivisti isäntä-orja-tilassa. Tämä tarkoittaa, että RabbitMQ valitsee aina yhden solmun jokaista luotua jonoa varten ja se ohjaa kaikki viestit siihen tallennettavaksi sekä noutaa viestit siitä luettavaksi jonosta, muut solmut (orjat) toimivat datareplikaattorina valmiina valtaamaan pääsolmun roolin kaikkina aikoina. Vaikka suurin aisti on replikaatio, kun solmut ovat hajallaan eri fyysisissä koneissa, tässä tapauksessa käytän esimerkkiä replikaatiosta saman koneen sisällä. RabbitMQ tarkoituksensa – eli satojatuhansia tuettuja viestejä sekunnissa – vuoksi ei suosita replikointitilassa koneilla, jotka eivät ole samassa palvelimen telineessä. Tämä johtuu siitä, että viestit pysyvät jonossa hyvin lyhyt ja oletukset eivät saa ylittää RAM, toistaa ne perustuvat verkkoyhteyden eri osa datakeskuksen tai täysin eri datakeskuksen merkitsisi rajuja vähennyksiä suorituskykyä, ja tässä järjestelmäluokassa ei voida tarjota. Lisäksi asettamalla RabbitMQ-solmut lähelle toisiaan minimoimme niin sanotun verkkoosioinnin riskin (joka on hyvin epätodennäköistä yhden ruletin tapauksessa), eli ilmiön, jossa solmujen välinen viestintä keskeytyy siten, että vähintään 2 solmua koko klusterista pitää itseään mestarina. Lisää verkko-osiosta RabbitMQ: n yhteydessä voit lukea täältä.

siksi käytäntöön perustuva sääntö asettaa RabbitMQ: n replikointitilaan vain samassa datakeskuksessa.

Docker-kuvien lataaminen

oletan, että tiedät mikä on Docker ja miten sitä käytetään, koska seuraavassa osassa merkintä käytämme sitä laajasti

aloittaa, aloita lataamalla asianmukaiset RabbitMQ-kuvat (yhdessä admin panel-liitännäisen kanssa) ja Solmu.js, tähän tarkoitukseen käytämme seuraavia komentoja:

docker pull 3.6.6-managementdocker pull node:11.10.1

Setup RabbitMQ hosts

for the purposes of the presentation, we will launch one RabbitMQ image to which we will connect with the docker exec command and invoice the Bash shell to be able to run the configuration in our way. Käytetään komentoa:

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

yllä oleva komento suorittaa kuvan RabbitMQ: sta, joka poistetaan komentotulkilta poistumisen jälkeen. Instanssi liitetään verkkoliittymäämme, joten meidän ei tarvitse huolehtia port forwardingista. Jos kuori [email protected]:/# ilmestyi silmiimme, se tarkoittaa, että kaikki meni hyvin.

seuraava vaihe on ajaa kolme RabbitMQ-prosessia erillisissä porteissa, jokainen prosessi saa yksilöllisen nimen.

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

seuraavaksi rabbitmqctl: n avulla liitetään molemmat solmut juureen nimellä 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

loppujen lopuksi voimme avata selaimen ja syöttää osoitteen http://localhost:15672 varmistaaksemme, että kaikki meni hyvin, klusterin hallintakonsolin tulisi osoittaa kaikki solmut kuten alla olevalla näytöllä.

tärkeä. Älä poista säiliö komentoa RabbitMQ: sta, koska tämä poistaa sen (–rm-vaihtoehto Docker startup-komennolla)

meillä on viimeinen tehtävä, vaikka RabbitMQ-klusteri on valmis, meidän on määritettävä asianmukaiset käytännöt. Tämä toiminto toteutetaan hallintopaneelin avulla, lisätietoja RabbitMQ: n korkeasta saatavuudesta (HA) voidaan lukea dokumentaatiosta.

yllä on esimerkki HA-politiikan konfiguraatiosta. Ja alla on todentamismenetelmä. Solmun nimessä oleva luku + 2 tarkoittaa niiden erillisten isäntien määrää, joihin jono monistuu.

AMQP-kirjaston asennus ja lataus solmussa.js

seuraava vaihe on aloittaa Docker container-instanssi solmulla.js image, tätä tarkoitusta varten, suorita seuraava komento, joka myös jakaa verkkoliittymän.

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

tämän jälkeen luomme sivustomme valitsemassa paikassa (esim. /koti) hakemiston, johon laitamme tarvittavat skriptit ja asennamme AMQP-connection-manager-kirjaston, joka mahdollistaa yhteyden RabbitMQ: iin (tai muuhun AMQP-protokollan toteuttavaan järjestelmään) solmun tasolta.js.

npm install --save amqp-connection-manager

lisäksi kirjastoon voidaan lisätä useita RabbitMQ-isäntäosoitteita, jotka tarjoavat mekanismin yhteyden muodostamiseksi uudelleen, jos jokin isäntä epäonnistuu. Tämä on erittäin hyödyllinen toiminto, koska se huolehtii asianmukaisesta yhteydestä RabbitMQ: n kanssa ja vikatilanteessa se voi havaita viestit muistissa, kunnes yhteys tulee takaisin.

otos tuottaja-kuluttaja-koodi

nyt kun kaikki osat on valmistettu, voimme alkaa luoda yksinkertaista koodia, joka vastaa viestien luomisesta ja vastaanottamisesta. Tätä tarkoitusta varten luomme kaksi tiedostoa ja täytämme ne koodilla.

tuottaja.js-skripti muodostaa yhteyden RabbitMQ-instanssiin ja alkaa lähettää 10 viestiä sekunnissa.

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

kuluttaja.js-skripti kytkeytyy RabbitMQ-instanssiin ja alkaa lukea viestejä jonosta.

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

näin luotuja tiedostoja voidaan ajaa erikseen solmun avulla.js ja watch as consumer.js vastaanottaa producer.jstuottaman datan. Jotta voidaan tarkistaa replikointitoiminto RabbitMQ cluster, kehotan sinua poistaa tiedonvaihdon aikana Skriptejä yksi RabbitMQ prosesseja nähdä, miten vika käsitellään ja miten RabbitMQ valitsee uuden päällikön ja ohjaa viestit vastaavasti.

rabbitmqctl -n john stop_app

yhden RabbitMQ-esiintymän poistaminen käytöstä ei vaikuta viestien tuottamiseen tai lataamiseen. Jonot monistuvat automaattisesti ja yhteys otetaan talteen ilman tarvetta toteuttaa omia mekanismejaan.

yhteenvetona voidaan todeta, että RabbitMQ on loistava jonotusjärjestelmä, joka takaa hyvän saatavuuden kunnollisen kokoonpanon jälkeen, joka ei aiheuta paljon ongelmia. Suuri määrä kirjastoja monilla kielillä, esim. solmu.js, PHP, Java, Python, Golang, c / c++, mahdollistaa järjestelmän helpon toteuttamisen projektissa. Suosittelen kaikkia lukemaan asiakirjat, joissa selitetään hyvin selkeästi järjestelmän toimintaan ja sen oikeaan kokoonpanoon liittyvät asiat, jotka ovat todella laajoja.

kaikki koodi säilytetään arkistossa GitHubissa

samankaltaiset haut: nodejs rabbitmq / nodejs queue / rabbitmq queue nodejs