RabbitMQ. Bahagi 1. Panimula. Erlang, AMQP

Magandang hapon, Habr! Nais kong ibahagi ang isang aklat-sangguniang aklat ng kaalaman na aking nakolekta RabbitMQ at paikliin sa maikling rekomendasyon at konklusyon.

Talaan ng nilalaman

  • RabbitMQ. Bahagi 1. Panimula. Erlang, AMQP at RPC
  • RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan
  • RabbitMQ. Bahagi 3. Pag-unawa sa Queues at Bindings
  • RabbitMQ. Bahagi 4. Pag-unawa kung ano ang mga mensahe at frame
  • RabbitMQ. Bahagi 5: Pag-publish ng Mensahe at Pagganap ng Pagkonsumo
  • RabbitMQ. Bahagi 6. Pagsusuri ng mga module ng Federation at Shovel
  • RabbitMQ. Bahagi 7. Mga Detalye tungkol sa Koneksyon at Chanel
  • RabbitMQ. Bahagi 8. RabbitMQ sa .NET
  • RabbitMQ. Bahagi 9. Pagsubaybay

Maikling tungkol sa AMQP

Ang AMQP (Advanced Message Queuing Protocol) ay isang bukas na protocol para sa pagpapadala ng mga mensahe sa pagitan ng mga bahagi ng system. Ang pangunahing ideya ay ang mga indibidwal na subsystem (o mga independiyenteng application) ay maaaring makipagpalitan ng mga mensahe sa isang arbitrary na paraan sa pamamagitan ng isang AMQP broker, na nagsasagawa ng pagruruta, posibleng ginagarantiyahan ang paghahatid, namamahagi ng mga stream ng data, at nagsu-subscribe sa nais na mga uri ng mensahe.

Protocol AMQP nagpapakilala ng tatlong konsepto:

RabbitMQ. Bahagi 1. Panimula. Erlang, AMQP

  • exchange (exchange point o exchange) - ipinapadala dito ang mga mensahe. Exchange point namamahagi ng mensahe sa isa o higit pang mga pila. Siya ruta ng mga mensahe sa isang pila batay sa mga nilikhang koneksyon (binding) sa pagitan niya at ng pila
  • queue (queue) - isang istraktura ng data sa disk o sa RAM na nag-iimbak ng mga link sa mga mensahe at nagbibigay ng mga kopya ng mga mensahe consumers (sa mga mamimili)
  • binding (binding) - isang tuntunin na nagsasabi sa exchange point kung saang pila dapat mapunta ang mga mensaheng ito

Ang protocol ay tumatakbo sa itaas TCP / IP.

Maikling tungkol kay Erlang

Ang source code ng proyekto ay nasa repositoryo sa GitHub. Arkitektura RabbitMQ-server batay sa Erlang at BEAM.

Erlang binuo ng kumpanya Ericsson noong kalagitnaan ng 1980s bilang isang distributed, fault-tolerant, real-time system para sa mga application na nangangailangan ng 99,999% uptime. Erlang ginagamit sa iba't ibang industriya at modernong aplikasyon, hal. WhatsApp. Maaari mong basahin ang higit pa sa artikulo Arkitektura ng WhatsApp, na binili ng Facebook sa halagang $19 bilyon

Maikling tungkol sa RabbitMQ

Kuneho MQ ay isang open source message broker. Niruta nito ang mga mensahe kasama ang lahat ng mga pangunahing prinsipyo ng protocol AMQP inilarawan sa mga pagtutukoy. RabbitMQ nagpapatupad at nagdaragdag sa protocol AMQP.

Ang pangunahing ideya ng modelo ng pagmemensahe sa RabbitMQ bagay ay producer (publisher) ay hindi direktang nagpapadala ng mga mensahe sa pila. Sa katunayan, at madalas, hindi alam ng publisher kung ang mensahe ay ihahatid sa anumang pila.

Sa halip, ang publisher ay maaari lamang magpadala ng mga mensahe sa exchange. Sa isang banda, ang exchange ay tumatanggap ng mga mensahe mula sa mga publisher, at sa kabilang banda, ito ay nagpapadala sa kanila sa mga pila. Dapat alam ng exchange kung ano ang gagawin sa mensaheng natatanggap nito. Dapat ba itong idagdag sa isang partikular na pila? Dapat ba itong idagdag sa maraming pila? O dapat balewalain ang mensahe.

RabbitMQ. Bahagi 1. Panimula. Erlang, AMQP

