HareGo: When RabbitMQ meets Go (Norsk)

(Arsham Shirvani) (18. des. 2020)

Forord

På Blokur bruker vi RabbitMQ for asynkron kommunikasjon mellom mikrotjenester og for å administrere jobber. AMQP -biblioteket er de facto-standarden for Go-applikasjoner, men det er veldig lavt, noe som gjør det vanskelig å skrive fleksibel og testbar kode.

I Gos verden er det en håndfull biblioteker på høyt nivå som letter kommunikasjon med RabbitMQ. Dessverre tilfredsstilte de ikke alle brukssakene våre, eller de var veldig spesifikke for hva de tilbyr, noe som gjorde det veldig vanskelig for oss å jobbe med. Så vi bestemte oss for å bygge vårt eget bibliotek.

Vi trengte noe som vi raskt kunne begynne å jobbe med for den viktigste delen av våre daglige jobber: å løse problemer. Alt rundt det er en utviklingskostnad og passer ikke inn i vår modell.

Skriv inn HareGo

Vi begynte å tenke på å lage våre egne bibliotek med følgende egenskaper:

  1. Det skal støtte nesten alle aspekter av AMQP-biblioteket.
  2. Må være godt testet og lett testbart.
  3. Må være enkel å bruke og utvides.
  4. Skal komme med fornuftige standarder som bare fungerer.
  5. Må være samtidig trygt.
  6. Godt å ha evnen å stille meldinger på nytt i kø (ikke bare Nack) og kunne manipulere meldingen før du køer på nytt.

Vi er glade for å kunngjøre at vi har åpent for dette biblioteket. Når vi skriver denne artikkelen, støtter vi Go-versjon 1.14 og over.

API

HareGos grensesnitt er veldig enkelt. Du må opprette et harego.Client objekt med det praktiske harego. NewClient () -funksjon. De eneste kravene til NewClient () -funksjonen er adressen til RabbitMQ-serveren. Du kan konfigurere alle aspekter av klienten, og følgelig den underliggende AMQP-klienten, ved å sende harego.ConfigFunc konfigurasjonsfunksjoner levert av biblioteket.

Som standard er en harego.Client oppretter en arbeider som håndterer en publisering eller en forbruksforespørsel om gangen. Kunden får et tilfeldig forbrukernavn. Standard oppførsel angir autoDelete og autoAck egenskaper for alle meldinger som falske. Du kan imidlertid sette dem opp annerledes hvis du ønsker det.

Du kan sende harego.Workers (3) konfigurasjonsfunksjon for å ha 3 samtidige arbeidere. Dette gjelder for publisering og forbruk av meldinger. Biblioteket garanterer å levere neste tilgjengelige melding til neste tilgjengelige arbeidstakerspor.

Det er en god ide å sende en harego.QueueName () config for å la klienten få vite hvilken kø den skal samhandle med. Standard kønavn er “harego”.

Klienten er et grensesnitt med følgende spesifikasjoner:

Publiseringsmeldinger

For å publisere meldinger kan du sende en * amqp.Publisering objekt til Publiser -metoden. Meldingen blir behandlet av neste tilgjengelige arbeider.

Forbruker meldinger

Forbruker -metoden er et blokkeringsanrop som vil bruke en behandler hver gang en ny melding mottas fra megleren. Det vil slutte å konsumere når konteksten avbrytes eller klienten lukkes.

En handler skal returnere to verdier: AckType verdi og en forsinkelse. Forsinkelsen angir hvor lenge den skal sove før den reagerer på megleren, og AckType-verdien spesifiserer hva som skal skje med meldingen.

AckType-verdier

Det ble tatt en beslutning om å stille inn “Multiple” verdi av ack til false for å svare på bare én melding i tilfelle flere arbeidere. For å få arbeidersystemet til å fungere, må vi sette forhåndshentingsverdien til minst antall arbeidstakere.

Det er fire verdier for denne typen:

  1. AckTypeAck : svarer med msg.Ack.
  2. AckTypeNack : svarer med msg.Nack.
  3. AckTypeReject : svarer med msg.Reject.
  4. AckTypeRequeue : sender meldingen tilbake til køen, og svarer med msg.Ack. Se Meldinger-delen på nytt for mer informasjon.

Meldinger på nytt kø

Med AMQP-biblioteket kan du Nack meldinger, og de vil bli levert til neste tilgjengelige forbruker. Noen ganger er dette ikke det du forventer, og du trenger meldingen for å gå tilbake til slutten av køen og bli levert igjen. Med HareGo er det ikke bare mulig, men du kan også manipulere meldingen før du stiller i kø igjen. Her er et eksempel på re-kø opptil fem ganger.

Tips og triks

Flere tilkoblinger

Når du bruker dette biblioteket, må du opprette flere harego.Client objekter som skal adresseres forskjellige aspekter av logikken din. Si at du leser fra en kø, og skriver til to køer, oppretter tre objekter og ringer til de to forleggerne i forbrukeren til den første:

Testbar kode

For å gjøre det enkelt å spotte harego.Client , kan du opprette en funksjonstype som returnerer en ny klient og en feil. Du kan bruke et mock-genererende bibliotek til å lage en mock ut av harego.Client grensesnitt og bruke det i testene dine.

I det følgende utdraget bruker vi spott -biblioteket for å generere spottene, og bibliotek for å hevde narr. Selvfølgelig kan du velge biblioteket du er mest komfortabel med.

Avsluttende ord

For mer informasjon, besøk bibliotekets repository . Hvis du trenger en funksjonsforespørsel eller har funnet et problem med biblioteket, kan du opprette et problem i github-portalen.

Interessert i å bli med på team? Gå til denne lenken og bruk.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *