Arquitetura do sistema de alerta

10

Eu gostaria de criar um sistema que lida com mensagens de alerta de vários programas e possa processar esses alertas para consumidores de baixa velocidade por email. Tudo isso estaria contido em uma rede interna.

Eu acho que quero que a arquitetura básica fique assim:insira a descrição da imagem aqui

A principal preocupação que tenho atualmente é o bit "Message Handler", que será o meu "tipo de API". Desejo que todos os componentes deste sistema enviem dados para a API, que lida com todas as gravações no banco de dados. Eu acho que essa abordagem é mais fácil porque simplifica a segurança e permite que eu contenha muitas das consultas de banco de dados mais complicadas em um único programa.

A preocupação é que eu queira que isso seja independente da linguagem - o que significa que qualquer código deve poder enviar mensagens para o meu manipulador - que as interpretará. Espero fazer isso via arquivos simples JSON - ou via chamadas REST para o programa (dando flexibilidade aos aplicativos de downstream).

Minha pergunta é-

Devo me preocupar com o manipulador de mensagens - ou acrescentaria simplicidade para permitir apenas o acesso direto ao banco de dados dos aplicativos de downstream, bem como dos outros dois componentes (Console de Gerenciamento e Alert Manager)?

Dessa forma, eles podem inserir qualquer alerta que desejarem - desde que o INSERT na (s) tabela (s) do banco de dados seja válido.

Não sou designer de software por profissão, então com licença - só quero que um projeto seja realizado no meu tempo livre.

Christopher
fonte

Respostas:

4

Você já consultou o AMQP (Advanced Message Queuing Protocol: https://www.rabbitmq.com/protocol.html )?

O RabbitMQ é uma ferramenta incrível para algo assim, eu acho (existem outros também, MSMQ, serviços do Azure / AWS etc.). Você não apenas obtém um manipulador de mensagens independente de um idioma (simples "envia a mensagem ao servidor de mensagens com dados json"), mas também desanexa o processamento de mensagens downstream e o torna bem isolado. Execute um serviço de mensagens que processe as mensagens recebidas da (s) fila (s) necessária (s) e cuspe suas notificações.

Uma das razões pelas quais eu realmente gosto de usar o AMQP é que você começa como se estivesse agora com alguma solução caseira, mas percebe que, depois de algum tempo, precisa lidar com as mensagens de maneira um pouco diferente, dependendo do tipo, para quem precisa ir etc. , então você acaba criando sua própria implementação do AMQP de qualquer maneira.

O que você faz se uma mensagem precisar ir para 5 destinatários diferentes? E se você tiver uma mensagem que deve ser alternada em vários processadores (pense em tarefas de longa execução e com um número X de processadores simultâneos, onde você pode alternar entre as mensagens de um tipo específico). E se a mensagem for direcionada para uma pessoa, mas se não estiver disponível / online, deve ser direcionada para outra? O AMQP lida com tudo isso (muito bem!) Já, com categorizações muito agradáveis, filas, canais, persistência durável, todos os tipos de recursos.

Aqui está uma visão geral básica dos cenários que ele pode lidar (observe que isso não é específico do RabbitMQ: é uma coisa da AMQP, mas o RabbitMQ explica isso bem) - https://www.rabbitmq.com/getstarted.html

jleach
fonte
Eu já vi o RabbitMQ implementado para outro software antes - sempre parecia interessante (se não um pouco complicado). Vou dar uma olhada nisso! Acho que evitei isso no começo porque queria muita flexibilidade para oferecer aos remetentes de dados. Portanto, se for difícil implementar uma chamada REST em um Powershell ou Javascript existente ou proibir um aplicativo VB6, eles geralmente podem gerar um arquivo simples com bastante facilidade. Mas ser capaz de substituir grande parte da manipulação de mensagens economizaria tempo e esforço, com certeza!
Christopher
2
Fiquei um pouco intimidado quando entrei no RabbitMQ, mas depois de um fim de semana de estudo foi como uau, isso é realmente muito, muito bom, e agora que eu entendo o que estou vendo, é realmente muito simples
jleach
Eu gosto da idéia do AMQP, mas a maneira como o RabbitMQ lida com as APIs clientes de cada idioma derrota todo o propósito de usar um protocolo independente de idioma. E se eu tiver um cliente que esteja executando um idioma que não tenha uma API suportada criada para ele? Alguns desses recursos são realmente bons ... mas exageram quando tudo o que preciso fazer é receber 1 mensagem do ponto A ao ponto B, sem nada no meio.
Christopher Christopher
Eu estava pensando em colocar uma API de descanso rápido em cima dela, o que cobriria sua preocupação agnóstica, mas concordou que, se você nunca precisar de nenhum dos recursos que o AMQP oferece, seria um exagero (desculpas se eu tivesse uma experiência selvagem) ganso perseguição sobre ele ...)
jleach 03/04
Sim - uma rápida API REST para cobri-la funcionaria .. mas, em seguida, é melhor criar apenas uma API REST. E não é necessário desculpas - é uma ótima tecnologia e o aprendizado é essencial para o progresso :) se não agora - tenho certeza de que será útil no futuro.
Christopher Christopher
3

Pergunta muito bem enquadrada!

Portanto, todas as decisões de arquitetura envolvem trocas. Se você está curioso para uma discussão sobre compensações, talvez edite sua pergunta nessa direção. Em vez disso, como a pergunta apenas pede uma posição, eu aceitarei o lado da argumentação a favor do MessageHandler. Vou dar um passo adiante para sugerir NÃO incluir um banco de dados - pelo menos não um banco de dados SQL, pelo menos para não iniciar. Basta fazer com que o MessageHandler salve o JSON no sistema de arquivos, digamos um diretório por hora de alertas recebidos (dependendo do volume, é claro) e tenha a API quando consultada pelo Alert Manager, apenas percorra os 2 últimos diretórios de alertas para decidir quais emails serão entregues (dependendo da prioridade, é claro).

Há um monte de coisas boas para tratar desse problema, e manter um banco de dados fora de cena nos estágios iniciais removerá muito ruído incidental e a solução desnecessária de problemas. Claro, talvez você tenha um amor oculto por criar modelos de dados relacionais e sonhe em escrever SQL. Nesse caso, esta resposta está totalmente errada. Mas, de um modo geral, mesmo os bancos de dados mais ágeis são plataformas de aplicativos terríveis e só são incluídos nos sistemas porque são especialistas em durabilidade e consulta indexada.

Boa sorte!

Jonah Benton
fonte
1
Eu apenas gosto da capacidade de controlar grupos de email, membros e várias outras coisas interessantes sobre o uso de um banco de dados relacional. O design do banco de dados é realmente o que eu comecei no projeto - então nunca pensei em removê-lo. Obrigado por essa entrada e ponto de vista !!
Christopher
Eu sabia! :) Entender o que você realmente deseja obter de algo é a coisa mais importante. Felicidades!
Jonah Benton