Como implementei notificações em tempo real com AWS

Necessidade do cliente

O usuário realiza determinadas operações que precisam ser notificadas a outros usuários. Por exemplo, quando um administrador concede permissão para que o usuário X visualize uma publicação, é necessário que o usuário X seja notificado em tempo real.

Solução

  • Recursos utilizados
    • API Websocket: Possui o endpoint responsável pela conexão do usuário à API, o qual está vinculado às funções Lambda de conexão e desconexão, gerenciando os status de conexão;
    • 3 funções lambda:
      • Função de conexão: É responsável por validar o JWT recebido como parâmetro de query e extrair os dados do usuário, registrar os dados de conexão do usuário com a API Websocket no banco de dados, buscar notificações pendentes do usuário no banco de dados e enviar cada uma por meio da invocação da função lambda de envio de mensagens;
      • Função de desconexão: É responsável por remover os dados de conexão do usuári com a API Websocket;
      • Função de enviar mensagem: É responsável por enviar a notificação para a pool do usuário baseado no id da conexão do usuário logado com a API Websocket;

Fluxograma das possibilidades de comunicação com a API Websocket Fluxograma das possibilidades de comunicação com a API Websocket

  • Observação: Na imagem acima, a rota para marcar notificações como lidas pertence à API HTTP existente, e não à API WebSocket;

Proposta de melhoria

Na solução apresentada, o envio de notificações está completamente acoplado à funcionalidade executada. Por exemplo, ao adicionar uma permissão a um usuário em uma publicação, a notificação é enviada após a ação. Como proposta de melhoria, seria ideal enviar as notificações para uma fila, a fim de desacoplar o envio de notificações do restante da funcionalidade.

Entendi que o usuário pra poder enviar as notificações ele precisa se autenticar previamente, o papel do WS nesse fluxo é o de armazenar o estado de autenticação?

Outra coisa, as notificações que você está enviando é do push? Se for o SNS também não serviria?

É necessário que o usuário possua credenciais válidas no sistema para receber notificações em tempo real via WebSocket. No momento da conexão, o ID da conexão do usuário com a API WebSocket é salvo no banco de dados, permitindo o envio de notificações com base nesse ID. Atualmente, as notificações são enviadas ao final da execução da funcionalidade. A ideia é desacoplar esse processo utilizando SNS -> SQS(Notificar via sistema) e SES(Notificar via email), permitindo o envio de notificações sem bloquear a execução.