Jó napot, Habr! Szeretnék megosztani egy tankönyv-ismereti kézikönyvet, amit sikerült összegyűjtenem RabbitMQ és rövid ajánlásokba és következtetésekbe sűrítjük.
tartalomjegyzék
RabbitMQ. 1. rész Bevezetés. Erlang, AMQP és RPC
RabbitMQ. 2. rész: A cserék megértése
RabbitMQ. 3. rész: Várólisták és kötések megértése
RabbitMQ. 4. rész: Az üzenetek és keretek megértése
RabbitMQ. 5. rész: Üzenetkiadás és fogyasztási teljesítmény
RabbitMQ. 6. rész. Az összevonás és a lapát modulok áttekintése
RabbitMQ. 7. rész. Részletek a Connectionról és a Chanelről
RabbitMQ. 8. rész. RabbitMQ .NET-ben
RabbitMQ. 9. rész Monitoring
Röviden az AMQP-ről
Az AMQP (Advanced Message Queuing Protocol) egy nyílt protokoll az üzenetek rendszerösszetevők közötti továbbítására. Az alapötlet az, hogy az egyes alrendszerek (vagy független alkalmazások) tetszőleges módon tudnak üzeneteket cserélni egy AMQP-brókeren keresztül, amely útválasztást végez, esetleg kézbesítést garantál, adatfolyamokat oszt el, és előfizet a kívánt üzenettípusokra.
Jegyzőkönyv AMQP három fogalmat vezet be:
exchange (cserepont vagy csere) - üzeneteket küldenek rá. Valutaváltó üzenetet terjeszt egy vagy több sorban. Ő sorba irányítja az üzeneteket a létrehozott kapcsolatok alapján (binding) közte és a sor között
queue (queue) - olyan adatstruktúra a lemezen vagy a RAM-ban, amely üzenetekre mutató hivatkozásokat tárol, és másolatokat ad az üzenetekről consumers (fogyasztóknak)
binding (kötelező) - szabály, amely megmondja a cserepontnak, hogy ezeknek az üzeneteknek melyik sorba kell kerülniük
A projekt forráskódja a következő címen található tárolóban található GitHub. Építészet RabbitMQ-szerver alapján Erlang és BEAM.
Erlang a cég fejlesztette ki Ericsson az 1980-as évek közepén elosztott, hibatűrő, valós idejű rendszerként 99,999%-os rendelkezésre állást igénylő alkalmazásokhoz. Erlang különféle iparágakban és modern alkalmazásokban használják, pl. WhatsApp. Bővebben a cikkben olvashat WhatsApp architektúra, amelyet a Facebook 19 milliárd dollárért vásárolt meg
Röviden a RabbitMQ-ról
Nyúl MQ egy nyílt forráskódú üzenetközvetítő. Az üzeneteket a protokoll összes alapelve mentén irányítja AMQP -ban leírva specifikációk. RabbitMQ végrehajtja és kiegészíti a protokollt AMQP.
Az üzenetküldési modell fő ötlete RabbitMQ dolog az producer (kiadó) nem küld üzeneteket közvetlenül a sorba. Valójában, és elég gyakran, a kiadó még azt sem tudja, hogy az üzenetet eljuttatják-e egyáltalán valamelyik sorba.
Ehelyett a kiadó csak üzeneteket küldhet a központnak. A központ egyrészt fogadja az üzeneteket a kiadóktól, másrészt sorokba küldi azokat. A központnak pontosan tudnia kell, mit kell tennie a kapott üzenettel. Hozzá kell adni egy adott sorhoz? Hozzá kell adni több sorhoz? Vagy figyelmen kívül kell hagyni az üzenetet.
Rövid munka RabbitMQ a következőképpen írható le:
A kiadó üzenetet küld egy adott központnak
Egy központ, miután megkapta az üzenetet, egy vagy több sorba irányítja azt a közte és a sor közötti kötelező szabályoknak megfelelően
A várólista egy hivatkozást tárol erre az üzenetre. Maga az üzenet a RAM-ban vagy a lemezen van tárolva
Amikor a fogyasztó készen áll arra, hogy üzenetet fogadjon a sorból, a szerver a hivatkozáson keresztül létrehozza az üzenet másolatát, és elküldi
A fogyasztó megkapja az üzenetet és visszaigazolást küld a brókernek
A bróker a visszaigazolást követően eltávolítja az üzenet másolatát a sorból. Ezután törli a RAM-ból és a lemezről
RPC
folyamat RPC (távoli eljáráshívás) szinte minden kölcsönhatás alapja a maggal RabbitMQ. Például kezdeti megbeszélések az ügyfél feltételeiről RabbitMQ, egy bizonyos folyamatot mutat be RPC. Ha ez a sorozat befejeződött, RabbitMQ készen áll az ügyféltől érkező kérések fogadására:
A specifikációban is AMQP a kliens és a szerver is kiadhat parancsokat. Ez azt jelenti, hogy az ügyfél arra vár, hogy kommunikáljon a szerverrel. A parancsok osztályok és metódusok. Például, Connection.Start – módszerhívás Start класса Connection.
Csatlakozás és csatornák
A kliens és a szerver közötti ilyen információcseréhez csatornák. A csatornák belül jönnek létre konkrét kapcsolat. Minden csatorna el van szigetelve a többi csatornától. Szinkron esetben a következő parancs végrehajtása nem lehetséges, amíg nem érkezik válasz.
Ahhoz, hogy párhuzamosan tudjon parancsokat küldeni, több csatornát kell megnyitnia. Minden csatorna külön csatornát hoz létre Erlang folyamat. Egy kapcsolatnak több csatornája is lehet (multiplexer). Minden csatornához vannak bizonyos struktúrák és objektumok a memóriában. Ezért minél több csatorna van egy kapcsolaton belül, az A RabbitMQ több memóriát használ egy ilyen kapcsolat kezeléséhez.
Egy egyszerű példa a kapcsolat és csatorna létrehozására RabbitMQ.Client:
// ...
private void TryConnect()
{
var factory = new ConnectionFactory()
{
HostName = "host_name",
UserName = "user_name",
Password = "p@ssword",
// Включение автоматичекого восстановления
// соединения после сбоев сети
AutomaticRecoveryEnabled = true
};
_connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
_channel = _connection.CreateModel();
// other options
}
Erősen nem ajánlott minden egyes művelethez új kapcsolatot nyitni magas költségekhez vezet. A csatornáknak is állandónak kell lenniük, de sok protokollhiba miatt a csatorna bezárul, így a csatorna élettartama rövidebb lehet, mint a kapcsolaté.
Hol használják a RabbitMQ-t?
A mikroszolgáltatások keretében a protokoll AMQP és végrehajtása ben RabbitMQ gyakran használják aszinkron interakció szolgáltatások között.
A kontextusban IIOT jegyzőkönyv AMQP és végrehajtása ben RabbitMQ szerverek közötti adatcserére használják (szerver-szerver). Használja a plugint is MQTT Plugin RabbitMQ amely a protokoll megvalósítása MQTT adatátvitelhez az érzékelő és a szerver között kis sebességű, nagy késleltetésű környezetekben (a támogatott protokollok teljes listája itt található projekt honlapja).
A következő cikkben elkezdjük részletesebben megérteni a cseréket.