Idag ska vi undersöka hur man kan optimera laddningstiden för webbsidor genom att hantera de mest resurskrävande processerna asynkront. Detta underlättas avsevärt med hjälp av RabbitMQ.
Stabiliteten och hastigheten hos en applikation eller webbplats är utan tvekan avgörande för användarupplevelsen. Vem har inte någon gång lämnat en webbsida innan den ens laddats klart på grund av långsamhet?
Vad är RabbitMQ?
RabbitMQ är en öppen källkod, en distribuerad och skalbar meddelandekö som fungerar som en mellanhand för effektiv kommunikation mellan producenter och konsumenter av data.
RabbitMQ implementerar AMQP (Advanced Message Queuing Protocol), ett applikationslagerprotokoll. AMQP fokuserar på asynkron meddelandehantering med garanterad leverans genom bekräftelser på mottagandet av meddelanden, både från mäklaren till producenten och från konsumenterna tillbaka till producenten.
Hur fungerar RabbitMQ?
Enkelt uttryckt skapar RabbitMQ köer där meddelanden från producenter lagras. Dessa meddelanden väntar tills de tas emot och bearbetas av de applikationer som konsumerar dem. Detta möjliggör utformning och implementering av distribuerade system, där ett system delas upp i oberoende moduler som kommunicerar via meddelanden.
Liksom all kommunikation krävs en producent, ett meddelande och en mottagare. Centralt i detta system finns RabbitMQ, som fungerar som en plats där meddelanden väntar på att mottas.
Låt oss förstå dess funktionalitet bättre genom att utforska de olika typerna av utbyten som används för att överföra meddelanden.
Utbytestyper
När vi skickar ett meddelande via RabbitMQ, går det inte direkt till en kö. Istället skickas det till en växel (exchange) som har i uppgift att dirigera meddelanden till olika köer, vilket möjliggör för olika system att ta emot och hantera dem.
Bildkälla: CloudAQMP
De vanligaste utbytestyperna är Direct, Fanout, Topic och Headers.
Direktutbyte
Föreställ dig en situation där en producent behöver skicka en köpbekräftelse till tre olika konsumenter, dvs. systemet måste interagera med tre separata system för att genomföra köpet.
Eftersom RabbitMQ skickar meddelandet individuellt till varje kö, kan dessa andra system snabbt ta emot meddelandet.
Normalt skickar växeln meddelandet till alla köer, men ofta vill vi inte att alla meddelanden ska nå alla köer. Det är här olika villkor kan tillämpas för att anpassa utbytets funktion.
Detta gör att vi kan se till att ett meddelande bara når en specifik konsument, snarare än att distribueras till alla.
Bindningsnyckel: För att koppla en kö till en växel, skapar vi en bindning. Denna bindning är relationen mellan en kö och en växel, ungefär som en anslutning.
Routingnyckel: I denna bindning kan vi även definiera en routingnyckel. Det är en nyckel som styr hur meddelanden ska dirigeras till en specifik kö.
Med till exempel routingnycklar X, Y och Z, kommer ett meddelande med routingnyckel Y att dirigeras via kö Y och levereras direkt till den konsument som är konfigurerad att ta emot det.
Detta möjliggör flera köer kopplade till en och samma växel, samtidigt som varje kö kan ha unika relationer till växeln via routingnycklarna.
Fanout-utbyte
När ett meddelande skickas till en fanout-växel, vidarebefordras det till alla köer som är anslutna till den. Om du till exempel har tio köer anslutna till en fanout-växel, kommer samtliga dessa köer att ta emot det inkommande meddelandet.
Topic-utbyte
Detta är ett av de mest flexibla utbytena och ger möjlighet att skicka meddelanden baserat på ämnen. Genom att definiera routingnycklarna på ett visst sätt, kan du skapa mönster och regler för hur olika system interagerar.
Exempelvis kan en routingnyckel definieras som (x.*), (*.z) eller (*.y.*).
Vad är AMQP i RabbitMQ?
AMQP (Advanced Message Queuing Protocol) är ett öppet standardprotokoll som används för att definiera hur meddelanden transporteras mellan applikationer. AMQP liknar protokoll som HTTP och TCP, då det också är ett protokoll på trådnivå, men skiljer sig genom att det möjliggör asynkron överföring av data.
RabbitMQ valde att implementera AMQP av flera anledningar. För det första är AMQP en etablerad standard för mellanprogram, till skillnad från JMS som definierar ett API.
AMQP-specifikationen skapades av ett internationellt konsortium som omfattar stora företag som Red Hat, Cisco Systems och Microsoft. Den andra fördelen är AMQP:s interoperabilitet, vilket innebär att alla applikationer som implementerar AMQP kan kommunicera med en AMQP-mäklare.
AMQP är inte det enda protokollet som används av RabbitMQ. Nedanstående bild visar en översikt över alla protokoll, språk och API:er som implementeras och/eller stöds av RabbitMQ.
De främsta funktionerna i RabbitMQ
Utöver att möjliggöra integrering av olika applikationer genom asynkron meddelandehantering, erbjuder RabbitMQ även andra funktioner som har bidragit till dess popularitet som meddelandekö:
Tillförlitlig lagring
RabbitMQ har flera inbyggda funktioner som säkerställer att meddelanden levereras tillförlitligt. Om inga konsumenter är tillgängliga, lagras meddelandet. Konsumenter kan bekräfta mottagandet för att bekräfta att meddelandet har bearbetats framgångsrikt.
Om bearbetningen misslyckas kan RabbitMQ skicka tillbaka meddelandet till kön, så att det kan bearbetas antingen av en annan instans av konsumenten eller av samma konsument igen.
RabbitMQ garanterar även leveransordningen för meddelandena, dvs. de konsumeras i den ordning som de anlände till RabbitMQ-köerna.
Klusterhantering
RabbitMQ levererar hög prestanda och kan hantera tusentals meddelanden per sekund, men det kan finnas situationer där ännu högre kapacitet krävs.
För att hantera det, kan RabbitMQ skapa kluster för att skala lösningen horisontellt, en process som är transparent för både producenter och konsumenter.
Hög tillgänglighet
I RabbitMQ kan köer replikeras över flera noder i ett kluster. Detta säkerställer att om en nod skulle krascha eller drabbas av ett driftstopp, kan mäklaren fortsätta att ta emot meddelanden från producenter och leverera dem till avsedda konsumenter.
Flexibel routing
RabbitMQ erbjuder flexibla regler för att dirigera meddelanden mellan växlar och köer, även baserat på specifika mönster, via bindningar.
Stöd för flera protokoll
Förutom AMQP, stöder RabbitMQ även STOMP, MQTT och HTTP via plugins. Det finns även mekanismer för autentisering och åtkomstkontroll för varje komponent i meddelandekön.
Verkliga exempel på användning av RabbitMQ
RabbitMQ används främst för att möjliggöra asynkron kommunikation mellan applikationer, minska beroendet mellan applikationer, distribuera notifieringar och hantera bakgrundsjobb.
I praktiken används RabbitMQ ofta inom e-handel, där den används för att manipulera, bearbeta och vidarebefordra beställningar till andra system, som distribution och fakturahantering.
Vid beställningshantering kan ett säljmeddelande skickas till både distributionscentralen och faktureringen. Detta sker horisontellt och asynkront via meddelanden, men det är också möjligt att skicka ett meddelande till flera köer.
Med ett konkret exempel, när en kund genomför ett köp, kan produkten förberedas för distribution, transport och fakturering.
Eftersom dessa processer ofta hanteras av olika system, är målet med RabbitMQ att säkerställa att alla relevanta system får de nödvändiga meddelandena.
Alternativ till RabbitMQ:
RabbitMQ är mer lättanvänt än man kanske tror, och det finns flera alternativ som kan vara värda att undersöka:
#1. IronMQ
IronMQ är en mycket snabb meddelandekö. Den är robust, hållbar och framtagen för att ge en engångsleverans av meddelanden. IronMQ är en stark molnbaserad lösning för modern applikationsarkitektur.
Den stöder push-köer, pull-köer och ”long polling” vilket innebär att ”polling”-förfrågningar hålls öppna under längre tid. IronMQ använder flera datacenter för hög tillgänglighet och skalbarhet.
Det går att distribuera i molnet, på delad eller dedikerad hårdvara, eller lokalt. Den har också en uppsättning klientbibliotek med lättillgänglig dokumentation.
#2. Apache Kafka
Kafka är en plattform för distribuerad strömning av händelser. Kärnan i Kafka är en replikerad, distribuerad och beständig logg.
Kafka används främst för händelsedrivna mikrotjänster och storskaliga applikationer för strömhantering. Den replikerar händelser asynkront inom ett kluster för feltolerans och hög tillgänglighet.
#3. Apache ActiveMQ
ActiveMQ är en Java-baserad meddelandekö som stöder flera protokoll. Det möjliggör integrering av applikationer med AMQP på applikationslagret.
ActiveMQ stöder flera protokoll för integrering, som JMS (native Java) och Stomp (som kan användas av PHP-applikationer), bland andra.
Amazon erbjuder även en ”hanterad” version av ActiveMQ som heter Amazon MQ, som förenklar användningen av tjänsten.
Sammanfattning
Meddelandeköer har traditionellt varit en viktig del av många organisationers infrastruktur. Med det ökande antalet användare som får tillgång till företagssystem genom olika kanaler, blir produkter som tillåter horisontell skalning till en låg kostnad allt viktigare. Det är avgörande att kunna hantera stora mängder meddelanden per sekund.
Det är här en ny generation meddelandeköer som RabbitMQ blir allt mer relevanta i moderna applikationer. Dessa verktyg strävar efter att erbjuda hög tillgänglighet, tillförlitlighet, interoperabilitet och prestanda till våra kunder.
Du kan även utforska pålitliga plattformar för RabbitMQ-hosting för din applikation.