Ir para o conteúdo principal

Processamento de mensagens em filas (MDB)

Data: 25/11/21

Autores:

  1. Diego Gonçalves de Almeida (Assessor)
  2. Igor Ramos de Oliveira (Assessor)

1. Objetivo

Definir melhor pratica de desenvolvimento de serviços com processamento em background.

2. Introdução

Definir melhor prática de desenvolvimento de serviços com processamento em background.

3. Desenvolvimento

3.1 O que e um MDB?

É um microserviço que permite processar mensagens assíncronas e síncronas, agindo como um "Java Message Service (JMS) message listener".
Este serviços divide-se em duas premissas "Consumer" e os "Producer":

    • Consumer: São consumidor de mensagens publicadas em um determinado tópico, este consumidor não depende, para o seu funcionamento, de um produtor; ambos funcionam de forma independente, podendo esta arquitetura possuir vários consumers afim de trabalhar com alto nível de processamento de dados.

image-1631663419844.png

  •  


    • Producer: São usado para enviar mensagens para uma fila ou tópico, e, como o consumidor, seu serviço é independente.

image-1631663352989.png

Os clientes "Consumer" podem consumir mensagens de forma assíncrona ou síncrona, de acordo com a especificação ou necessidade do sistema. 

3.2 Como MDBs são diferente de Entity ou Session?

  • Clientes não acessam MDBs através de interfaces.
  • De várias forma, um MDB parece um stateless session.
    • Instância de MDBs não podem reter estado;
    • Todas as instâncias são equivalentes, um container pode usar um pool de MDBs;
    • Um MDB pode processar mensagens de vários clientes.
  • Algum estado pode ser mantido pelo MDB exemplos, (Conexão JMS, conexão com banco de dados entre outros), mas não pode ser específico aos clientes.
  • Características de MDBs.
    • Executam quando recebem uma mensagem;
    • São invocado assincronamente;
    • Normalmente têm curto tempo de vida;
    • Não representam dados compartilhado num Banco de Dados, mas podem prover acesso a esses dados;
    • Podem usar transações.
      • Se a transação sofrer rollback, a mensagem será reposta com "retry", para reprocessamento.
    • São stateless.

3.3 Quando usar um MDBs

Só se pode usar uma mensagem assíncrona quando o chamado não precisa de uma resposta imediata, suponto que essas condições se apliquem, segue alguns motivos possíveis:

  • Para melhorar a percepção que o cliente tem do tempo de resposta, sendo uma regra de negócio pede que a resposta seja entregue de forma indireta e não como resposta direta, exemplo (E-mail, Notificações, Push, etc..).
  • Quando a ordem de processamento não importa.
  • Para realizar um bom balanceamento de carga.

image-1631664955770.png

Podendo possuir muitos consumidores e muitos produtores no mesmo tópico

image-1631665366172.png

3.4 Desvantagem

  • É mais complexo depurar um código assíncrono do que código síncrono.

3.5 Monitoramento

  • Seu monitoramento se da por logs, integrado como exemplo "Splunk", afim de otimizar a integração e suas analise caso precise pesquisar afundo uma determinada ação e comportamento do MDB. 
  • Serviço bem logado se torna mais fácil sua auditoria, e facilita a busca de alguma incidentes que possa ocorrer.
4. Conclusão

A partir do desenvolvimento foi concluído que é importante a utilização de um sistema de filas para ter uma comunicação assíncrona, evitando esperas desnecessárias.