RabbitMQ. Rhan 1. Rhagymadrodd. Erlang, AMQP

Prynhawn da, Habr! Rwyf am rannu llyfr cyfeirio gwerslyfr o wybodaeth y llwyddais i gasglu arno RabbitMQ ac yn crynhoi yn argymhellion a chasgliadau byr.

Tabl cynnwys

  • RabbitMQ. Rhan 1. Rhagymadrodd. Erlang, AMQP a RPC
  • RabbitMQ. Rhan 2. Deall Cyfnewidiadau
  • RabbitMQ. Rhan 3. Deall Ciwiau a Rhwymiadau
  • RabbitMQ. Rhan 4. Deall beth yw negeseuon a fframiau
  • RabbitMQ. Rhan 5: Perfformiad Cyhoeddi a Defnyddio Neges
  • RabbitMQ. Rhan 6. Trosolwg o'r Ffederasiwn a'r Modiwlau Rhaw
  • RabbitMQ. Rhan 7. Manylion am Gysswllt a Chanel
  • RabbitMQ. Rhan 8. RabbitMQ yn .NET
  • RabbitMQ. Rhan 9. Monitro

Yn fyr am AMQP

Mae AMQP (Protocol Ciwio Neges Uwch) yn brotocol agored ar gyfer trosglwyddo negeseuon rhwng cydrannau system. Y syniad sylfaenol yw y gall is-systemau unigol (neu gymwysiadau annibynnol) gyfnewid negeseuon mewn modd mympwyol trwy frocer AMQP, sy'n perfformio llwybro, o bosibl yn gwarantu danfoniad, yn dosbarthu ffrydiau data, ac yn tanysgrifio i'r mathau o negeseuon a ddymunir.

Protocol AMQP yn cyflwyno tri chysyniad:

RabbitMQ. Rhan 1. Rhagymadrodd. Erlang, AMQP

  • exchange (pwynt cyfnewid neu gyfnewid) - anfonir negeseuon ato. Pwynt cyfnewid yn dosbarthu'r neges mewn un neu fwy o giwiau. hi llwybrau negeseuon i giw yn seiliedig ar ddolenni a grëwyd (binding) rhyngddo a'r ciw
  • queue (ciw) - strwythur data ar ddisg neu mewn RAM sy'n yn storio dolenni i negeseuon ac yn rhoi copïau o negeseuon consumers (i ddefnyddwyr)
  • binding (rhwymo) — rheol bod yn dweud wrth y pwynt cyfnewid i ba giw y dylai'r negeseuon hyn fynd iddo

Mae'r protocol yn rhedeg ar ei ben TCP / IP.

Yn fyr am Erlang

Mae cod ffynhonnell y prosiect yn y gadwrfa yn GitHub. Pensaernïaeth RabbitMQ-gweinydd yn seiliedig ar erlang a BEAM.

Erlang a ddatblygwyd gan y cwmni Ericsson yng nghanol y 1980au fel system amser real ddosbarthedig sy'n gallu goddef diffygion ar gyfer ceisiadau sy'n gofyn am 99,999% uptime. Erlang a ddefnyddir mewn amrywiol ddiwydiannau a chymwysiadau modern, e.e. WhatsApp. Gallwch ddarllen mwy yn yr erthygl Pensaernïaeth WhatsApp, a brynodd Facebook am $19 biliwn

Yn fyr am RabbitMQ

RabbitMQ yn frocer negeseuon ffynhonnell agored. Mae'n cyfeirio negeseuon ar hyd holl egwyddorion sylfaenol y protocol AMQP a ddisgrifir yn manylebau. RabbitMQ gweithredu ac ategu'r protocol AMQP.

Prif syniad y model negeseuon yn RabbitMQ peth yw producer (cyhoeddwr) ddim yn anfon negeseuon yn uniongyrchol i'r ciw. Mewn gwirionedd, ac yn aml iawn, nid yw'r cyhoeddwr hyd yn oed yn gwybod a fydd y neges yn cael ei chyflwyno i unrhyw giw o gwbl.

Yn lle hynny, dim ond i'r gyfnewidfa y gall y cyhoeddwr anfon negeseuon. Ar y naill law, mae'r cyfnewid yn derbyn negeseuon gan gyhoeddwyr, ac ar y llaw arall, mae'n eu hanfon i giwiau. Rhaid i'r cyfnewid wybod yn union beth i'w wneud â'r neges y mae'n ei derbyn. A ddylid ei ychwanegu at giw penodol? A ddylid ei ychwanegu at giwiau lluosog? Neu dylid anwybyddu'r neges.

RabbitMQ. Rhan 1. Rhagymadrodd. Erlang, AMQP

Gwaith byr RabbitMQ gellir ei ddisgrifio fel a ganlyn:

  1. Mae'r cyhoeddwr yn anfon neges i gyfnewidfa benodol
  2. Mae cyfnewid, ar ôl derbyn neges, yn ei gyfeirio i un ciw neu fwy yn unol â'r rheolau rhwymol rhyngddo a'r ciw
  3. Mae'r ciw yn storio cyfeiriad at y neges hon. Mae'r neges ei hun yn cael ei storio mewn RAM neu ar ddisg
  4. Unwaith y bydd y defnyddiwr yn barod i dderbyn neges o'r ciw, mae'r gweinydd yn creu copi o'r neges trwy'r ddolen ac yn anfon
  5. Mae'r defnyddiwr yn derbyn y neges ac yn anfon cadarnhad at y brocer
  6. Mae'r brocer, ar ôl derbyn cadarnhad, yn tynnu copi o'r neges o'r ciw. Yna dileu o RAM a disg

CPR

proses RPC (galwad gweithdrefn o bell) sydd wrth wraidd bron pob rhyngweithiad â'r cnewyllyn RabbitMQ. Er enghraifft, trafodaethau cychwynnol am delerau'r cleient gyda RabbitMQ, yn dangos proses benodol RPC. Unwaith y bydd y dilyniant hwn wedi'i gwblhau, RabbitMQ yn barod i dderbyn ceisiadau gan y cleient:

RabbitMQ. Rhan 1. Rhagymadrodd. Erlang, AMQP

Hefyd yn y fanyleb AMQP gall y cleient a'r gweinydd gyhoeddi gorchmynion. Mae hyn yn golygu bod y cleient yn aros i gyfathrebu â'r gweinydd. Dosbarthiadau a dulliau yw gorchmynion. Er enghraifft, Connection.Start - galwad dull Start dosbarth Connection.

Cysylltiad a sianeli

Ar gyfer cyfnewid gwybodaeth o'r fath rhwng cleient a gweinydd, sianeli. Mae sianeli yn cael eu creu o fewn cysylltiad penodol. Mae pob sianel wedi'i hynysu oddi wrth sianeli eraill. Yn yr achos cydamserol, nid yw'n bosibl gweithredu'r gorchymyn nesaf hyd nes y derbynnir ymateb.

Er mwyn gallu anfon gorchmynion yn gyfochrog, mae'n rhaid ichi agor sawl sianel. Mae pob sianel yn creu ar wahân Erlang proses. Gall un cysylltiad fod â sianeli lluosog (amlblecsio). Ar gyfer pob sianel mae rhai strwythurau a gwrthrychau yn y cof. Felly, po fwyaf o sianeli sydd o fewn cysylltiad, y Mae RabbitMQ yn defnyddio mwy o gof i reoli cysylltiad o'r fath.

RabbitMQ. Rhan 1. Rhagymadrodd. Erlang, AMQP

Enghraifft syml o greu cysylltiad a defnyddio sianel 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 
}

Mae hyn yn cael ei annog yn gryf i beidio ag agor cysylltiad newydd ar gyfer pob gweithrediad bydd yn arwain at gostau uchel. Dylai sianeli hefyd fod yn barhaus, ond mae llawer o wallau protocol yn achosi i'r sianel gau, felly gall oes y sianel fod yn fyrrach nag oes y cysylltiad.

Ble mae RabbitMQ yn cael ei ddefnyddio?

Yng nghyd-destun microservices, y protocol AMQP a'i weithrediad yn RabbitMQ a ddefnyddir yn aml ar gyfer rhyngweithio asyncronig rhwng gwasanaethau.

Yn y cyd-destun IIOT protocol AMQP a'i weithrediad yn RabbitMQ a ddefnyddir ar gyfer cyfnewid data rhwng gweinyddwyr (gweinydd-gweinydd). Defnyddiwch yr ategyn hefyd MQTT Ategyn RabbitMQ sy'n gweithredu'r protocol Mqtt ar gyfer trosglwyddo data rhwng synhwyrydd a gweinydd mewn amgylcheddau cyflym, hwyrni uchel (rhestr lawn o brotocolau a gefnogir yn safle'r prosiect).

Yn yr erthygl nesaf byddwn yn dechrau deall Cyfnewid yn fwy manwl.

cyfeiriadau

Ffynhonnell: hab.com

Ychwanegu sylw