Maikling gawain RabbitMQ maaaring ilarawan tulad ng sumusunod:

  1. Nagpapadala ang publisher ng mensahe sa isang partikular na exchange
  2. Ang isang palitan, na nakatanggap ng mensahe, ay dinadala ito sa isa o higit pang mga pila alinsunod sa mga umiiral na panuntunan sa pagitan nito at ng pila.
  3. Ang pila ay nag-iimbak ng reference sa mensaheng ito. Ang mensahe mismo ay naka-imbak sa RAM o sa disk
  4. Kapag handa na ang mamimili na tumanggap ng mensahe mula sa pila, gagawa ang server ng kopya ng mensahe sa pamamagitan ng link at nagpapadala
  5. Natanggap ng mamimili ang mensahe at nagpapadala ng kumpirmasyon sa broker
  6. Ang broker, sa pagtanggap ng kumpirmasyon, ay nag-aalis ng kopya ng mensahe mula sa pila. Pagkatapos ay tinatanggal mula sa RAM at disk

RPC

paraan RPC (remote procedure call) sumasailalim sa halos lahat ng pakikipag-ugnayan sa nucleus RabbitMQ. Halimbawa, ang mga paunang talakayan tungkol sa mga tuntunin ng kliyente sa RabbitMQ, ay nagpapakita ng isang tiyak na proseso RPC. Kapag kumpleto na ang pagkakasunod-sunod na ito, RabbitMQ ay magiging handa na tumanggap ng mga kahilingan mula sa kliyente:

RabbitMQ. Bahagi 1. Panimula. Erlang, AMQP

Gayundin sa pagtutukoy AMQP parehong ang kliyente at server ay maaaring mag-isyu ng mga utos. Nangangahulugan ito na ang kliyente ay naghihintay na makipag-usap sa server. Ang mga utos ay mga klase at pamamaraan. Halimbawa, Connection.Start – tawag sa pamamaraan Start klase Connection.

Koneksyon at mga channel

Para sa naturang pagpapalitan ng impormasyon sa pagitan ng kliyente at server, mga kanal. Ang mga channel ay nilikha sa loob tiyak na koneksyon. Ang bawat channel ay nakahiwalay sa iba pang mga channel. Sa magkasabay na kaso, hindi posible na isagawa ang susunod na utos hanggang sa matanggap ang isang tugon.

Upang makapagpadala ng mga utos nang magkatulad, kailangan mong buksan ang ilang mga channel. Ang bawat channel ay gumagawa ng hiwalay Erlang proseso. Ang isang koneksyon ay maaaring magkaroon ng maraming channel (multiplexing). Para sa bawat channel mayroong ilang mga istraktura at mga bagay sa memorya. Samakatuwid, ang mas maraming mga channel sa loob ng isang koneksyon, ang Gumagamit ang RabbitMQ ng mas maraming memorya upang pamahalaan ang gayong koneksyon.

RabbitMQ. Bahagi 1. Panimula. Erlang, AMQP

Isang simpleng halimbawa ng paglikha ng koneksyon at paggamit ng channel 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 
}

Ang pagbubukas ng bagong koneksyon para sa bawat operasyon ay mahigpit na hindi hinihikayat dahil dito hahantong sa mataas na gastos. Dapat ding maging persistent ang mga channel, ngunit maraming error sa protocol ang nagiging sanhi ng pagsasara ng channel, kaya maaaring mas maikli ang buhay ng channel kaysa sa koneksyon.

Saan ginagamit ang RabbitMQ?

Sa konteksto ng mga microservice, ang protocol AMQP at ang pagpapatupad nito sa RabbitMQ kadalasang ginagamit para sa asynchronous na pakikipag-ugnayan sa pagitan ng mga serbisyo.

Sa konteksto IIOT protokol AMQP at ang pagpapatupad nito sa RabbitMQ ginagamit para sa pagpapalitan ng data sa pagitan ng mga server (server-server). Gamitin din ang plugin MQTT Plugin RabbitMQ na isang pagpapatupad ng protocol MQTT para sa pagpapadala ng data sa pagitan ng sensor at server sa mababang bilis, mataas na latency na kapaligiran (isang buong listahan ng mga sinusuportahang protocol ay nakalista sa website ng proyekto).

Sa susunod na artikulo ay sisimulan nating maunawaan ang Exchange nang mas detalyado.

sanggunian

Pinagmulan: www.habr.com

Magdagdag ng komento