KunikloMQ. Parto 1. Enkonduko. Erlang, AMQP

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:

KunikloMQ. Parto 1. Enkonduko. Erlang, AMQP

  • 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 protokolo funkcias supre TCP / IP.

Mallonge pri Erlang

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.

KunikloMQ. Parto 1. Enkonduko. Erlang, AMQP

Mallonga laboro RabbitMQ povas esti priskribita jene:

  1. La eldonisto sendas mesaĝon al specifa interŝanĝo
  2. Interŝanĝo, ricevinte mesaĝon, direktas ĝin al unu aŭ pluraj atendovicoj laŭ la devigaj reguloj inter ĝi kaj la atendovico.
  3. La vico stokas referencon al ĉi tiu mesaĝo. La mesaĝo mem estas konservita en RAM aŭ sur disko
  4. 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
  5. La konsumanto ricevas la mesaĝon kaj sendas konfirmon al la makleristo
  6. 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:

KunikloMQ. Parto 1. Enkonduko. Erlang, AMQP

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.

KunikloMQ. Parto 1. Enkonduko. Erlang, AMQP

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.

referencoj

fonto: www.habr.com

Aldoni komenton