HareGo: When RabbitMQ meets Go (Italiano)

Pubblicato il

(Arsham Shirvani) (18 dicembre 2020)

Prefazione

In Blokur, utilizziamo RabbitMQ per asincrono comunicazioni tra microservizi e per la gestione dei lavori. La libreria AMQP è lo standard de facto per le applicazioni Go, tuttavia è di livello molto basso, il che rende difficile scrivere codice flessibile e verificabile.

Nel mondo di Go, ci sono una manciata di biblioteche di alto livello che facilitano le comunicazioni con RabbitMQ. Sfortunatamente non hanno soddisfatto tutti i nostri casi duso o erano molto specifici su ciò che offrono, il che ha reso molto difficile per noi lavorare. Così abbiamo deciso di creare la nostra libreria.

Avevamo bisogno di qualcosa su cui iniziare a lavorare rapidamente per la parte più importante del nostro lavoro quotidiano: risolvere i problemi. Tutto ciò è un costo di sviluppo e non rientra nel nostro modello.

Entra in HareGo

Abbiamo iniziato a pensare di creare nostro libreria con le seguenti caratteristiche:

  1. Dovrebbe supportare quasi ogni aspetto della libreria AMQP.
  2. Deve essere ben testata e facilmente verificabile.
  3. Deve essere facile da usare ed estendibile.
  4. Deve essere fornito con impostazioni predefinite sane che funzionano.
  5. Deve essere simultaneamente sicuro.
  6. Buono per avere la capacità per rimettere in coda i messaggi (non solo Nack) ed essere in grado di manipolare il messaggio prima di rimetterlo in coda.

Siamo lieti di annunciare che abbiamo reso open source questa libreria. Al momento della stesura di questo articolo, supportiamo la versione Go 1.14 e successive.

API

Linterfaccia di HareGo è molto semplice. Devi creare un harego.Client con il pratico harego. Funzione NewClient () . Gli unici requisiti della funzione NewClient () sono lindirizzo del server RabbitMQ. Puoi configurare ogni aspetto del client, e di conseguenza il client AMQP sottostante, passando harego.ConfigFunc funzioni di configurazione fornite dalla libreria.

Per impostazione predefinita, un harego.Client crea un worker, che gestisce una richiesta di pubblicazione o consumo alla volta. Il client ottiene un nome utente casuale. Il comportamento predefinito imposta autoDelete e autoAck proprietà di tutti i messaggi come false. Tuttavia, se lo desideri, puoi impostarli in modo diverso.

Puoi passare il harego.Workers (3) funzione di configurazione per avere 3 worker simultanei. Questo vale per la pubblicazione e il consumo di messaggi. La libreria garantisce di consegnare il prossimo messaggio disponibile al successivo worker slot disponibile.

È una buona idea passare un harego.QueueName () config per far sapere al client con quale coda deve interagire. Il nome della coda predefinito è “harego”.

Il client è uninterfaccia con le seguenti specifiche:

Pubblicazione di messaggi

Per pubblicare messaggi, puoi passare un * amqp.Publishing oggetto nel metodo Pubblica . Il messaggio verrà elaborato dal successivo worker disponibile.

Consuming Messages

Consume è una chiamata di blocco che utilizzerebbe un gestore ogni volta che viene ricevuto un nuovo messaggio dal broker. Smetterà di consumarsi quando il contesto viene annullato o il client viene chiuso.

Un gestore dovrebbe restituire due valori: AckType valore e un ritardo. Il ritardo specifica la durata della sospensione prima che risponda al broker e il valore AckType specifica cosa dovrebbe accadere al messaggio.

Valori AckType

È stata presa la decisione di impostare il Valore “multiplo” di ack to false per rispondere a un solo messaggio in caso di più worker. Per far funzionare il sistema worker, dobbiamo impostare il valore di prefetch almeno sulla quantità di worker.

Ci sono quattro valori per questo tipo:

  1. AckTypeAck : risponde con msg.Ack.
  2. AckTypeNack : risponde con msg.Nack.
  3. AckTypeReject : risponde con msg.Reject.
  4. AckTypeRequeue : invia il messaggio di nuovo alla coda e risponde con msg.Ack. Per ulteriori informazioni, consulta la sezione Re-queue Messages.

Re-queue Messages

Con la libreria AMQP puoi Nack messaggi e verranno consegnati al successivo consumatore disponibile. A volte questo non è quello che ti aspetti e hai bisogno che il messaggio torni alla fine della coda e venga consegnato di nuovo. Con HareGo non solo è possibile, ma puoi anche manipolare il messaggio prima di rimetterlo in coda. Di seguito è riportato un esempio di messa in coda fino a 5 volte.

Suggerimenti e trucchi

Connessioni multiple

Quando si utilizza questa libreria, creare più oggetti harego.Client da indirizzare diversi aspetti della tua logica. Supponiamo che tu stia leggendo da una coda e scrivendo su due code, crea tre oggetti e chiama i due editori allinterno del consumer del primo:

Codice verificabile

Per semplificare la simulazione di harego.Client , puoi creare un tipo di funzione che restituirebbe un nuovo client e un errore. Puoi utilizzare una libreria di generazione fittizia per creare una simulazione dallinterfaccia harego.Client e utilizzarla nei tuoi test.

Nel seguente frammento utilizziamo la libreria mockery per generare i mock e testimonia libreria per affermare derisioni. Ovviamente puoi scegliere la libreria con la quale ti senti più a tuo agio.

Final Words

Per ulteriori informazioni, visita il repository della libreria. Se hai bisogno di una richiesta di funzionalità o hai riscontrato un problema con la libreria, crea un problema nel portale GitHub.

Interessato a partecipare al nostro squadra? Vai a questo link e fai domanda.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *