HareGo: When RabbitMQ meets Go (Svenska)

Publicerad

(Arsham Shirvani) (18 dec 2020)

Förord ​​

På Blokur använder vi RabbitMQ för asynkron kommunikation mellan mikrotjänster och att hantera jobb. AMQP -biblioteket är de facto-standarden för Go-applikationer, men det är mycket lågt vilket gör det svårt att skriva flexibel och testbar kod.

I Gos värld finns det en handfull bibliotek på hög nivå som underlättar kommunikationen med RabbitMQ. Tyvärr uppfyllde de inte alla våra användningsfall, eller de var mycket specifika vad de erbjuder vilket gjorde det väldigt svårt för oss att arbeta med. Så vi bestämde oss för att bygga vårt eget bibliotek.

Vi behövde något som vi snabbt kunde börja arbeta med för den viktigaste delen av våra dagliga jobb: lösa problem. Allt kring det är en utvecklingskostnad och passar inte in i vår modell.

Ange HareGo

Vi började fundera på att skapa våra egna bibliotek med följande egenskaper:

  1. Det borde stödja nästan alla aspekter av AMQP-biblioteket.
  2. Måste vara väl testat och lätt testbart.
  3. Måste vara lätt att använda och förlängas.
  4. Bör komma med förnuftiga standardvärden som bara fungerar.
  5. Måste vara samtidigt säker.
  6. Bra att ha förmågan att köa meddelanden på nytt (inte bara Nack) och kunna manipulera meddelandet innan du köar igen.

Vi är glada att kunna meddela att vi har öppet källkod för detta bibliotek. När vi skriver den här artikeln stöder vi Go-version 1.14 och senare.

API

HareGos gränssnitt är väldigt enkelt. Du måste skapa ett harego.Client -objekt med det praktiska harego. NewClient () -funktion. De enda kraven för NewClient () -funktionen är adressen till RabbitMQ-servern. Du kan konfigurera alla aspekter av klienten, och därmed den underliggande AMQP-klienten, genom att skicka harego.ConfigFunc konfigurationsfunktioner som tillhandahålls av biblioteket.

Som standard är en harego.Client skapar en arbetare som hanterar en publicering eller en konsumtionsbegäran åt gången. Klienten får ett slumpmässigt konsumentnamn. Standardbeteendet ställer in autoDelete och autoAck egenskaper för alla meddelanden som falska. Du kan dock ställa in dem på olika sätt om du vill.

Du kan skicka harego.Workers (3) konfigurationsfunktion för att ha 3 samtidiga arbetare. Detta gäller vid publicering och konsumtion av meddelanden. Biblioteket garanterar att leverera nästa tillgängliga meddelande till nästa tillgängliga arbetstagarplats.

Det är en bra idé att skicka ett harego.QueueName () konfigurera så att klienten vet vilken kö den ska interagera med. Standardkönamnet är “harego”.

Klienten är ett gränssnitt med följande specifikationer:

Publicera meddelanden

För att publicera meddelanden kan du skicka ett * amqp.Publicering objekt till Publicera -metoden. Meddelandet behandlas av nästa tillgängliga arbetare.

Konsumerar meddelanden

Konsumerar -metoden är ett blockerande samtal som skulle använda en hanterare varje gång ett nytt meddelande tas emot från mäklaren. Det slutar konsumera när sammanhanget avbryts eller klienten stängs.

En hanterare ska returnera två värden: AckType värde och en fördröjning. Fördröjningen anger hur länge den ska sova innan den svarar på mäklaren och AckType-värdet anger vad som ska hända med meddelandet.

AckType-värden

Ett beslut togs för att ställa in ”Multipel” -värdet för ack till falskt för att svara på endast ett meddelande vid flera arbetare. För att få arbetarsystemet att fungera måste vi ställa in prefetch-värdet till åtminstone antalet arbetare.

Det finns fyra värden för den här typen:

  1. AckTypeAck : svarar med msg.Ack.
  2. AckTypeNack : svarar med msg.Nack.
  3. AckTypeReject : svarar med msg.Reject.
  4. AckTypeRequeue : skickar meddelandet tillbaka till kön och svarar med msg.Ack. Se avsnittet Re-queue Messages för mer information.

Re-queue Messages

Med AMQP-biblioteket kan du Nack meddelanden och de kommer att levereras till nästa tillgängliga konsument. Ibland är det inte vad du förväntar dig och du behöver meddelandet för att gå tillbaka till slutet av kön och levereras igen. Med HareGo är det inte bara möjligt, men du kan också manipulera meddelandet innan du köar igen. Här är ett exempel på att köa upp till fem gånger.

Tips och tricks

Flera anslutningar

När du använder det här biblioteket skapar du flera harego.Client objekt att adressera olika aspekter av din logik. Anta att du läser från en kö och skriver till två köer, skapar tre objekt och ringer till de två utgivarna i konsumenten för den första:

Testbar kod

För att göra det enkelt att håna harego.Client , du kan skapa en funktionstyp som skulle returnera en ny klient och ett fel. Du kan använda ett mock-genererande bibliotek för att skapa en mock av harego.Client gränssnitt och använda det i dina tester.

I följande utdrag använder vi hån biblioteket för att generera mocks, och bibliotek för att hävda hånar. Naturligtvis kan du välja det bibliotek du är mest bekväm med.

Slutord

Mer information finns i bibliotekets arkiv . Om du behöver någon funktionsförfrågan eller har hittat ett problem med biblioteket, skapa ett problem i github-portalen.

Intresserad av att gå med i vår team? Gå till den här länken och ansök.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *