Skip to content

Projeto feito com o objetivo de usar diferentes tipos de configurações que o RabbitMQ pode oferecer, e entender o seu funcionamento.

Notifications You must be signed in to change notification settings

ramondomiingos/spring_rabbitmq_study

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🇧🇷 Projeto feito com o objetivo de usar diferentes tipos de configurações que o RabbitMQ pode oferecer, e entender o seu funcionamento.

🇺🇸 Project made with the objective to use different types of configurations that RabbitMQ can offer, and to understand how it works.

Organização do projeto

O projeto esta organizado em pacotes, com possíveis formas de uso do RabbitMQ

  • Sender/Receive

    Configura o envio direto, sem o uso de Exchange ou filas personalizadas.

  • WorkQueue

    Configura o uso de filas nomeadas, 2 consumidores, simulando o roud-robin, o comportamento padrão do Rabbitmq quando existe mais de um consumidor pra fila.E diferentes configurações de ack.

  • PubSub

    Criação de uma Exchange, com 2 filas, uma temporaria, criado com nome aleatório e uma permanente, com nome escolhido pelo desenvolvedor.

  • Routing

    Criação de uma exchange e 2 bindig key, para 2 receiver diferentes.

  • Topic

    Criação de Topic, com route/bind key usando # e * para fazer o match .

  • PubConfirmation

    Faz o envio de novas mensagens e espera a confirmação da Exchange do recebimento.Essa confirmação pode ser uma a uma, ou após o envio de um certo número de mensagens, isso depende da implementação.

  • DLX

    Foi criado uma configuração para DLX - Dead Letter eXchange, onde após um ttl de 10000 mils, a mensagem iria para exchange DLX e suas filas.Para verificar isso funcionando é necessario desligar o receiver, se a mensagem for lida, ela será removida da fila , como uma mensagem processada corretamente.

Teoria

Mensageria

O que é um sistema de mensageria?

  • Computação distribuída
    • Espalhados, com coordenação de maneira que o usuário final enxerga como um sistema único.
  • Comunicação orientada a mensagem;
  • Comunicação ASSÍNCRONA
    • Trasientes
      • Envio uma mensagem e já encerro a comunicação, não espero concluir o processamento.
    • Persistentes
      • Uma vez que se inicia uma comunicação, envio a mensagem, eu só encerro quando concluir.
  • Clusterizado
  • Tolerante a falhas
  • Escalável

Comunicação Síncrona

Quando 2 sistemas se comunicam, e um fica offline e um evento é perdido

Middleware Service

Sistema de comunicação orientado a mensageria

Comunicação do sistema

  • Conexões (Protocolos... AMQP 0.9.1)
  • Roteamento e Armazenamento

Protocolo AMQP

O Protocolo busca trazer uma interoperabilidade entre clientes e servidores. Busca permitir que os devs (usuários em geral ) adotem uma padronização e com isso integrar serviços e sistemas de maneira menos custosa.

  • Binário

    • Produtor/Publisher
    • Consumidor/Subscriber
  • Framework de semântica

    O framework vai definir os papéis

  • Microserviço

Modelo AMQ

Defini a semântico do servidor, definindo os papéis e permissões. Uma vez que os sistemas estão seguindo um modelo, ele garante também a interoperabilidade entre sistemas.

Quando as regras são bem definidas tudo fica claro o que cada ator pode fazer e qual ação deverá ser realizada ( enviar para uma ou mais filas) .

Camadas do protocolo

  • Camada Funcional
    • Definição de conjunto de comandos
  • Camada Transporte
    • Tratamento de erros, transporte, multiplexação de canais, codificação dos dados.

RabbitMQ 🐰

Na comunicação tradicional, um publisher envia para o consumer, e através do protocolo TCP, ele garante a entrega.Uma simples comunicação síncrona, se o servidor cair e a mensagem for perdida, se os dados forem sensíveis.... Temos alguns problemas:

  • Tentativas consecutivas de estabelecer conexão com o servidor consumer offline.
  • Conexões simultâneas, gera sistemas lentos, perdas de pacotes.

Para resolver esse tipo de problema, os sistemas de mensageria pode vir ser uma solução. O serviço (mensenger broker) iria armazenar todas as solicitações, e em seguida o consumer iria processa-las de maneira ordenada.

Vantagens :

  • Escrito em Erlang, leve.
  • Cross-language
  • Cloud friendly
  • Segurança - SSL , TLS
  • Autenticação
  • Acks
  • Gerenciamento

Quem faz :

  • Mensagens
    • Cabeçalho
    • Payload
  • Filas
    • Nome
    • Exclusividade
    • Durável
    • Auto-delete
  • Routing Keys
  • Bind
  • Binding Keys
  • Exchange

Exchange

É o elemeto que separa a mensagem em filas seguindo critérios, faz a correspondencia e o roteamento, seja o o critério distribuir em todas as filas, ou um critério mais específico onde apenas umas o outra fila recebe a mensagem.

  • Fanout

    Broadcast, Não há restrição ou critério de decisão para escolha das filas, todas as mensagens que chegam, vão para todas as filas.

  • Direct

    Comparação realizada entre a routing key e binding key, a combinação precisa ser exata.

  • Topic

    Comparação realizada entre a routing key e binding key, a combinação é parcial.

    • * Substituição por uma única palavra;
    • # Substituição por zero ou mais palavras;
    • veloz.branco.carro => *.*.carro ou veloz.#
  • Head

    Utiliza o cbaeçalho da mensagem como fator de decisão;

  • Default

    Comparativo padrão: Routing key e o nome da fila;

Quando?

  • Meu cliente precisa de respostas Imediatas?
  • Tempo de respostas para usuário
  • Workload
  • Tempo de resposta por período ocioso.
  • E quando eu crescer (refaz as perguntas) ?

Preparando Ambiente

Roteiro

  • Instalar docker
  • Instalar docker-compose
  • Criar containar com imagem do RabbitMQ
  • Instalar o portainer.io (opcional)

Instalar docker

sudo apt-get update
sudo apt-get install docker.io

Testando se o docker foi instalado corretamente

sudo docker run hello-world

Instalando do docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Criando um container do RabbitMQ

docker pull rabbitmq
services:
  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    ports:
      - 25672:25672
      - 15672:15672
      - 5672:5672
    volumes:
      - .docker_conf/rabbitmq:/var/lib/rabbitmq
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
    restart: always
volumes:
  log-folder:
    name: ${log_rabbitmq_management}
    driver: local

About

Projeto feito com o objetivo de usar diferentes tipos de configurações que o RabbitMQ pode oferecer, e entender o seu funcionamento.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages