Bonan posttagmezon, Habr! Mi volas kunhavigi lernolibron-referencan libron de scio, kiun mi sukcesis kolekti RabbitMQ kaj kondensi en mallongajn rekomendojn kaj konkludojn.
Enhavtabelo
KunikloMQ. Parto 1. Enkonduko. Erlang, AMQP kaj RPC
KunikloMQ. Parto 2. Kompreni Interŝanĝojn
KunikloMQ. Parto 3. Kompreni Queues and Bindings
KunikloMQ. Parto 4. Kompreni kio mesaĝoj kaj kadroj estas
KunikloMQ. Parto 5: Eldonado kaj Konsumado de Mesaĝo-Efikeco
KunikloMQ. Parto 6. Superrigardo de la Federacio kaj ŜovelModuloj
KunikloMQ. Parto 7. Detaloj pri Konekto kaj Chanel
KunikloMQ. Parto 8. RabbitMQ en .NET
KunikloMQ. Parto 9. Monitorado
Mallonge pri AMQP
AMQP (Advanced Message Queuing Protocol) estas malferma protokolo por elsendado de mesaĝoj inter sistemkomponentoj. La baza ideo estas ke individuaj subsistemoj (aŭ sendependaj aplikoj) povas interŝanĝi mesaĝojn en arbitra maniero tra AMQP-makleristo, kiu elfaras vojigon, eventuale garantias liveraĵon, distribuas datumfluojn, kaj abonas la deziratajn mesaĝspecojn.
Protokolo AMQP enkondukas tri konceptojn:
exchange (interŝanĝpunkto aŭ interŝanĝo) - mesaĝoj estas sendataj al ĝi. Interŝanĝpunkto distribuas la mesaĝon en unu aŭ pluraj vicoj. Ŝi direktas mesaĝojn al atendovico surbaze de kreitaj ligiloj (binding) inter li kaj la vico
queue (queue) - datumstrukturo sur disko aŭ en RAM tio stokas ligilojn al mesaĝoj kaj donas kopiojn de mesaĝoj consumers (al konsumantoj)
binding (binding) - regulo ke diras al la interŝanĝpunkto, en kiu vico devas iri tiuj mesaĝoj
La fontkodo de la projekto estas en la deponejo ĉe GitHub. Arkitekturo RabbitMQ-servilo bazita sur erlang kaj TRABO.
Erlang disvolvita de la kompanio Ericsson en la mez-1980-aj jaroj kiel distribuita, mistolerema, realtempa sistemo por aplikoj postulantaj 99,999% da funkciado. Erlang uzata en diversaj industrioj kaj modernaj aplikoj, ekz. WhatsApp. Vi povas legi pli en la artikolo WhatsApp-arkitekturo, kiun Facebook aĉetis por $ 19 miliardoj
Mallonge pri RabbitMQ
KunikloMQ estas malfermfonta mesaĝmakleristo. Ĝi direktas mesaĝojn laŭ ĉiuj bazaj principoj de la protokolo AMQP priskribita en specifoj. RabbitMQ efektivigas kaj kompletigas la protokolon AMQP.
La ĉefa ideo de la mesaĝa modelo en RabbitMQ afero estas producer (eldonisto) ne sendas mesaĝojn rekte al la vico. Fakte, kaj sufiĉe ofte, la eldonejo eĉ ne scias ĉu la mesaĝo estos liverita al iu vico entute.
Anstataŭe, la eldonisto povas nur sendi mesaĝojn al la interŝanĝo. Unuflanke, la interŝanĝo ricevas mesaĝojn de eldonejoj, kaj aliflanke, ĝi sendas ilin al atendovicoj. La interŝanĝo devas scii precize kion fari kun la mesaĝo, kiun ĝi ricevas. Ĉu ĝi estu aldonita al specifa vico? Ĉu ĝi estu aldonita al pluraj vicoj? Aŭ la mesaĝo estu ignorita.
Mallonga laboro RabbitMQ povas esti priskribita jene:
La eldonisto sendas mesaĝon al specifa interŝanĝo
Interŝanĝo, ricevinte mesaĝon, direktas ĝin al unu aŭ pluraj atendovicoj laŭ la devigaj reguloj inter ĝi kaj la atendovico.
La vico stokas referencon al ĉi tiu mesaĝo. La mesaĝo mem estas konservita en RAM aŭ sur disko
Post kiam la konsumanto estas preta ricevi mesaĝon de la atendovico, la servilo kreas kopion de la mesaĝo per la ligo kaj sendas
La konsumanto ricevas la mesaĝon kaj sendas konfirmon al la makleristo
La makleristo, ricevinte konfirmon, forigas kopion de la mesaĝo el la atendovico. Tiam forigas de RAM kaj disko
CPR
procezo RPC (fora procedovoko) subestas preskaŭ ĉiuj interagoj kun la nukleo RabbitMQ. Ekzemple, komencaj diskutoj pri la kondiĉoj de la kliento kun RabbitMQ, montras certan procezon RPC. Post kiam ĉi tiu sekvenco estas kompleta, RabbitMQ estos preta akcepti petojn de la kliento:
Ankaŭ en la specifo AMQP kaj la kliento kaj servilo povas eligi komandojn. Ĉi tio signifas, ke la kliento atendas por komuniki kun la servilo. Komandoj estas klasoj kaj metodoj. Ekzemple, Connection.Start – metodovoko Start klaso Connection.
Konekto kaj kanaloj
Por tia informinterŝanĝo inter kliento kaj servilo, kanaloj. Kanaloj estas kreitaj ene specifa rilato. Ĉiu kanalo estas izolita de aliaj kanaloj. En la sinkrona kazo, ne eblas efektivigi la sekvan komandon ĝis respondo estas ricevita.
Por povi sendi komandojn paralele, vi devas malfermi plurajn kanalojn. Ĉiu kanalo kreas apartan Erlang procezo. Unu konekto povas havi plurajn kanalojn (multipleksado). Por ĉiu kanalo estas certaj strukturoj kaj objektoj en memoro. Tial, ju pli da kanaloj estas ene de konekto, des RabbitMQ uzas pli da memoro administri tian konekton.
Simpla ekzemplo de kreado de konekto kaj kanalo uzante RabbitMQ.Kliento:
// ...
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
}
Malfermi novan konekton por ĉiu operacio estas forte malinstigita pro tio kondukos al altaj kostoj. Kanaloj ankaŭ devus esti persistaj, sed multaj protokoleraroj igas la kanalon fermiĝi, do la vivdaŭro de la kanalo povas esti pli mallonga ol tiu de la konekto.
Kie estas uzata RabbitMQ?
En la kunteksto de mikroservoj, la protokolo AMQP kaj ĝia efektivigo en RabbitMQ ofte uzata por nesinkrona interago inter servoj.
En la kunteksto IIOT protokolo AMQP kaj ĝia efektivigo en RabbitMQ uzata por interŝanĝo de datumoj inter serviloj (servilo-servilo). Ankaŭ uzu la kromprogramon MQTT Kromaĵo RabbitMQ kiu estas efektivigo de la protokolo MQTT por elsendado de datumoj inter sensilo kaj servilo en malalt-rapidecaj, alt-latentecaj medioj (plena listo de subtenataj protokoloj estas listigita ĉe retejo de la projekto).
En la sekva artikolo ni komencos kompreni Interŝanĝojn pli detale.