HareGo: Când RabbitMQ întâlnește Go

(Arsham Shirvani) (18 dec. 2020)

Prefață

La Blokur, folosim RabbitMQ pentru asincron comunicații între micro-servicii și pentru gestionarea locurilor de muncă. Biblioteca AMQP este standardul de facto pentru aplicațiile Go, cu toate acestea este un nivel foarte scăzut, ceea ce face dificilă scrierea unui cod flexibil și testabil.

În lumea Go, există o mână de biblioteci de nivel înalt care facilitează comunicarea cu RabbitMQ. Din păcate, nu au satisfăcut toate cazurile noastre de utilizare sau au fost foarte specifici cu privire la ceea ce oferă, ceea ce ne-a făcut foarte greu să lucrăm. Așa că am decis să ne construim propria bibliotecă.

Aveam nevoie de ceva la care să putem începe rapid să lucrăm pentru cea mai importantă parte a slujbelor noastre zilnice: rezolvarea problemelor. Orice lucru din jur reprezintă un cost de dezvoltare și nu se încadrează în modelul nostru.

Introduceți HareGo

Am început să ne gândim la crearea a noastră bibliotecă cu următoarele caracteristici:

  1. Ar trebui să accepte aproape fiecare aspect al bibliotecii AMQP.
  2. Trebuie să fie bine testat și ușor de testat.
  3. Trebuie să fie ușor de utilizat și extensibil.
  4. Ar trebui să vină cu valori implicite sănătoase care funcționează.
  5. Trebuie să fie în siguranță simultană.
  6. Este bine să aveți abilitatea pentru a pune din nou la coadă mesajele (nu numai pentru Nack) și pentru a putea manipula mesajul înainte de a face din nou coada. La momentul redactării acestui articol, acceptăm versiunea Go 1.14 și mai sus.

    API

    Interfața HareGo este foarte simplă. Trebuie să creați un harego.Client obiect cu harego la îndemână. NewClient () funcție. Singurele cerințe ale funcției NewClient () este adresa serverului RabbitMQ. Puteți configura fiecare aspect al clientului și, în consecință, clientul AMQP subiacent, trecând harego.ConfigFunc funcții de configurare furnizate de bibliotecă.

    În mod implicit, un harego.Client creează un singur lucrător, care gestionează o cerere de publicare sau de consumare la un moment dat. Clientul primește un nume aleatoriu de consumator. Comportamentul implicit setează autoDelete și autoAck proprietățile tuturor mesajelor sunt false. Cu toate acestea, le puteți configura diferit, dacă doriți.

    Puteți trece harego.Workers (3) pentru a avea 3 lucrători concurenți. Acest lucru se aplică publicării și consumării mesajelor. Biblioteca garantează livrarea următorului mesaj disponibil în următorul spațiu disponibil pentru lucrători.

    Este o idee bună să treceți un harego.QueueName () config pentru a anunța clientul cu ce coadă ar trebui să interacționeze. Numele de coadă implicit este „harego”.

    Clientul este o interfață cu următoarele specificații:

    Publicarea mesajelor

    Pentru a publica mesaje, puteți trece un * amqp.Publishing obiectează la metoda Publish . Mesajul va fi procesat de următorul lucrător disponibil.

    Consuming Messages

    Consum este un apel de blocare care ar folosi un handler de fiecare dată când este primit un nou mesaj de la broker. Va înceta să consume atunci când contextul este anulat sau clientul este închis.

    Un handler ar trebui să returneze două valori: AckType valoare și o întârziere. Întârzierea specifică durata pe care ar trebui să o adoarmă înainte de a răspunde brokerului, iar valoarea AckType specifică ce ar trebui să se întâmple cu mesajul. Valoarea „multiplă” a ack la fals pentru a răspunde la un singur mesaj în cazul mai multor lucrători. Pentru ca sistemul de lucru să funcționeze, trebuie să setăm valoarea de preluare la cel puțin cantitatea de lucrători.

    Există patru valori pentru acest tip:

    1. AckTypeAck : răspunde cu msg.Ack.
    2. AckTypeNack : răspunde cu msg.Nack.
    3. AckTypeReject : răspunde cu msg.Reject.
    4. AckTypeRequeue : trimite mesajul înapoi la coadă și răspunde cu msg.Ack. Consultați secțiunea Re-coadă Mesaje pentru mai multe informații.

    Re-coadă Mesaje

    Cu biblioteca AMQP puteți Nack mesaje și vor fi livrate următorului consumator disponibil. Uneori acest lucru nu vă așteptați și aveți nevoie ca mesajul să revină la sfârșitul cozii și să fie livrat din nou. Cu HareGo nu numai că este posibil, dar puteți manipula mesajul și înainte de a face din nou coada. Iată un exemplu de re-așteptare de până la 5 ori.

    Sfaturi și trucuri

    Conexiuni multiple

    Când utilizați această bibliotecă, creați mai multe obiecte harego.Client diferite aspecte ale logicii tale. Spuneți că citiți dintr-o coadă și scrieți în două cozi, creați trei obiecte și chemați cei doi editori din consumatorul primului:

    Cod testabil

    Pentru a face mai ușor de batjocorit harego.Client , puteți crea un tip de funcție care ar returna un client nou și o eroare. Puteți utiliza o bibliotecă generatoare de simulări pentru a crea o simulare din harego.Client și utilizați-o în testele dvs.

    În următorul fragment utilizăm biblioteca batjocură pentru generarea de jocuri și bibliotecă pentru afirmarea batjocurilor. Desigur, puteți alege biblioteca cu care vă simțiți cel mai confortabil.

    Cuvinte finale

    Pentru mai multe informații, vă rugăm să vizitați depozitul al bibliotecii . Dacă aveți nevoie de orice cerere de caracteristică sau ați găsit o problemă cu biblioteca, creați o problemă în portalul github.

    Interesat să vă alăturați echipă? Accesați acest link și aplicați.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *