a RabbitMQ egy kiváló nyílt forráskódú projekt, amely lehetővé teszi, hogy másodpercenként több százezer üzenetet küldjön az alkalmazásnak gyorsan és hatékonyan. A következő bejegyzés bemutatja, hogyan helyezhet el három különálló gazdagépből álló RabbitMQ fürtöt. Erre a célra a Dockert fogjuk használni, és a Node segítségével csatlakozunk a kész fürthöz.js.

a RabbitMQ-ról

a RabbitMQ az AMQP protokollon alapuló sorban álló rendszer, maga a rendszer Erlangban íródott. Ennek a nyelvnek köszönhetően a RabbitMQ ideális központi adatbuszként való használatra a microservice architektúrában. Egy ilyen sín nagyszerű alapot nyújt az alkalmazásokhoz, lehetővé téve a DDD és a CQRS paradigma nagy dinamikatartományát. Mivel az adatbusz (üzenetsor) az architektúra gerince, fontos, hogy mindig rendelkezésre álljon és ellenálljon a hibáknak. A redundáns architektúra természetes választássá válik, azaz az adatok külön végrehajtó csomópontokba történő replikációja.

a RabbitMQ-ban történő replikáció natív módon támogatott master-slave módban. Ez azt jelenti, hogy a RabbitMQ mindig kiválaszt egy csomópontot minden létrehozott várólistához, és átirányítja az összes üzenetet a mentéshez, valamint az üzeneteket beolvassa belőle a várólistáról való olvasáshoz, a többi csomópont (rabszolgák) adat-replikátorként működik, amely készen áll arra, hogy mindenkor átvegye a fő csomópont szerepét. Bár a legnagyobb értelme a replikáció, amikor a csomópontok különböző fizikai gépeken vannak szétszórva, ebben az esetben az ugyanazon gépen belüli replikáció példáját fogom használni. A RabbitMQ célja miatt-vagyis másodpercenként több százezer támogatott üzenet-nem előnyös replikációs módban olyan gépeken, amelyek nem ugyanabban a szerver rackben vannak. Ez annak a ténynek köszönhető, hogy az üzenetek marad a sorban nagyon rövid, és a feltételezések nem haladhatja meg a RAM, replikálni őket alapuló hálózati kapcsolat egy másik része az adatközpont, vagy egy teljesen más adatközpont azt jelentené, drasztikus csökken a teljesítmény, és ebben a rendszerben osztály nem engedhető meg. Ezenkívül a RabbitMQ csomópontok egymáshoz közel helyezésével minimalizáljuk az úgynevezett hálózati partíció kockázatát (ami egy rulett esetében nagyon valószínűtlen), azaz a csomópontok közötti kommunikáció megszakításának jelensége oly módon, hogy a teljes klaszterből legalább 2 csomópont mesternek tartja magát. További információ a hálózati partícióról a RabbitMQ összefüggésében itt olvasható.

ezért a gyakorlaton alapuló szabály a RabbitMQ replikációs módba helyezése csak ugyanabban az adatközpontban.

Docker képek letöltése

feltételezem, hogy tudod, mi a Docker, és hogyan kell használni, mert a bejegyzés következő részében széles körben fogjuk használni

kezdjük azzal, hogy letöltjük a megfelelő RabbitMQ képeket (az admin panel pluginjával együtt) és a Node-ot.js, erre a célra a következő parancsokat használjuk:

docker pull 3.6.6-managementdocker pull node:11.10.1

Setup RabbitMQ hosts

a prezentáció céljából elindítunk egy RabbitMQ képet, amelyhez kapcsolódunk a docker exec paranccsal, és meghívjuk a bash shell-t, hogy a konfigurációt a magunk módján tudjuk futtatni. Használjuk a parancsot:

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

a fenti parancs futtatja a képet a RabbitMQ-ból, amely a héj elhagyása után törlődik. A példány csatlakozik a hálózati interfészünkhöz, így nem kell aggódnunk a port továbbítás miatt. Ha a héj [email protected]:/# megjelent a szemünknek, azt jelenti, hogy minden jól ment.

a következő lépés három RabbitMQ folyamat futtatása külön portokon, minden folyamat egyedi nevet kap.

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

ezután a rabbitmqctl segítségével mindkét csomópontot a rabbitnévvel csatoljuk a gyökérhez:

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

végül is megnyithatjuk a böngészőt, és beírhatjuk a http://localhost:15672 címet annak ellenőrzéséhez, hogy minden jól ment-e, a fürtkezelő konzolnak az összes csomópontra kell mutatnia, mint az alábbi képernyőn.

fontos. Ne tiltsa le a tárolóhéjat a RabbitMQ – ból, mert ez eltávolítja (a Docker indítási parancsának –rm opciója)

van az utolsó tennivalónk, bár a RabbitMQ fürt készen áll, be kell állítanunk a megfelelő házirendeket. Ez a funkció az adminisztrációs panel segítségével valósul meg, a RabbitMQ magas rendelkezésre állásáról (HA) további információk olvashatók a dokumentációban.

a fenti példa a HA házirend konfigurációjára. Az alábbiakban pedig az ellenőrzési módszer. A csomópontnévnél a +2 szám azon különálló gazdagépek számát jelenti, amelyekre a sor replikálódik.

az amqp könyvtár telepítése és letöltése a csomóponton.js

a következő lépés a Docker konténer példány elindítása a csomóponttal.js image, erre a célra futtassa a következő parancsot, amely szintén megosztja a hálózati interfészt.

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

ezután a webhelyünk által választott helyen (pl /home) létrehozunk egy könyvtárat, amelybe a szükséges szkripteket helyezzük, és telepítjük az amqp-connection-manager könyvtárat, amely lehetővé teszi a kapcsolatot a RabbitMQ-val (vagy más, az AMQP protokollt végrehajtó rendszerrel) a csomópont szintjéről.js.

npm install --save amqp-connection-manager

ezenkívül a könyvtár lehetővé teszi több RabbitMQ host cím hozzáadását, amely mechanizmust biztosít az újracsatlakozáshoz bármely host meghibásodása esetén. Ez egy nagyon hasznos funkció, mert gondoskodik a megfelelő kapcsolatról a RabbitMQ-val, és hiba esetén képes észlelni az üzeneteket a memóriában, amíg a kapcsolat vissza nem jelenik.

minta gyártó-fogyasztói kód

most, hogy az összes komponenst elkészítettük, elkezdhetjük létrehozni egy egyszerű kódot, amely felelős az üzenetek létrehozásáért és fogadásáért. Ebből a célból két fájlt hozunk létre, és kitöltjük őket egy kóddal.

gyártó.js-a szkript csatlakozik a RabbitMQ példányhoz, és másodpercenként 10 üzenetet küld.

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

fogyasztó.js-a szkript csatlakozik a RabbitMQ példányhoz, és elkezdi olvasni az üzeneteket a sorból.

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

az így létrehozott fájlok külön futtathatók a Node használatával.a JS és a watch as consumer.jsa producer.js által előállított adatokat fogadja. Annak érdekében, hogy ellenőrizze a replikációs művelet a RabbitMQ klaszter, azt javasoljuk, hogy tiltsa le az adatcsere során szkriptek egyik RabbitMQ folyamatok, hogy hogyan a hiba lesz kezelni, és hogyan RabbitMQ kiválasztja az új mester és átirányítja az üzeneteket megfelelően.

rabbitmqctl -n john stop_app

az egyik RabbitMQ példány letiltása nem befolyásolja az üzenetek előállítását vagy letöltését. A várólisták automatikusan replikálódnak, és a kapcsolat helyreáll anélkül, hogy saját mechanizmusokat kellene végrehajtania.

összefoglalva, a RabbitMQ egy nagyszerű sorbanállási rendszer, amely biztosítja a magas rendelkezésre állást a megfelelő konfiguráció után, amely nem okoz sok problémát. Számos könyvtár sok nyelven, például csomópont.js, PHP, Java, Python, Golang, C / C++, lehetővé teszi a rendszer egyszerű megvalósítását a projektben. Azt javaslom mindenkinek, hogy olvassa el a dokumentációt, amely nagyon világosan elmagyarázza a rendszer működésével és helyes konfigurációjával kapcsolatos kérdéseket, ami valóban kiterjedt.

az összes kód a Github tárolójában található

hasonló keresések: nodejs rabbitmq / nodejs queue / rabbitmq queue nodejs