RabbitMQ kezdőknek, ajaxblog
RabbitMQ szerver sorok
Néha a webalkalmazások szükségessé válik, hogy végre komplex CPU-igényes feladatok, amelyeket nem lehet umeschayas rövid időintervallum a HTTP kérés. Ebben az esetben a támogatás a sorban. Az alapötlet az összes - elkerülése igényű feladatok után azonnal elküldi a kérelmet. Ehelyett a feladat várólistára későbbi végrehajtásra aszinkron. Ie vételekor egy kérelmet egy ügyfél, akkor párosítani a feladat, mint egy üzenetet, és küldje el a sorban, és a sorban már felvezető kap üzeneteket a saját érdekében és a folyamatok megfelelően. Ami a jövőt illeti, azt fogja mondani, hogy nem lehet egy sorban üzemmódban, ha jelenlétében több példányban a felvezető, a következő feladat az lesz, hogy fellépjen a szabad processzor. Így párhuzamosítás érjük feladatokat.
Ez a rész azt vizsgálja, munka sorokat használó RabbitMQ üzenetkezelő szerver. RabbitMQ szerver lényegében egy várólista-kezelő, amely a következő előnyökkel jár:
példákat az összes fenti lehetőség lesz látható a bemutató. Ez alapján a hivatalos honlapján oktatóanyagok, kiegészítve és végrehajtani PHP RabbitMQ.
Ispozuet RabbitMQ AMQP protokoll. Ahhoz Ispolzovt RabbitMQ kell tenni a kliens és a szerver.
A kiszolgáló
A telepítéshez a PHP kiterjesztés AMQP először telepíteni kell RabbitMQ Server
Add következő sort /etc/apt/sources.list-hez
Telepítése az ügyfél
alapfogalmak
A RabbitMQ, a következő szimbólumokat. Producer - program, amely üzeneteket küld. Mi fogja jelölni azt
Broker (minden) - valójában egy buffer korlátozás nélkül a tárolható üzenetek számát. Ugyanabban a körben, üzeneteket küldhet több gyártó, valamint több fogyasztói próbálja üzenetletöltéshez ugyanabban a sorban. A sort fogjuk jelölni, (egy megadott sor neve)
Fogyasztó (kedvezményezett) - egy program, amely fogadja az üzenetet a sorból. Mi fogja jelölni azt
Fontos megjegyezni, hogy a termelő, fogyasztó és irodák is találhatók különböző gépek, sőt, a legtöbb esetben ez.
Az első forgatókönyv az munkasor, egyfajta „Hello world”, majd egy szöveges üzenetet, hogy az ügyfél, hogy azt a szervert, és megjelenik.
Ie rendszer a következőképpen működik: Az első dolog az, hogy csatlakozni RabbitMQ szerver. A kapcsolat létrejötte csapatok
Segítségével Connect segítségével letölteni az objektumot a csatorna
Alapján a kapott csatornán létrehozása hőcserélő
és, sőt, a nagyon hely
Amikor a hőcserélő, és minden készen áll, akkor lehet csatlakoztatni egy kulccsal
Miután az üzenetet küldött, akkor a kapcsolat megszakadt.
A címzett is végre kell hajtania az ugyanabban a sorrendben - prikonnektitsya az üzenet szerver; - hozzon létre egy csatornát; - állapítsa meg a hőcserélő; - állapítsa meg minden; - összekapcsolása érdekében a hőcserélő a legfontosabb az utolsó két lépést, mint már említettük, nem szükséges. Most már elkezdhetjük hallgatni az összes
Itt a GET metódus a kereskedői paraméter vezetjük ARMQ_AUTOACK állandó, amely értesíti az üzenetkezelő szerver, hogy az üzenet érkezett. Ez a legegyszerűbb módja annak, hogy távolítsa el az üzenetet a sorból. Azonban ebben az esetben a hiba esetén üzenet feldolgozása vissza újra a sorban nem.
Így kap két írás
elosztott sorban
Notification (megerősítés)
Egyes feladatok végezhetők sokáig. És ki tudja, mi fog történni, hogy a szerver ezen a ponton: a szerver újraindul, vagy a probléma lefagy, vagy a végén egy végzetes hiba. Az első bemutató bejelentés leválasztotta az átviteli paraméter AMQP_AUTOACK get () metódus. Ebben az esetben az üzenetek törlődnek a memóriából közvetlenül a GET metódus esetén felmerült hiba a feldolgozás során nem fog visszatérni a sorba. Ennek elkerülése érdekében, nem fogjuk átadni AMQP_AUTOACK állandó a GET metódust. Ehelyett befejezésekor feldolgozás a hívás ack () metódust, amely értesíti a közvetítő, hogy az üzenet sikeres feldolgozása, és törölheti a memóriából. Egyébként RabbitMQ megérti, hogy az üzenet nem obratbotano és továbbítja azt a másik nem használt fogyasztói. Ugyanakkor érdemes megjegyezni, egy fontos pont. Továbbított üzenetek nem kerülnek feldolgozásra, amíg a amíg otkonnektitsya és Fogyasztói prikonnektitsya ismét bróker. Ha azt szeretnénk, hogy újra feldolgozzák az üzenetet belül ugyanazt az üzenetet a kapcsolatot a szerver, meg kell hívni a módszer Nack () a AMQP_REQUEUE zászló, hogy tegye sikertelenül kezelt probléma vissza a sorba, és értesíti a közvetítő, amely ezt a feladatot újra kell feldolgozni.
Rasprostanenie hiba - amikor a bejelentést nem megfelelően feldolgozott, hogy erősítse meg a problémát (az üzenet). Ebben az esetben minden új kapcsolat, mind a már feldolgozott probléma újra eljön feldolgozásra. A folyamat úgy néz ki mint egy rendezetlen újra stripping üzeneteket, amely végül a memória túlcsordulás. Kísérje egy ilyen helyzet lehetővé a natív szerszám rabbitmqctl Messaging Server
Az életképesség üzenete (tartósság)
Az előző részben megbeszéltük, hogy ne veszítse el az üzenetet a sorban újbóli kiküldi a sorban. Mindazonáltal, az üzenet elveszhet, ha az üzenet szerver hirtelen megállt. Ennek elkerülése érdekében a sorban kell létrehozni AMQP_DURABLE zászló.
Ha a „szia” hely már bejelentették, akkor ezt a kódot nem, mert akkor nem nyilvánítja ismét kijelentette összes többi paramétert. Ebből a helyzetből két lehetőség, vagy visszaállíthatja az összes sorok, ahogy azt mondja itt, vagy hozzon létre egy új sort a fel nem használt neve. Listájának megtekintése sorokat spoposobom említett, az előző bekezdésben. Telepítése AMQP_DURABLE zászló nem garantálja száz százalékos biztonságot üzenet a sorban. Annak ellenére, hogy az ilyen spoposbom megadjuk RabbitMQ üzenetek mentéséhez a lemezen van egy holt zóna, miután megkapta sooscheniya ha már a memóriában, de még nem menti a lemezre. Ezen a ponton, az előre nem látható helyzetekben, akkor elvész a memóriából. Ehhez az egyszerű példa az ilyen garanciák is elég, de ha a nagy garancia fogadóképességéről kell elérni, meg kell használni tranzakciókat.
Minden együtt
Például az üzenet elosztása között robban, szükségünk van egy funkció, amely szimulálja a rendszer terhelését. Ehhez használjuk a rendszeres időzítő
Elvégzésére kommunikációs shalbonu hőcserélőt kell egy tématípus, amely meghatározott AMQP_EX_TYPE_TOPIC állandó. Keys routingKey szavakból követően a ponton át, például „logs.devices.kernel.notice”, „logs.devices.cron”. A maximális hossza a kulcs lehet a 255 karaktert. Logic kulcsfontosságú üzenetek hasonló logikát hőcserélők típusú közvetlen - üzenetet egy speciális kulcs fogják szállítani, összhangban a megfelelő gombot. De van egy nagy különbség. A gombok a kommunikáció egy sablon tartalmazhat két speciális karaktereket:
- *. felel meg pontosan egy szó;
- #. tetszőleges számú szó, hogy hiányzik a szó;
Például, mi van a következő összefüggés
* .orange. *
*. *. Nyúl
lusta. #
Az első szó írja le a sebesség, a második - a szín és a harmadik - az állatfaj, azaz [Speed] [color] [faj]. Létrehoztunk három kötéssel: Q1 viszont összekötve kulcs”.orange. „És a sorban Q2 - a kulcsokat.” .rabbit "és a" lusta. #”. Így azt mondhatjuk, hogy a sorban Q1 narancs kezeli az összes állatot, és kapcsolja be a Q2 - minden madár, minden állat lassú.
Tekintsük néhány példa:
- „Quick.orange.rabbit” - mindkét sorok
- „Lazy.orange.elephant” - mindkét sorok
- „Quick.orange.fox” - csak az első
- „Lazy.brown.fox” - csak a második
- „Quick.brown.fox” - fogják dobni
- „Quick.orange.male.fox” - fogják dobni
- „Lazy.orange.male.fox” - csak a második
Hőcserélőben a tématípus megismételheti a viselkedését a hőcserélő típusától fanout, ha kapcsolatba vele bekapcsolni a kulcsot „#”. Ha a kulcs nem isplzovat speciális karakterek, mint hőcserélő megfelel majd a típusú hőcserélő közvetlen.
küld egy üzenetet
Üzeneteket küldeni egy sablont hőcserélőt kell létrehozni a téma típusáról, amely megfelel a AMQP_EX_TYPE_TOPIC állandó.
Végrehajtásának RPC sablon
A második tanulság valósult minden osztja el a terhelést az összes rendelkezésre álló fogyasztói. De mi van, ha meg kell, hogy eredményeként a sorból felvezető. Ez az úgynevezett távoli eljárás hívás, vagy RPC (távoli eljárás hívás). Ezt a leckét kell végrehajtani RPC modell segítségével RabbitMQ üzenetsort. Természetesen ez a megközelítés azt feltételezi, hogy a feldolgozás nem tarthat sokáig. Ahhoz, hogy végre a mi felvezető pelda módosítani fogja az üzenetet „üzenetet, mielőtt az” on „üzenet” után.
Általában az RPC végrehajtása révén RabbitMQ igen egyszerű. A kliens küld egy üzenetet, és a szerver válaszol. Kezelni a szerver válaszát, akkor létre kell hozni egy visszahívási sorban. Ahhoz, hogy megtudja, milyen visszahívási sorban várja a választ, meg kell küldeni a kérelmet az ő nevét. Erre a célra a termelői létrehoz egy névtelen helyét és nevét adjuk a lekérdezési paraméterek
Megjegyezzük, hogy a visszahívási sorban jön létre AMQP_EXCLUSIVE zászlót, ami azt jelenti, hogy csak az egyik Consumer lehet hallgatni ezt a sort.
Megfelelési ID
A fent vázolt módszerre, azt várjuk, hogy hozzon létre egy visszahívási sorban az egyes RPC kérés. Mert nem lehet egyedileg azonosítja a sor nevét, amely lekérdezés tartozik válaszolni a lekérdezés is hozzá CorrelationId opció, amely egy egyedi értéket minden egyes lekérdezés. Később, amikor megkapjuk a választ, mi lesz összehasonlítani correlationId átadott érték a kérést. És ha egy mismatch egyszerűen dobja ki a kapott válasz.
A végső akcióterv
- A kliens létrehoz egy névtelen visszahívási exkluzív
- A kliens küld egy kérést két paraméterrel: ReplyTo - a név a visszahívás corralationId sorban - egy egyedi értéket minden egyes lekérdezés
- A kérés a megnevezett hely, például a nevét rpc_queue
- A munkavállaló RPC (RPC szerver) vár a kérés a sorból, és amikor megjelenik a felszólítás, feldolgozza azt, és választ küld vissza az ügyfélnek, a neve a visszahívás sorba, mint egy router kulcs
- ügyfél hallgat visszahívási sorban, és ha az üzenet jelenik meg, ellenőrzi correlationId. Ha a tulajdonság értéke a fogadott üzenet megegyezik a korábban létrehozott értéket, a válasz az alkalmazás által feldolgozott.
Minden együtt
feldolgozás függvényében az üzenetet a szerver oldalon a következőképpen