God eftermiddag, Habr! Jag vill dela med mig av en lärobok-uppslagsbok med kunskap som jag lyckades samla på RabbitMQ och sammanfatta till korta rekommendationer och slutsatser.
innehållsförteckning
RabbitMQ. Del 1. Inledning. Erlang, AMQP och RPC
RabbitMQ. Del 2. Förstå utbyten
RabbitMQ. Del 3. Förstå köer och bindningar
RabbitMQ. Del 4. Förstå vad meddelanden och ramar är
RabbitMQ. Del 5: Publicera och konsumera meddelandeprestanda
RabbitMQ. Del 6. Översikt över Federation och Shovel Modules
RabbitMQ. Del 7. Detaljer om Connection och Chanel
RabbitMQ. Del 8. RabbitMQ i .NET
RabbitMQ. Del 9. Övervakning
Kort om AMQP
AMQP (Advanced Message Queuing Protocol) är ett öppet protokoll för att överföra meddelanden mellan systemkomponenter. Grundtanken är att enskilda delsystem (eller oberoende applikationer) kan utbyta meddelanden på ett godtyckligt sätt genom en AMQP-mäklare, som utför routing, eventuellt garanterar leverans, distribuerar dataströmmar och prenumererar på önskade meddelandetyper.
Protokoll AMQP introducerar tre begrepp:
exchange (utbytespunkt eller utbyte) - meddelanden skickas till den. Utbytespunkt distribuerar meddelandet i en eller flera köer. Hon dirigerar meddelanden till en kö baserat på skapade länkar (binding) mellan honom och kön
queue (kö) - en datastruktur på disk eller i RAM som lagrar länkar till meddelanden och ger kopior av meddelanden consumers (till konsumenter)
binding (bindande) - en regel som talar om för utbytespunkten vilken kö dessa meddelanden ska hamna i
Erlang utvecklat av företaget Ericsson i mitten av 1980-talet som ett distribuerat, feltolerant, realtidssystem för applikationer som kräver 99,999 % drifttid. Erlang används i olika industrier och moderna tillämpningar, t.ex. WhatsApp. Du kan läsa mer i artikeln WhatsApp-arkitekturen, som Facebook köpte för 19 miljarder dollar
Kort om RabbitMQ
RabbitMQ är en meddelandeförmedlare med öppen källkod. Det dirigerar meddelanden längs alla grundläggande principer i protokollet AMQP beskrivs i specifikationer. RabbitMQ implementerar och kompletterar protokollet AMQP.
Huvudidén med meddelandemodellen i RabbitMQ saken är producer (utgivare) skickar inte meddelanden direkt till kön. Faktum är att och ganska ofta, vet utgivaren inte ens om meddelandet kommer att levereras till någon kö alls.
Istället kan utgivaren bara skicka meddelanden till börsen. Å ena sidan tar växeln emot meddelanden från förlag, och å andra sidan skickar den dem till köer. Utbytet måste veta exakt vad det ska göra med meddelandet det får. Ska det läggas till i en specifik kö? Ska det läggas till i flera köer? Eller så bör meddelandet ignoreras.
Kort arbete RabbitMQ kan beskrivas på följande sätt:
Utgivaren skickar ett meddelande till en specifik börs
En växel, efter att ha tagit emot ett meddelande, dirigerar det till en eller flera köer i enlighet med de bindande reglerna mellan den och kön
Kön lagrar en referens till detta meddelande. Själva meddelandet lagras i RAM eller på disk
När konsumenten är redo att ta emot ett meddelande från kön skapar servern en kopia av meddelandet via en länk och skickar
Konsumenten tar emot meddelandet och skickar bekräftelse till mäklaren
Mäklaren tar, efter att ha fått bekräftelse, bort en kopia av meddelandet från kön. Raderar sedan från RAM och disk
RPC
process RPC (remote procedure call) ligger bakom nästan all interaktion med kärnan RabbitMQ. Till exempel inledande diskussioner om klientens villkor med RabbitMQ, visar en viss process RPC. När denna sekvens är klar, RabbitMQ kommer att vara redo att acceptera förfrågningar från kunden:
Även i specifikationen AMQP både klienten och servern kan utfärda kommandon. Detta innebär att klienten väntar på att kommunicera med servern. Kommandon är klasser och metoder. Till exempel, Connection.Start – metodanrop Start klass Connection.
Anslutning och kanaler
För sådant informationsutbyte mellan klient och server, kanaler. Kanaler skapas inom specifik anslutning. Varje kanal är isolerad från andra kanaler. I det synkrona fallet är det inte möjligt att utföra nästa kommando förrän ett svar tas emot.
För att kunna skicka kommandon parallellt måste du öppna flera kanaler. Varje kanal skapar en separat Erlang bearbeta. En anslutning kan ha flera kanaler (multiplexering). För varje kanal finns det vissa strukturer och objekt i minnet. Därför, ju fler kanaler det finns inom en anslutning, desto fler kanaler RabbitMQ använder mer minne att hantera en sådan anslutning.
Ett enkelt exempel på att skapa en anslutning och kanal med hjälp av 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
}
Att öppna en ny anslutning för varje operation avråds starkt eftersom detta kommer att leda till höga kostnader. Kanaler bör också vara beständiga, men många protokollfel gör att kanalen stängs, så kanalens livslängd kan vara kortare än anslutningens.
Var används RabbitMQ?
I samband med mikrotjänster, protokollet AMQP och dess genomförande i RabbitMQ används ofta för asynkron interaktion mellan tjänsterna.
I sammanhang IIOT protokoll AMQP och dess genomförande i RabbitMQ används för datautbyte mellan servrar (server-server). Använd även plugin MQTT-plugin RabbitMQ som är en implementering av protokollet MQTT för överföring av data mellan sensor och server i låghastighetsmiljöer med hög latens (en fullständig lista över protokoll som stöds finns på projektwebbplats).
I nästa artikel kommer vi att börja förstå Exchanges mer i detalj.