HareGo: When RabbitMQ meets Go (Dansk)

(Arsham Shirvani) (18. december 2020)

Forord

Hos Blokur bruger vi RabbitMQ til asynkron kommunikation mellem mikrotjenester og til at styre job. AMQP -biblioteket er de facto-standarden for Go-applikationer, men det er meget lavt, hvilket gør det svært at skrive fleksibel og testbar kode.

I Gos verden er der en håndfuld biblioteker på højt niveau, der letter kommunikation med RabbitMQ. Desværre opfyldte de ikke alle vores brugssager, eller de var meget specifikke for, hvad de tilbyder, hvilket gjorde det meget svært for os at arbejde med. Så vi besluttede at bygge vores eget bibliotek.

Vi havde brug for noget, som vi hurtigt kunne begynde at arbejde på for den vigtigste del af vores daglige job: løsning af problemer. Alt omkring det er udviklingsomkostninger og passer ikke ind i vores model.

Indtast HareGo

Vi begyndte at tænke på at skabe vores egne bibliotek med følgende egenskaber:

  1. Det skal understøtte næsten alle aspekter af AMQP-biblioteket.
  2. Skal være velprøvet og let testbart.
  3. Skal være let at bruge og udvides.
  4. Skal komme med fornuftige standarder, der bare fungerer.
  5. Skal være samtidig sikker.
  6. Godt at have evnen at sætte meddelelser på ny i kø (ikke kun Nack) og være i stand til at manipulere meddelelsen, før de køer igen.

Vi er glade for at kunne meddele, at vi har open-source dette bibliotek. På tidspunktet for skrivningen af ​​denne artikel understøtter vi Go-version 1.14 og derover.

API

HareGos interface er meget enkel. Du skal oprette et harego.Client objekt med det praktiske harego. NewClient () -funktion. De eneste krav til NewClient () -funktionen er adressen på RabbitMQ-serveren. Du kan konfigurere alle aspekter af klienten og dermed den underliggende AMQP-klient ved at sende harego.ConfigFunc konfigurationsfunktioner leveret af biblioteket.

Som standard er en harego.Client opretter en medarbejder, der håndterer en udgivelse eller en forbrugsanmodning ad gangen. Kunden får et tilfældigt forbrugernavn. Standardadfærden indstiller autoDelete og autoAck egenskaber for alle meddelelser som falske. Du kan dog indstille dem forskelligt, hvis du ønsker det.

Du kan videregive harego.Workers (3) konfigurationsfunktion for at have 3 samtidige arbejdere. Dette gælder for udgivelse og forbrug af meddelelser. Biblioteket garanterer at levere den næste tilgængelige besked til den næste ledige medarbejderplads.

Det er en god ide at videregive en harego.QueueName () config for at lade klienten vide, hvilken kø den skal interagere med. Standardkønavnet er “harego”.

Klienten er en grænseflade med følgende specifikationer:

Udgivelsesmeddelelser

For at udgive meddelelser kan du sende en * amqp.Publicering objekt til Udgiv -metoden. Meddelelsen behandles af den næste tilgængelige medarbejder.

Forbrugende meddelelser

Forbruger -metoden er et blokerende opkald, der bruger en handler hver gang der modtages en ny besked fra mægleren. Det stopper med at forbruge, når konteksten annulleres, eller klienten lukkes.

En handler skal returnere to værdier: AckType værdi og en forsinkelse. Forsinkelsen angiver, hvor længe den skal sove, før den reagerer på mægleren, og AckType-værdien angiver, hvad der skal ske med meddelelsen.

AckType-værdier

Der blev truffet en beslutning om at indstille “Multiple” værdi af ack til false for kun at svare på en besked i tilfælde af flere medarbejdere. For at få arbejdersystemet til at fungere, skal vi indstille forhentningsværdien til mindst antallet af arbejdere.

Der er fire værdier for denne type:

  1. AckTypeAck : svarer med msg.Ack.
  2. AckTypeNack : svarer med msg.Nack.
  3. AckTypeReject : svarer med msg.Reject.
  4. AckTypeRequeue : sender beskeden tilbage til køen og svarer med msg.Ack. Se sektionen Genkø meddelelser for mere information.

Genkø meddelelser

Med AMQP-biblioteket kan du Nack meddelelser, og de vil blive leveret til den næste tilgængelige forbruger. Nogle gange er dette ikke, hvad du forventer, og du har brug for beskeden for at gå tilbage til slutningen af ​​køen og blive leveret igen. Med HareGo er det ikke kun muligt, men du kan også manipulere beskeden, før du køer igen. Her er et eksempel på re-kø op til 5 gange.

Tip og tricks

Flere forbindelser

Når du bruger dette bibliotek, skal du oprette flere harego.Client objekter, der skal adresseres forskellige aspekter af din logik. Sig, at du læser fra en kø, og skriver til to køer, opretter tre objekter og kalder de to udgivere inde i forbrugeren af ​​den første:

Testbar kode

For at gøre det let at spotte harego.Client , du kan oprette en funktionstype, der returnerer en ny klient og en fejl. Du kan bruge et mock-genererende bibliotek til at oprette en mock ud af harego.Client -grænsefladen og bruge den i dine tests.

I det følgende uddrag bruger vi mockery -biblioteket til at generere mocks, og vidner bibliotek til påstand om mocks. Selvfølgelig kan du vælge det bibliotek, du er mest fortrolig med.

Afsluttende ord

For mere information, besøg bibliotekets lager . Hvis du har brug for en funktionsanmodning eller har fundet et problem med biblioteket, skal du oprette et problem i github-portalen.

Interesseret i at deltage i vores hold? Gå til dette link og anvend.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *