HareGo: Quand RabbitMQ rencontre Go

(Arsham Shirvani) (18 décembre 2020)

Préface

Chez Blokur, nous utilisons RabbitMQ pour asynchrone les communications entre les micro-services et la gestion des emplois. La bibliothèque AMQP est le standard de facto pour les applications Go, mais son niveau est très bas, ce qui rend difficile lécriture de code flexible et testable.

Dans le monde de Go, il existe une poignée de bibliothèques de haut niveau qui facilitent les communications avec RabbitMQ. Malheureusement, ils nont pas satisfait tous nos cas dutilisation, ou ils étaient très précis sur ce quils offrent, ce qui nous a rendu très difficile de travailler. Nous avons donc décidé de créer notre propre bibliothèque.

Nous avions besoin de quelque chose sur lequel nous pourrions rapidement commencer à travailler pour la partie la plus importante de notre travail quotidien: résoudre des problèmes. Tout ce qui se trouve autour de cela représente un coût de développement et ne rentre pas dans notre modèle.

Entrez HareGo

Nous avons commencé à penser à créer le nôtre bibliothèque avec les caractéristiques suivantes:

  1. Elle devrait prendre en charge presque tous les aspects de la bibliothèque AMQP.
  2. Doit être bien testée et facilement testable.
  3. Doit être facile à utiliser et extensible.
  4. Doit être livré avec des valeurs par défaut saines qui fonctionnent.
  5. Doit être simultané sûr.
  6. Cest bien davoir la capacité pour remettre les messages en file dattente (pas seulement Nack) et être en mesure de manipuler le message avant de le remettre en file dattente.

Nous sommes heureux dannoncer que nous avons ouvert cette bibliothèque. Au moment de la rédaction de cet article, nous prenons en charge la version Go 1.14 et supérieure.

API

Linterface de HareGo est très simple. Vous devez créer un objet harego.Client avec le harego pratique. Fonction NewClient () . La seule exigence de la fonction NewClient () est ladresse du serveur RabbitMQ. Vous pouvez configurer tous les aspects du client, et par conséquent le client AMQP sous-jacent, en passant harego.ConfigFunc fonctions de configuration fournies par la bibliothèque.

Par défaut, un harego.Client crée un collaborateur, qui gère une demande de publication ou de consommation à la fois. Le client obtient un nom de consommateur aléatoire. Le comportement par défaut définit l autoDelete et autoAck propriétés de tous les messages comme fausses. Vous pouvez cependant les configurer différemment si vous le souhaitez.

Vous pouvez passer le harego.Workers (3) fonction de configuration pour avoir 3 travailleurs simultanés. Cela sapplique à la publication et à la consommation de messages. La bibliothèque garantit de livrer le prochain message disponible au prochain emplacement de travail disponible.

Cest une bonne idée de transmettre un harego.QueueName () config pour indiquer au client avec quelle file dattente il doit interagir. Le nom de la file dattente par défaut est «harego».

Le client est une interface avec les spécifications suivantes:

Publication de messages

Pour publier des messages, vous pouvez transmettre un * amqp.Publishing à la méthode Publish . Le message sera traité par le prochain collaborateur disponible.

Consommation de messages

Les Consomment est un appel bloquant qui utiliserait un gestionnaire à chaque fois quun nouveau message est reçu du courtier. Il cessera de consommer lorsque le contexte est annulé ou que le client est fermé.

Un gestionnaire doit renvoyer deux valeurs: le AckType valeur et un délai. Le délai spécifie la durée pendant laquelle il doit dormir avant de répondre au courtier, et la valeur AckType spécifie ce qui doit arriver au message.

Valeurs AckType

Il a été décidé de définir le «Multiple» de lack sur false pour ne répondre quà un seul message en cas de travail multiple. Pour que le système de travail fonctionne, nous devons définir la valeur de prélecture sur au moins le nombre de nœuds de calcul.

Il existe quatre valeurs pour ce type:

  1. AckTypeAck : répond par msg.Ack.
  2. AckTypeNack : répond avec msg.Nack.
  3. AckTypeReject : répond par msg.Reject.
  4. AckTypeRequeue : renvoie le message dans la file dattente et répond par msg.Ack. Reportez-vous à la section Messages de remise en file dattente pour plus dinformations.

Remettre les messages en file dattente

Avec la bibliothèque AMQP, vous pouvez Nack messages et ils seront livrés au prochain consommateur disponible. Parfois, ce nest pas ce à quoi vous vous attendez et vous avez besoin que le message revienne à la fin de la file dattente et soit remis à nouveau. Avec HareGo, non seulement cest possible, mais vous pouvez également manipuler le message avant de le remettre en file dattente. Voici un exemple de remise en file dattente jusquà 5 fois.

Trucs et astuces

Connexions multiples

Lorsque vous utilisez cette bibliothèque, créez plusieurs objets harego.Client à adresser différents aspects de votre logique. Supposons que vous lisiez dans une file dattente et que vous écriviez dans deux files dattente, créez trois objets et appelez les deux éditeurs à lintérieur du consommateur du premier:

Code testable

Afin de faciliter la simulation du harego.Client , vous pouvez créer un type de fonction qui renverrait un nouveau client et une erreur. Vous pouvez utiliser une bibliothèque de génération fictive pour créer une maquette à partir de linterface harego.Client et lutiliser dans vos tests.

Dans lextrait suivant, nous utilisons la bibliothèque mockery pour générer les simulacres, et témoignent bibliothèque pour affirmer des simulations. Bien sûr, vous pouvez choisir la bibliothèque avec laquelle vous êtes le plus à laise.

Derniers mots

Pour plus dinformations, veuillez visiter le référentiel de la bibliothèque. Si vous avez besoin dune demande de fonctionnalité ou avez rencontré un problème avec la bibliothèque, veuillez créer un problème sur le portail github.

Vous souhaitez rejoindre notre équipe? Veuillez vous rendre sur ce lien et postuler.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *