RabbitMQ este un excelent proiect open-source, care vă permite să livreze sute de mii de mesaje pe secundă la cererea dumneavoastră rapid și eficient. Următoarea intrare prezintă modul în care puteți plasa un cluster RabbitMQ de trei gazde separate. În acest scop, vom folosi Docker și ne vom conecta la clusterul gata folosind nodul.js.

despre RabbitMQ

RabbitMQ este un sistem de așteptare bazat pe protocolul AMQP, sistemul în sine a fost scris în Erlang. Datorită utilizării acestui limbaj, RabbitMQ este ideal pentru utilizarea ca magistrală centrală de date în arhitectura microservice. O astfel de șină oferă un substrat excelent pentru aplicații care permit o gamă dinamică mare de dezvoltare în paradigma DDD și CQRS. Deoarece magistrala de date (coada de mesaje) este coloana vertebrală a arhitecturii, este important să fie întotdeauna disponibilă și rezistentă la eșecuri. Arhitectura redundantă devine alegerea naturală, adică replicarea datelor în noduri executive separate.

replicarea în RabbitMQ este acceptată nativ în modul master-slave. Aceasta înseamnă că RabbitMQ va selecta întotdeauna un nod pentru fiecare coadă creată și va redirecționa toate mesajele către acesta pentru salvare, precum și va prelua mesaje de la acesta pentru citirea din coadă, celelalte noduri (sclavi) acționează ca un replicator de date gata în preia rolul nodului principal în orice moment. Deși cel mai mare sens este replicarea atunci când nodurile sunt împrăștiate pe mașini fizice diferite, în acest caz voi folosi un exemplu de replicare în cadrul aceleiași mașini. RabbitMQ datorită scopului său-adică sute de mii de mesaje acceptate pe secundă, nu este preferat în modul de replicare pe mașinile care nu se află în același rack de server. Acest lucru se datorează faptului că mesajele rămân în coadă foarte scurte, iar ipotezele nu ar trebui să depășească memoria RAM, să le reproducă pe baza unei conexiuni de rețea într-o altă parte a Centrului de date sau într-un centru de date complet diferit ar însemna scăderi drastice ale performanței, iar în această clasă de sistem nu poate fi oferită. În plus, prin plasarea nodurilor RabbitMQ aproape unul de celălalt, minimizăm riscul așa-numitei partiții de rețea (ceea ce este foarte puțin probabil în cazul unei rulete), adică fenomenul întreruperii comunicării între noduri în așa fel încât cel puțin 2 noduri din întregul cluster să se considere maestru. Mai multe despre partiția de rețea în contextul RabbitMQ pot fi citite aici.

prin urmare, regula bazată pe practică pune RabbitMQ în modul de replicare numai în același centru de date.

descărcarea imaginilor Docker

presupun că știți ce este Docker și cum să îl utilizați, deoarece în următoarea parte a intrării îl vom folosi pe scară largă

pentru a începe, începeți prin descărcarea imaginilor RabbitMQ corespunzătoare (împreună cu pluginul panoului de administrare) și nodul.js, în acest scop folosim următoarele comenzi:

docker pull 3.6.6-managementdocker pull node:11.10.1

Setup RabbitMQ hosts

în scopul prezentării, vom lansa o imagine RabbitMQ la care ne vom conecta cu comanda docker exec și vom invoca shell-ul bash pentru a putea rula configurația în felul nostru. Să folosim comanda:

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

comanda de mai sus va rula imaginea de la RabbitMQ, care va fi ștearsă după părăsirea shell-ului. Instanța va fi conectată la interfața noastră de rețea, astfel încât nu trebuie să ne facem griji cu privire la redirecționarea porturilor. Dacă shell-ul [email protected]:/# a apărut în ochii noștri, înseamnă că totul a mers bine.

următorul pas este de a rula trei procese RabbitMQ pe porturi separate, fiecare proces va primi un nume unic.

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

apoi, cu ajutorul rabbitmqctl, atașăm ambele noduri la rădăcină cu numele 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

la urma urmei, putem deschide browserul și introduce adresa http://localhost:15672 pentru a verifica dacă totul a mers bine, consola de gestionare a clusterului ar trebui să indice toate nodurile ca pe ecranul de mai jos.

Important. Nu dezactivați shell-ul containerului de la RabbitMQ, deoarece acesta îl va elimina(opțiunea — rm din comanda de pornire Docker)

avem ultimul lucru de făcut, deși clusterul RabbitMQ este gata, trebuie să configurăm politicile corespunzătoare. Această funcție este implementată folosind panoul de administrare, mai multe informații despre disponibilitatea ridicată (HA) în RabbitMQ pot fi citite în documentație.

de mai sus este un exemplu de configurare a politicii HA. Și mai jos este metoda de verificare. Numărul + 2 la numele nodului înseamnă numărul de gazde separate la care este reprodusă coada.

instalarea și descărcarea bibliotecii AMQP la nod.js

următorul pas este să porniți instanța containerului Docker cu Nodul.imagine js, în acest scop, executați următoarea comandă care partajează și interfața de rețea.

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

apoi, în locul ales de site-ul nostru (de exemplu /home), creăm un director în care punem scripturile necesare și instalăm biblioteca amqp-connection-manager care permite conectarea la RabbitMQ (sau alt sistem care implementează protocolul AMQP) de la nivelul nodului.js.

npm install --save amqp-connection-manager

în plus, Biblioteca Permite adăugarea mai multor adrese gazdă RabbitMQ oferind un mecanism de reconectare în caz de eșec al oricărei gazde. Aceasta este o funcționalitate foarte utilă, deoarece are grijă de o conexiune adecvată cu RabbitMQ și, în caz de eșec, poate detecta mesaje în memorie până când conexiunea apare din nou.

exemplu cod producător-consumator

acum că avem toate componentele pregătite, putem începe să creăm un cod simplu responsabil pentru crearea și primirea mesajelor. În acest scop, vom crea două fișiere și le vom umple cu un cod.

producător.JS-scriptul se conectează la instanța RabbitMQ și începe să trimită 10 Mesaje pe secundă.

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

consumator.JS-scriptul se conectează la instanța RabbitMQ și începe să citească mesaje din coadă.

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

fișierele create în acest fel pot fi rulate separat folosind nodul.js și watch as consumer.js primește date produse de producer.js. Pentru a verifica operația de replicare în cluster RabbitMQ, vă încurajez să dezactivați în timpul schimbului de date prin scripturi unul dintre procesele RabbitMQ pentru a vedea cum va fi gestionat eșecul și cum RabbitMQ va selecta noul master și va redirecționa mesajele în consecință.

rabbitmqctl -n john stop_app

dezactivarea uneia dintre instanțele RabbitMQ nu afectează producerea sau descărcarea mesajelor. Cozile sunt reproduse automat și conexiunea recuperată fără a fi nevoie să implementeze propriile mecanisme.

pe scurt, RabbitMQ este un sistem de așteptare excelent care asigură o disponibilitate ridicată după o configurație adecvată care nu provoacă multe probleme. Un număr mare de biblioteci în mai multe limbi, de exemplu, nod.js, PHP, Java, Python, Golang, C / C++, permite implementarea ușoară a sistemului în proiect. Recomand tuturor să citească documentația care explică foarte clar problemele legate de funcționarea sistemului și configurația corectă a acestuia, care este cu adevărat extinsă.

tot codul este păstrat în depozit pe Github

căutări similare: nodejs rabbitmq / nodejs coadă / rabbitmq coadă nodejs