Meddelandeköer

Slutförd

En meddelandekö är en metod som används för IPC (inter-process communication – kommunikation mellan processer) eller mellan olika komponenter i ett program eller flera program. Meddelandeköer innehåller ett protokoll eller gränssnitt för att möjliggöra meddelandeöverföring.

Meddelandeköer för IPC inom en dator har gjorts tillgängliga via UNIX <sys.msg.h>- och POSIX mqueue.h-systembibliotek, där de kan användas i både synkront och asynkront läge. Ett synkront meddelande kräver att sändnings- eller mottagningsprocesser blockeras medan meddelandet skickas, tills det har bekräftats av mottagaren. Asynkrona meddelanden blockerar inte sändnings- eller mottagningsprocesser och kan buffras för fördröjd leverans.

För program som kan sträcka sig över flera datorer har ett antal meddelandekösystem, både tillverkarspecifika och med öppen källkod, utvecklats, till exempel IBM:s WebSphere MQ, Java Message Service (JMS) och RabbitMQ. Alla dessa system ger möjlighet att skicka, hantera och ta emot meddelanden.

Användning av meddelandeköer kan göra programdesignen mer komplex och öka antalet tjänster som måste hanteras, i jämförelse med traditionella meddelandefunktioner med begäran och svar. Men i en viss skala, och för dataströmbearbetningsprogram, behövs distribuerade meddelandekösystem för att hantera den extra komplexiteten och skalan.

Ett gränssnitt ansluter till avsändare (eller producenter), som skapar meddelanden, och till mottagare (eller konsumenter), som kan ta emot meddelanden.

Bild 1: Ett gränssnitt ansluter till avsändare (eller producenter), som skapar meddelanden, och till mottagare (eller konsumenter), som kan ta emot meddelanden.

Egenskaper för meddelandeköer

Meddelandeköer och deras nyhet kan förstås och uppskattas när de jämförs med traditionella RPC- och begäran–svar-mekanismer. De primära funktionerna i en meddelandekö är följande:

Lagring: Till skillnad från traditionella begäran–svar-system som förlitar sig på grundläggande TCP- och UDP-protokoll via socketar lagrar meddelandeköer vanligtvis meddelande i någon typ av buffert tills de antingen har lästs av en målprocess eller uttryckligen tagits bort från meddelandekön.

Asynkronicitet: I motsats till begäran–svar-system tillåter buffringen av meddelanden köer att ha en viss grad av asynkronicitet i program, så att källmeddelanden kan skicka meddelanden och ackumuleras i en kö medan destinationsprocessen hämtar dem för bearbetning. Det gör att program kan fungera i vissa felscenarier, till exempel ojämn anslutning eller fel i källprocessen eller målprocessen.

Routning: Meddelandeköer kan också tillhandahålla routningsfunktioner, där flera processer kan läsa eller skriva meddelanden i samma kö, vilket möjliggör sändnings- eller unicast-paradigm.

Fördelar med meddelandeköer

Den främsta fördelen med en meddelandekö är att den ger lös koppling mellan olika entiteter i ett distribuerat program. Det möjliggör asynkron icke-blockerande kommunikation som ger en högre toleransnivå mot fel i processer.

Med meddelandeköer får du ett gränssnitt som gör det möjligt för program att kommunicera med varandra.

Bild 2: Med meddelandeköer får du ett gränssnitt som gör det möjligt för program att kommunicera med varandra.

  • Inga direktanslutningar mellan program: Meddelandeköer möjliggör program-till-program-kommunikation. Avsändare behöver inte nödvändigtvis känna till mottagarna av meddelanden och tvärtom. Det här möjliggör för logiken för routning av meddelanden (och potentiellt arbete) att beslutas av meddelandekösystemet.
  • Kommunikation mellan program kan vara oberoende av tid: Meddelandeköer buffrar normalt meddelanden mellan program så att de inte måste blockera eller avbryta körningen för att skicka eller ta emot meddelanden. De kan utföra annat arbete och bearbeta svaret när ett meddelande kommer in eller vid ett senare tillfälle. När du skriver ett meddelandeprogram behöver du inte veta (eller bekymra dig om) när ett program skickar ett meddelande, eller när målet kan ta emot ett meddelande. Meddelandet har inte gått förlorat, utan det behålls av köhanteraren tills målet är redo att bearbeta det. Meddelandet stannar kvar i kön tills det tas bort av ett program. Det betyder att skicka och ta emot program är fristående. Avsändaren kan fortsätta bearbeta utan att vänta på att mottagaren bekräftar mottagningen av meddelandet. Målprogrammet måste inte ens köras när meddelandet skickas. Den kan hämta meddelandet när den har startats.
  • Arbete kan utföras av små, självständiga program: Med meddelandeköer kan du använda fördelarna med små, självständiga program. Istället för ett enda, stort program som utföra alla delar av ett jobb sekventiellt kan du sprida jobbet på flera mindre, oberoende program. Det begärande programmet skickar meddelanden till vart och ett av de separata programmen och ber dem utföra sin funktion. När varje program har slutförts skickas resultatet tillbaka som ett eller flera meddelanden.
  • Kommunikation kan styras av händelser: Program kan styras enligt köernas status. Du kan till exempel se till att ett program startar så snart ett meddelande kommer in i kön. Eller så kan du ange att programmet inte startar förrän det, till exempel, finns 10 meddelanden över en viss prioritet i kön eller 10 meddelanden av valfri prioritet i kön.
  • Program kan tilldela en prioritet till ett meddelande: Ett program kan tilldela en prioritet till ett meddelande när det placerar meddelandet i en kö. Det här anger positionen i kön som det nya meddelandet läggs till på. Program kan hämta meddelanden från en kö i den ordning som meddelanden är i kön eller genom att hämta ett specifikt meddelande. (Ett program kan vilja hämta ett specifikt meddelande om det letar efter ett svara på en begäran som det har skickat tidigare.)
  • Stöd för återställning: Många meddelandeköer har funktioner för beständighet och loggning, vilket möjliggör återställning av status och meddelanden i kön vid fel.
  • Flera köer: Vissa system tillåter flera köer som kan definieras och konfigureras av programutvecklaren. Det här gör att meddelanden kan dirigeras till de nödvändiga entiteterna baserat på en utgivar- eller prenumerantrelation. Apache Kafka är ett exempel på detta.
  • Enkel skalbarhet: Meddelandeköer kan skalas horisontellt för att hantera en ökning i meddelandebelastningen, till skillnad från tätt sammankopplade system, där skalning och hantering av kommunikationstrafik och slutpunkter är svårare.

Testa dina kunskaper

1.

Vilket av följande är inte en fördel med meddelandeköer jämfört med traditionella meddelandefunktioner?