Įvadas į AMQP protokolą
AMQP (Advanced Message Queuing Protocol) yra taikomojo lygmens standartinis protokolas, teikiantis vieningas pranešimų siuntimo paslaugas, ir yra atviras taikomųjų programų lygmens protokolų, skirtų į pranešimus orientuotai tarpinei programinei įrangai, standartas. AMQP yra tinklo protokolas, skirtas asinchroniniams pranešimams perduoti tarp procesų.
Šiuo protokolu pagrįsti klientai ir pranešimų tarpinė programinė įranga gali pristatyti pranešimus neribojant skirtingų klientų / tarpinės programinės įrangos produktų, skirtingų kūrimo kalbų ir kt.
Pagrindinės AMQP savybės yra orientuotos į pranešimus, eilėje, maršruto parinkimas (įskaitant peer-to-peer ir publikavimą / prenumeravimą), patikimumas ir saugumas. AMQP užtikrina pranešimų teikėjų ir klientų elgesį, įgalindamas tikrą skirtingų pardavėjų sąveiką.
AMQP ir JMS
JMS buvo bandymas standartizuoti ankstyvąją pranešimų tarpinę programinę įrangą, ji buvo standartizuota tik API lygiu, ir ji toli gražu nesukūrė sąveikos.
Skirtingai nuo JMS, AMQP yra laido lygio protokolas, apibūdinantis tinklu perduodamų duomenų, tekančių baitais, formatą. Todėl bet koks įrankis, kuris laikosi šio duomenų formato, kuris kuria ir interpretuoja pranešimus, yra sąveikus su kitais suderinamais įrankiais.
AMQP šerdies sudėtis
Prodiuseris
Gamybos naujienos.
Ryšio gamykla
Gamykla, gaminanti "Connection".
Ryšys
Ryšys, programų tinklo ryšys su Broker TCP/IP/Triple Handshake ir Quad Wave.
AMQP jungtys paprastai yra ilgos jungtys. AMQP yra programų lygmens protokolas, kuris naudoja TCP, kad užtikrintų patikimą pristatymą. AMQP naudoja autentifikavimo mechanizmus ir užtikrina TLS (SSL) apsaugą. Kai programai nebereikia prisijungti prie AMQP tarpinio serverio, ji turi grakščiai atlaisvinti AMQP ryšį, o ne tiesiog išjungti TCP ryšį.
Kanalas
Tinklo kanalas yra lengvas ryšys, sukurtas ant ryšio. Beveik visos operacijos atliekamos kanaluose, kurie yra pranešimų skaitymo ir rašymo kanalai, o klientai gali sudaryti kiekvieno kanalo poras, kurių kiekviena atspindi sesijos užduotį.
Jei ryšys lyginamas su šviesolaidiniu kabeliu, kanalo kanalas lyginamas su vienu iš šviesolaidinio kabelio skaidulų. Ryšyje galima sukurti bet kokį kanalų skaičių.
Dauguma mūsų verslo operacijų atliekamos kanalo sąsajoje, įskaitant:
- queueDeclare
- Exchange Declare jungikliui
- queueBind queueBind
- Pagrindinis pranešimo publikavimasPublikuoti
- Vartotojų naujienosbasicVartoti ir kt.
Brokeris
Priimkite kliento ryšį, kad galėtumėte įdiegti AMQP subjekto paslaugas, pvz., rabbitmq.
VirtualHost (žiniatinklio priegloba)
Virtualus priegloba, naudojama loginei izoliacijai, virtualus pagrindinis kompiuteris gali turėti keletą mainų ir eilių, o tas pats virtualus pagrindinis kompiuteris negali turėti mainų tuo pačiu pavadinimu.
Norint įdiegti kelias izoliuotas aplinkas (vartotojus, vartotojų grupes, komutatorius, eiles ir kt.) viename tarpiniame serveryje, AMQP pateikia virtualių kompiuterių (virtualių kompiuterių - vhostų) koncepciją. Tai labai panašu į žiniatinklio serverių žiniatinklio prieglobos koncepciją, kuri suteikia visiškai izoliuotą aplinką AMQP subjektams. Užmezgus ryšį, AMQP klientas nurodo, kurį virtualų pagrindinį kompiuterį naudoti.
Apsikeitimas
Komutatorius priima pranešimus ir siunčia pranešimus į susietą eilę pagal maršruto parinkimo raktą (be pranešimų saugojimo galimybių).
Komutatorius yra AMQP objektas, naudojamas pranešimams siųsti. Kai jungiklis gauna pranešimą, jis nukreipia jį į vieną arba nulinę eilę. Jo naudojamas maršruto parinkimo algoritmas nustatomas pagal jungiklio tipą ir įpareigojimo taisykles.
Jungiklio tipas:
- Tiesioginiai mainai
- Fanout mainai
- Temų mainai
- Antraštės mainai
Jungiklio ypatybės:
- Pavadinimas: jungiklio pavadinimas
- Patvarumas: patvarumo žyma, nurodanti, ar šis jungiklis yra nuolatinis, ar ne
- Automatinis ištrynimas: ištrinti vėliavėlę, nurodančiąKai visos eilės baigiamos naudojant šį mainą, ar jos panaikintos
- Argumentai: Priklauso nuo paties agento
Perjungimo būsena:
Nuolatiniai jungikliai egzistuos iš naujo paleidus brokerį, o etapiniai komutatoriai nebus (juos reikės iš naujo deklaruoti, kai brokeris vėl prisijungs).
Numatytasis jungiklis
Numatytoji birža iš tikrųjų yra tiesioginė birža, kurią iš anksto deklaravo pranešimų tarpininkas ir neturi pavadinimo (pavadinimas yra tuščia eilutė).
Numatytąjį jungiklį galite įsivaizduoti kaip specialų tiesiogiai prijungtą jungiklį. Numatytasis jungiklio pavadinimas: nulinė eilutė (numatytoji AMQP) Numatytasis jungiklio tipas: tiesiogiai prijungtas jungiklis
Kuriant eilę, kol nenurodytas jungiklis, kurį reikia susieti, jis bus automatiškai susietas su numatytuoju jungikliu, o susiejimo maršruto parinkimo rakto pavadinimas bus toks pat kaip eilės pavadinimas.
Tiesioginis ryšys su jungikliu
Tiesiogiai prijungtas komutatorius pristato pranešimus į atitinkamų susiejimo raktų eilę, pagrįstą pranešimo nešamu maršruto parinkimo raktu. Unicast maršruto parinkimas, kurį tiesioginis jungiklis naudoja pranešimui tvarkyti.
Kuriant eilę, jei ji susieta su tiesioginiu komutatoriumi, nereikia nurodyti maršruto parinkimo rakto pavadinimo, nes ji turės numatytąjį maršruto parinkimo rakto pavadinimą, kuris yra toks pat kaip eilės pavadinimas.
Tiesiogiai prijungtų jungiklių eilė paprastai paskirsto užduotis keliems vartotojams ciklu (mes tai vadiname apklausa).
Darbo eiga:
- Susiedami eilę su komutatoriumi, duokite jam susiejimo raktą, darant prielaidą, kad R;
- Kai pranešimas su maršruto parinkimo raktu siunčiamas į tiesiogiai prijungtą jungiklį, komutatorius nukreipia jį į eilę su maršruto parinkimo raktu.
Ventiliatorių jungikliai
Ventiliatoriaus jungiklis nukreipia pranešimus į visas su juo susietas eiles, nepriklausomai nuo susieto maršruto parinkimo rakto.
Jei N eilės yra susietos su sektoriaus komutatoriumi, kai pranešimas siunčiamas šiam sektoriaus komutatoriui, komutatorius siunčia pranešimo kopiją į visas N eiles atskirai. Ventiliatorių jungikliai paprastai naudojami pranešimų transliavimo maršrutui tvarkyti.
Taikymo scenarijai:
transliuoti pranešimus; Grupinio pokalbio funkcija.
Temos jungiklis
Temos jungiklis siunčia pranešimus į vieną ar kelias eiles pagal maršruto parinkimo raktą ir "Exchange" tipą, ir mes dažnai jį naudojame įvairiems publikavimui/prenumeravimui, tai yra, prenumeratoms skelbti.
Tiesiogiai prijungtų komutatorių maršruto parinkimo taisyklės yra griežtai suderintos, o tai reiškia, kad maršruto parinkimo raktas turi atitikti susiejimo raktą prieš siunčiant pranešimą į eilę. Temos jungiklio maršruto parinkimo taisyklės yra neaiškios rungtynės, kurias galima pristatyti įvykdžius kai kurias taisykles naudojant pakaitos simbolius.
Jame nustatyta:
- Įrišimo klaviše gali būti du specialieji simboliai * ir #, kad būtų galima neryškiai suderinti. kur * naudojamas žodžiui atitikti, #用于匹配多个单词 (gali būti nulis)
- Maršruto parinkimo raktas yra taškais atskirta eilutė (kiekvieną atskirą eilutę, atskirtą taškiniu ženklu, vadiname žodžiu)
- Kai gamintojas siunčia pranešimą Routing Key=A.A.A, tenkinamas tik A.*.* ir jis bus nukreiptas tik į 1 eilę.
- Kai gamintojas siunčia pranešimą Routing Key=A.B.A, tenkinantys A.*.* ir *.B.* bus nukreipti į 1 ir 2 eiles.
- Kai gamintojas siunčia pranešimą Routing Key=A.B.C, tada A.*.* ir *.B.* ir *.* yra patenkinti. C nukreipiamas į 1 eilę, 2 eilę, 3 eilę.
Taikymo scenarijai:
- naujienų atnaujinimai, susiję su kategorijomis ar žymomis;
- Foninės užduotys, kurias atlieka keli darbuotojai, kurių kiekvienas yra atsakingas už tam tikrų konkrečių užduočių atlikimą.
Galvos jungiklis
Antraštės komutatoriai nesiremia maršruto parinkimo rakto gretinimo taisyklėmis, kad susietų raktus su nukreipimo pranešimais, o atitinka antraštės atributą išsiųsto pranešimo turinyje.
Galvos jungikliai gali būti laikomi dar viena tiesiogiai prijungto jungiklio apraiška. Tačiau tiesioginio jungiklio maršruto parinkimo raktas turi būti eilutė, o antraštės atributų reikšmės nėra ribojamos, jos gali būti net sveikieji skaičiai arba maišos reikšmės (žodynai) ir kt. Daugiau lankstumo (tačiau praktiškai retai naudojame galvos jungiklius).
Darbo eiga:
- Kai eilė susieta su antraštės jungikliu, kelios antraštės yra susietos vienu metu, kad būtų galima sugretinti.
- Gaunami pranešimai turi antraštę ir "x-match" parametrą. Kai "x-match" nustatyta kaip "any", bet kuri antraštės reikšmė gali būti suderinta, o kai "x-match" nustatyta kaip "all", visos antraštės reikšmės turi būti suderintos.
Perjungimo suvestinė
Privalomas
Virtualus ryšys tarp "Exchange" ir "Queue".
BindingKey yra "Exchange" ir eilės susiejimų taisyklės aprašas. Susiejimo raktas nurodo, koks maršruto raktas bus priskirtas šiuo metu susietajai eilei dabartinėje biržoje.
Maršruto parinkimo raktas
Maršruto parinkimo taisyklės, kurias virtuali mašina gali naudoti norėdama nustatyti, kaip nukreipti konkretų pranešimą.
Susiejimo raktas ir maršruto parinkimo raktas
- Susiejimo raktas yra susiejimo raktas tarp eilės ir jungiklio;
- Maršruto raktas yra informacija, kurią gamintojas siunčia komutatoriui;
- Kai susiejimo raktas ir maršruto parinkimo raktas sutampa, įdėkite pranešimą į atitinkamą eilę.
Susiejimo raktas yra "Exchange" ir eilės susiejimo taisyklės aprašymas, kuris naudojamas analizuoti, kai "Exchange" gauna pranešimą, "Exchange" gaunamas pranešimas turės lauką Nukreipimo raktas, o "Exchange" sugretins šį maršruto parinkimo raktą su visais dabartinės "Exchange" susiejimo raktais, o jei reikalavimai bus įvykdyti, jis bus siunčiamas į susiejimą Raktas susietas su pranešimo siuntimo eile.
Įrišimo raktas ir maršruto parinkimo raktas įvairiuose jungikliuose
Numatytasis jungiklis: susiejimo raktas yra eilės pavadinimas, kurio negalima tinkinti. Maršruto parinkimo raktas taip pat yra eilės pavadinimas, kad jį būtų galima sėkmingai nukreipti į eilę Tiesioginio ryšio jungiklis: Susiejimo raktas yra eilės pavadinimas, kurį galima tinkinti. Maršruto parinkimo raktus galima sėkmingai nukreipti į eilę tik tada, kai susiejimo raktas yra tas pats Ventiliatoriaus jungiklis: nėra įrišimo rakto; Žinoma, nėra maršruto parinkimo rakto. Automatiškai nukreipiama į visas eiles, susietas su komutatoriumi Temos jungiklis: pasirinktinis įrišimo klavišas; Tinkinkite maršruto parinkimo raktą. Maršruto raktas==Susiejimo raktas, o neryškus atitikmuo turi būti sėkmingai nukreiptas į eilę Galvos jungiklis: nėra įrišimo rakto; Žinoma, nėra maršruto parinkimo rakto. Atitikmenys pagal antraštės atributą išsiųsto pranešimo turinyje
Eilė
Saugo pranešimus, kuriuos netrukus sunaudos programa.
Eilės ypatybės:
- Pavadinimas: eilės pavadinimas
- Patvarus: eilė vis dar egzistuoja iš naujo paleidus pranešimų tarpininką
- Išskirtinis: naudojamas tik vienam ryšiui, o eilė panaikinama, kai ryšys uždaromas
- Automatinis ištrynimas: ištrinama, kai paskutinis vartotojas atsisako prenumeratos
- Argumentai: Kai kurie pranešimų brokeriai jį naudoja kai kurioms papildomoms funkcijoms, panašioms į TTL
Eilės kūrimas: Eilės gali būti naudojamos tik jas paskelbus. Jei eilės dar nėra, ji sukuriama deklaruojant eilę. Jei deklaruota eilė jau yra ir atributai yra identiški, deklaracija neturi įtakos pradinei eilei. Jei deklaracijoje esantys atributai skiriasi nuo esamos eilės atributų, pateikiama kanalo lygio išimtis su klaidos kodu 406.
Eilės išlikimas: Atkaklumo eilė saugoma diske ir lieka ten, kai brokeris paleidžiamas iš naujo. Neišliekančios eilės vadinamos trumpalaikėmis eilėmis. Ne visiems scenarijams ir atvejams reikia nuolatinės eilės.
Nuolatinė eilė nepadaro į ją nukreiptų pranešimų nuolatiniais. Jei pranešimų agentas užstringa ir paleidžiamas iš naujo, paleidimo iš naujo metu bus iš naujo paskelbta pastovumo eilė ir bet kokiu atveju galima iš naujo atkurti tik nuolatinius pranešimus.
Vartotojas
Vartotojų vartojimo naujienos. AMQP vartotojai gali gauti laukiančius pranešimus dviem būdais:
Pranešimų tarpinė programinė įranga pristato pranešimus vartotojams (push API) Vartotojai aktyviai gauna pranešimus (pull API) Pastaba: kai keli vartotojai klausosi tos pačios eilės, eilėje esančius pranešimus vartoja tik vienas iš vartotojų (ne vieną kartą kiekvienam vartotojui)
Pranešimas
Tarp pranešimų, paslaugų ir programų perduodami duomenys susideda iš ypatybių ir kūnų.
Atributai modifikuoja pranešimus, pvz., pranešimo prioritetą, delsą ir kitas išplėstines funkcijas, o pagrindinis turinys yra pranešimo turinys.
Pranešimo ypatybės:
- Turinio tipas
- Turinio kodavimas
- Maršruto parinkimo raktas
- Pristatymo būdas (nuolatinis ar ne)
- Pristatymo būdas (nuolatinis arba nenuolatinis)
- Pranešimo prioritetas
- Pranešimo publikavimo laiko žyma
- Galiojimo laikas
- Publisher programos ID
Pranešimo turinys: Be atributų, AMQP pranešimuose taip pat yra naudingoji apkrova (duomenys, kuriuos pranešimas iš tikrųjų perduoda), kurį AMQP tarpinis serveris traktuoja kaip nepermatomą baitų masyvą.
Pranešimų tarpininkas netikrina ir nekeičia naudingosios apkrovos. Pranešimuose gali būti tik atributai, neturintys naudingojo krovinio. Paprastai ji naudoja duomenis serijiniu formatu, pvz., JSON, ir sutaupyti pinigų, protokolo buferiai ir MessagePacks bus serializuoti struktūrizuotus duomenis skelbti kaip naudingą pranešimų apkrovą. AMQP ir jos bendraamžiai paprastai naudoja laukus "turinio tipas" ir "turinio kodavimas", kad bendrautų su pranešimais, kad identifikuotų naudingąsias apkrovas, tačiau tai pagrįsta tik konvencijomis.
Pranešimo išlikimas: Pranešimai publikuojami nuolat, o AMQP agentas saugo šį pranešimą diske. Jei serveris paleidžiamas iš naujo, sistema patvirtina, kad gautas atkaklumo pranešimas neprarastas.
Tiesiog siunčiant pranešimą į nuolatinį jungiklį arba nukreipiant jį į nuolatinę eilę, pranešimas nepadaro nuolatinio pranešimo: pranešimo patvarumas visiškai priklauso nuo paties pranešimo patvarumo režimo.
Nuolatinis pranešimų skelbimas gali turėti įtakos našumui.
AMQP darbo procesas
Leidėjas skelbia pranešimą per "Exchange".
Komutatorius paskirsto gaunamus pranešimus į eilę, susietą su komutatoriumi pagal maršruto parinkimo taisykles.
Galiausiai AMQP agentas pristatys pranešimą vartotojui, užsiprenumeravusiam šią eilę, arba vartotojas prireikus gaus pats.
AMQP pranešimų mechanizmas
Pranešimo patvirtinimas
Vartotojai kartais neapdoroja pranešimų arba kartais sugenda tiesiogiai. Tinklo priežastys taip pat gali sukelti įvairių problemų. Tai kelia mums klausimą, kada yra tinkamas laikas AMQP agentams ištrinti pranešimus.
Du AMQP pranešimų patvirtinimo režimai:
Automatinio patvirtinimo režimas: ištrinkite pranešimą, kai tik jį vartotojui išsiunčia tarpinė programinė įranga. (Naudojant AMQP metodą: basic.deliver arba basic.get-ok) Aiškaus patvirtinimo režimas: prieš ištrindami pranešimą palaukite, kol vartotojas atsiųs patvirtinimą. (Naudojant AMQP metodą: basic.ack) Jei vartotojas pakabina ragelį neišsiuntęs patvirtinimo kvito, AMQP agentas pakartotinai pristato pranešimą kitam vartotojui. Jei tuo metu nėra vartotojų, pranešimų tarpininkas laukia, kol kitas vartotojas užsiregistruos šioje eilėje, ir bando pristatyti dar kartą.
Atmesti pranešimus
Kai vartotojas gauna pranešimą, tvarkymo procesas gali būti sėkmingas arba nesėkmingas. Vartotojas gali nurodyti pranešimų tarpininkui (pranešimų tarpinei programinei įrangai), kad pranešimas nebuvo apdorotas (arba šiuo metu nepavyko užbaigti) dėl "atmesto pranešimo". Kai pranešimas atmetamas, vartotojas gali pasakyti pranešimų tarpininkui, ką daryti su pranešimu - sunaikinti jį arba vėl įdėti į eilę.
Kai šioje eilėje yra tik vienas vartotojas, įsitikinkite, kad neatmetate pranešimo ir pasirenkate jį vėl įtraukti į eilę, todėl pranešimas bus neribotą laiką perduodamas tam pačiam vartotojui.
AMQP metodas basic.reject naudojamas pranešimų atmetimo operacijai atlikti. Tačiau basic.reject turi apribojimą: negalite jo naudoti keliems pranešimams su patvirtinimais atmesti. Bet jei naudojate RabbitMQ, šiai problemai išspręsti galite naudoti AMQP 0-9-1 plėtinį, vadinamą neigiamais patvirtinimais (dar vadinamais nacks).
Originalus:Hipersaito prisijungimas matomas.
|