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:
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 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.
Gwaith byr RabbitMQ gellir ei ddisgrifio fel a ganlyn:
Mae'r cyhoeddwr yn anfon neges i gyfnewidfa benodol
Mae cyfnewid, ar ôl derbyn neges, yn ei gyfeirio i un ciw neu fwy yn unol â'r rheolau rhwymol rhyngddo a'r ciw
Mae'r ciw yn storio cyfeiriad at y neges hon. Mae'r neges ei hun yn cael ei storio mewn RAM neu ar ddisg
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
Mae'r defnyddiwr yn derbyn y neges ac yn anfon cadarnhad at y brocer
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:
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.
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.