HareGo: Quando RabbitMQ encontra Go

(Arsham Shirvani) (18 de dezembro de 2020)

Prefácio

No Blokur, utilizamos RabbitMQ para assíncronos comunicações entre micro-serviços e para gerir empregos. A biblioteca AMQP é o padrão de fato para aplicativos Go, no entanto, é de nível muito baixo, o que torna difícil escrever código flexível e testável.

No mundo do Go, há um punhado de bibliotecas de alto nível que facilitam a comunicação com o RabbitMQ. Infelizmente, eles não satisfizeram todos os nossos casos de uso, ou foram muito específicos no que oferecem, o que tornou muito difícil para nós trabalharmos. Portanto, decidimos construir nossa própria biblioteca.

Precisávamos de algo em que pudéssemos começar a trabalhar rapidamente para a parte mais importante de nossas tarefas diárias: resolver problemas. Qualquer coisa em torno disso é um custo de desenvolvimento e não se encaixa em nosso modelo.

Digite HareGo

Começamos a pensar em criar nosso próprio biblioteca com as seguintes características:

  1. Deve suportar quase todos os aspectos da biblioteca AMQP.
  2. Deve ser bem testado e facilmente testável.
  3. Deve ser fácil de usar e extensível.
  4. Deve vir com padrões lógicos que simplesmente funcionem.
  5. Deve ser seguro em simultâneo.
  6. É bom ter a capacidade para recolocar mensagens na fila (não apenas Nack) e ser capaz de manipular a mensagem antes de recolocar na fila.

Temos o prazer de anunciar que abrimos o código-fonte desta biblioteca. No momento em que este artigo foi escrito, oferecemos suporte à versão Go 1.14 e superior.

API

A interface do HareGo é muito simples. Você precisa criar um objeto harego.Client com o prático harego. Função NewClient () . Os únicos requisitos da função NewClient () é o endereço do servidor RabbitMQ. Você pode configurar todos os aspectos do cliente e, consequentemente, o cliente AMQP subjacente, passando harego.ConfigFunc funções de configuração fornecidas pela biblioteca.

Por padrão, um harego.Client cria um trabalhador, que lida com uma publicação ou uma solicitação de consumo por vez. O cliente obtém um nome de consumidor aleatório. O comportamento padrão configura autoDelete e autoAck propriedades de todas as mensagens como falsas. No entanto, você pode configurá-los de forma diferente, se desejar.

Você pode passar o harego.Workers (3) função de configuração para ter 3 workers simultâneos. Isso se aplica à publicação e ao consumo de mensagens. A biblioteca garante entregar a próxima mensagem disponível para o próximo slot de trabalho disponível.

É uma boa ideia passar um harego.QueueName () config para permitir que o cliente saiba com qual fila ele deve interagir. O nome da fila padrão é “harego”.

O cliente é uma interface com as seguintes especificações:

Publicação de mensagens

Para publicar mensagens, você pode passar um * amqp.Publishing objeto ao método Publicar . A mensagem será processada pelo próximo trabalhador disponível.

Consumindo mensagens

O Consume é uma chamada de bloqueio que usaria um manipulador toda vez que uma nova mensagem fosse recebida do corretor. O consumo será interrompido quando o contexto for cancelado ou o cliente for fechado.

Um manipulador deve retornar dois valores: o AckType valor e um atraso. O atraso especifica a duração que ele deve dormir antes de responder ao corretor, e o valor AckType especifica o que deve acontecer com a mensagem.

Valores AckType

Foi tomada uma decisão para definir o Valor “múltiplo” do ack para falso para responder a apenas uma mensagem no caso de vários trabalhadores. Para fazer o sistema de trabalho funcionar, temos que definir o valor de pré-busca para pelo menos a quantidade de trabalhadores.

Existem quatro valores para este tipo:

  1. AckTypeAck : responde com msg.Ack.
  2. AckTypeNack : responde com msg.Nack.
  3. AckTypeReject : responde com msg.Reject.
  4. AckTypeRequeue : envia a mensagem de volta para a fila e responde com msg.Ack. Consulte a seção Recolocar mensagens na fila para obter mais informações.

Recolocar na fila as mensagens

Com a biblioteca AMQP, você pode Nack mensagens e elas serão entregues ao próximo consumidor disponível. Às vezes, isso não é o que você esperava e você precisa que a mensagem volte ao fim da fila e seja entregue novamente. Com o HareGo não só é possível, mas você também pode manipular a mensagem antes de recolocar na fila. Aqui está um exemplo de enfileiramento de até 5 vezes.

Dicas e truques

Conexões múltiplas

Ao usar esta biblioteca, crie vários objetos harego.Client para endereçar diferentes aspectos de sua lógica. Digamos que você esteja lendo de uma fila e gravando em duas filas, crie três objetos e chame os dois editores dentro do consumidor do primeiro:

Código testável

Para facilitar a simulação do harego.Client , você pode criar um tipo de função que retornaria um novo cliente e um erro. Você pode usar uma biblioteca de geração de simulação para criar uma simulação da interface harego.Client e usá-la em seus testes.

No snippet a seguir, estamos usando a biblioteca mockery para gerar as simulações e testificar biblioteca para afirmar simulações. Claro que você pode escolher a biblioteca com a qual se sente mais confortável.

Palavras finais

Para obter mais informações, visite o repositório da biblioteca. Se você precisar de alguma solicitação de recurso ou encontrar um problema com a biblioteca, crie um problema no portal do github.

Interessado em participar de nosso equipe? Acesse este link e inscreva-se.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *