HareGo: cuando RabbitMQ se encuentra con Go

Publicado el

(Arsham Shirvani) (18 de diciembre de 2020)

Prefacio

En Blokur, utilizamos RabbitMQ para aplicaciones asincrónicas comunicaciones entre microservicios y para gestionar puestos de trabajo. La biblioteca AMQP es el estándar de facto para las aplicaciones Go; sin embargo, su nivel es muy bajo, lo que dificulta la escritura de código flexible y comprobable.

En el mundo de Go, hay un puñado de bibliotecas de alto nivel que facilitan las comunicaciones con RabbitMQ. Desafortunadamente, no cumplieron con todos nuestros casos de uso, o fueron muy específicos en lo que ofrecen, lo que hizo que fuera muy difícil trabajar con ellos. Así que decidimos construir nuestra propia biblioteca.

Necesitábamos algo en lo que pudiéramos empezar a trabajar rápidamente para la parte más importante de nuestro trabajo diario: resolver problemas. Cualquier cosa relacionada con eso es un costo de desarrollo y no encaja en nuestro modelo.

Ingrese a HareGo

Comenzamos a pensar en crear nuestro propio biblioteca con las siguientes características:

  1. Debe ser compatible con casi todos los aspectos de la biblioteca AMQP.
  2. Debe estar bien probado y fácilmente comprobable.
  3. Debe ser fácil de usar y ampliable.
  4. Debe venir con valores predeterminados sensatos que simplemente funcionen.
  5. Debe ser seguro al mismo tiempo.
  6. Es bueno tener la capacidad para volver a poner en cola los mensajes (no solo Nack) y poder manipular el mensaje antes de volver a ponerlo en cola.

Nos complace anunciar que hemos abierto esta biblioteca. En el momento de escribir este artículo, admitimos la versión de Go 1.14 y superiores.

API

La interfaz de HareGo es muy simple. Debe crear un objeto harego.Client con el práctico harego. Función NewClient () . Los únicos requisitos de la función NewClient () es la dirección del servidor RabbitMQ. Puede configurar todos los aspectos del cliente y, en consecuencia, el cliente AMQP subyacente, pasando harego.ConfigFunc funciones de configuración provistas por la biblioteca.

Por defecto, un harego.Client crea un trabajador, que maneja una publicación o una solicitud de consumo a la vez. El cliente obtiene un nombre de consumidor aleatorio. El comportamiento predeterminado establece autoDelete y autoAck propiedades de todos los mensajes como falso. Sin embargo, puede configurarlos de manera diferente si lo desea.

Puede pasar el harego.Workers (3) función de configuración para tener 3 trabajadores concurrentes. Esto se aplica a la publicación y el consumo de mensajes. La biblioteca garantiza entregar el siguiente mensaje disponible al siguiente puesto de trabajador disponible.

Es una buena idea pasar un harego.QueueName () config para que el cliente sepa con qué cola debe interactuar. El nombre de la cola predeterminado es «harego».

El cliente es una interfaz con las siguientes especificaciones:

Publicar mensajes

Para publicar mensajes, puede pasar un * amqp.Publishing objeto al método Publish . El siguiente trabajador disponible procesará el mensaje.

Consumiendo mensajes

El Consume es una llamada de bloqueo que usaría un controlador cada vez que se recibe un mensaje nuevo del corredor. Dejará de consumir cuando se cancele el contexto o se cierre el cliente.

Un controlador debe devolver dos valores: el AckType valor y un retraso. El retraso especifica la duración que debe dormir antes de responder al corredor, y el valor AckType especifica lo que debe suceder con el mensaje.

Valores AckType

Se tomó la decisión de establecer el El valor “múltiple” del acuse de recibo en falso para responder a un solo mensaje en caso de varios trabajadores. Para que el sistema de trabajo funcione, tenemos que establecer el valor de captación previa al menos en la cantidad de trabajadores.

Hay cuatro valores para este tipo:

  1. AckTypeAck : responde con msg.Ack.
  2. AckTypeNack : responde con msg.Nack.
  3. AckTypeReject : responde con msg.Reject.
  4. AckTypeRequeue : envía el mensaje a la cola y responde con msg.Ack. Consulte la sección Volver a poner en cola los mensajes para obtener más información.

Volver a poner en cola los mensajes

Con la biblioteca AMQP puede Nack mensajes y se entregarán al siguiente consumidor disponible. A veces, esto no es lo que espera y necesita que el mensaje vuelva al final de la cola y se entregue nuevamente. Con HareGo no solo es posible, sino que también puede manipular el mensaje antes de volver a ponerlo en cola. A continuación, se muestra un ejemplo de cómo volver a poner en cola hasta 5 veces.

Consejos y trucos

Varias conexiones

Cuando use esta biblioteca, cree varios objetos harego.Client para direccionar diferentes aspectos de tu lógica. Supongamos que está leyendo de una cola y escribiendo en dos colas, cree tres objetos y llame a los dos editores dentro del consumidor del primero:

Código comprobable

Para facilitar la simulación de harego.Client , puede crear un tipo de función que devuelva un nuevo cliente y un error. Puede utilizar una biblioteca de generación de simulacros para crear una simulación a partir de la interfaz harego.Client y utilizarla en sus pruebas.

En el siguiente fragmento, usamos la biblioteca de burla para generar las burlas, y testificar biblioteca para afirmar simulacros. Por supuesto, puede elegir la biblioteca con la que se sienta más cómodo.

Palabras finales

Para obtener más información, visite el repositorio de la biblioteca. Si necesita una solicitud de función o encuentra un problema con la biblioteca, cree un problema dentro del portal de github.

Interesado en unirse a nuestro ¿equipo? Dirígete a este enlace y aplica.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *