Lignum: fila de mensagens distribuídas
Entre todo o fuzz WFH e situação isolada, eu me propus a olhar para bloqueios distribuídos usando Consul, o programa de teste simples logo se tornou um caminho para construir uma fila de mensagens distribuídas chamada Lignum .
Este é um artigo introdutório à fila de mensagens Lignum.
O que é sistema distribuído?
Existem muitas definições por aí, uma simples pesquisa no Google resultará em várias respostas. Posso definir sistema distribuído como uma coleção de programas ou sistemas autônomos ou individuais que trabalham em direção a um objetivo comum.
Ou seja, vários sistemas conectados em rede por vários meios de comunicação para servir a um propósito comum. Podem ser sistemas em que um pede uma página da web e o outro atende páginas da web. Para um usuário final, esses sistemas podem parecer um só, mas pode haver centenas desses sistemas, que se comunicam entre si para realizar a tarefa.
O que é fila de mensagens?
Sistema que fornece estrutura de dados de fila para outro serviço ler e escrever mensagens na ordem FIFO.
A fila permite que o serviço do produtor grave a mensagem e o consumidor consuma de forma assíncrona. Produtor e consumidor não precisam estar cientes um do outro.
Duas características básicas da fila de mensagens são
- Mensagens de tópico
são enviadas para o buffer nomeado, elas são chamadas de tópico. Produzimos e consumimos mensagens do tema. - Mensagem
Esta é a mensagem real que escrevemos no tópico para outros consumirem.
O que é fila de mensagens distribuídas?
Quando construímos uma fila de mensagens hospedadas em vários nós, trabalhando coletivamente para servir como entidade única para outros serviços.
Haverá várias mensagens de usuário de hospedagem de fila para fornecer
- Confiabilidade e alta disponibilidade
- Tolerância ao erro
- atuação
- Compartilhamento de carga de leitura com vários nós
O Lignum foi iniciado como um programa de teste para aprender o bloqueio distribuído usando o bloqueio de sessão do Consul , que começou a girar em direção à fila de mensagens enquanto eu trabalhava no Kafka na época.
Isso está escrito em Go. Eu comecei com o desenvolvimento orientado a testes em mente, mas logo acabou sendo uma bagunça.
Lignum não é uma fila de mensagens completa, é um trabalho em andamento. Você pode
- Enviar mensagens para o tópico
- Consumir mensagens do tópico
- A mensagem é replicada para todos os nós, o que significa que qualquer nó pode ser usado para ler a mensagem do tópico
- Persistir mensagens no disco
- Lignum pode operar em modo cluster sem precisar de nenhuma configuração especial
- O gerenciamento de cluster é facilitado pelo Consul com seus bloqueios de sessão
- Cada nó se conectará ao Consul para obter o líder. Se nenhum líder for encontrado, um dos nós será eleito como líder
- Todos os outros nós se registrarão como seguidores do líder
- A mensagem enviada ao nó líder será replicada para o nó seguidor
- Tem dois modos de replicação
a. Replicação WAL
b. Replicação ao vivo - Se o líder cair, qualquer um dos seguidores é eleito como líder
Atualmente lignum implementa dois modos de estratégia de replicação.
- replicação WAL
- Replicação ao vivo.
replicação WAL
O arquivo de log é criado para cada tópico quando a mensagem ultrapassa o tamanho do buffer definido em config( message.initial-szie-per-topic
). Lignum cria arquivo WAL( .qwal
) para cada tópico. Quando a contagem de mensagens atinge o tamanho do buffer, esse arquivo é liberado para o disco como log
arquivo. Lignum frequentemente observa a criação desses arquivos de log e os envia para os seguidores. Todos os seguidores são sincronizados periodicamente com o líder, fornecendo consistência eventual/atrasada.
Replicação ao vivo
Esta é uma replicação de streaming, quando o seguidor já está cadastrado com o líder, não precisamos nos preocupar em sincronizar as mensagens se o tópico for criado depois. Podemos apenas encaminhar as mensagens recebidas no líder como está para o seguidor. Nesta estratégia, as mensagens são enviadas para o seguidor registrado imediatamente. Desta forma, Lignum pode fornecer consistência forte.
Como executar o Lignum
- Pré -requisito
— Consul
Você pode usar o Dockerfile conforme especificado no README - Clonar o repositório
https://github.com/NishanthSpShetty/lignum.git
config.yml
, você pode consultar esta documentação para obter mais detalhes sobre configs.make run
- Enviar mensagem
curl --request POST \
--url http://localhost:8080/api/message \
--header 'Content-Type: application/json' \
--data '{
"topic": "test",
"message":"this is a test message"
}'
curl --request GET \
--url http://localhost:8080/api/message \
--header 'Content-Type: application/json' \
--data '{
"topic": "test",
"from": 0,
"to": 3
}'
Que garantia de entrega oferece?
Como as mensagens são persistidas e o consumidor pode ler qualquer offset a qualquer momento, a garantia de entrega é do consumidor. O Lignum garante a ordenação das mensagens.
Vamos adicionar o nó ao cluster existente
- Altere a configuração de acordo com seu host.
- Se estiver executando no mesmo host da execução anterior, altere os valores de porta, diretório de dados e porta de replicação no arquivo de configuração.
- Corre
make run
Esta é uma breve introdução ao Lignum. Eu apresentarei um documento separado sobre seus detalhes internos e de desenvolvimento no futuro.
O código está no Github: Lignum .
Confira e forneça feedback, contribuições são bem-vindas.
Confira meu perfil do Github para outros projetos incríveis em que estou trabalhando
Conecte-se comigo no LinkedIn
https://www.linkedin.com/in/nishanthspshetty/