Este repositório contém o worker de entrega de notificações serverless para o ecossistema DotCruz. É uma função AWS Lambda disparada por filas Amazon SQS, desenvolvida em .NET 10.0 e compilada com Native AOT para garantir baixíssima latência e tempos de inicialização (cold starts) mínimos.
Este projeto foi desenhado com o objetivo de ser um worker de alto desempenho e baixo custo, capaz de processar envios de notificações (E-mail, SMS, Push) utilizando as seguintes decisões técnicas:
- Decisão: O projeto compila diretamente para um executável nativo do sistema operacional (
<PublishAot>true</PublishAot>no arquivo DotCruz.Notifications.Delivery.Lambda.csproj), executado em um runtime customizadoprovided.al2023. - Motivo: Runtimes padrão do .NET na AWS Lambda sofrem com latência de inicialização a frio (cold start) e maior uso de memória. O Native AOT elimina a necessidade de compilação JIT em tempo de execução, garantindo inicialização imediata e baixo consumo de memória (limitado a 256MB no arquivo aws-lambda-tools-defaults.json).
- Serialização AOT: Utiliza serialização baseada em geradores de código via
SourceGeneratorLambdaJsonSerializereLambdaJsonSerializerContextpara assegurar compatibilidade com o corte de código (trimming) do AOT.
- Decisão: A Lambda é disparada assincronamente por eventos do Amazon SQS.
- Motivo: O SQS funciona como um amortecedor e fila de tentativas automáticas, garantindo alta resiliência e tolerância a falhas caso ocorra instabilidade externa nos envios.
- Handler: O arquivo FunctionHandlerService.cs recebe lotes de mensagens, desserializa o corpo de cada registro e despacha comandos individuais via MediatR.
- Decisão: As credenciais SMTP específicas de cada cliente (tenant) não são salvas em variáveis de ambiente nem no código. Elas são buscadas em tempo de execução no AWS Systems Manager (SSM) Parameter Store.
- Motivo: Suporte multi-inquilino (multi-tenant). Permite adicionar ou alterar as credenciais de SMTP de um cliente sem necessidade de atualizar ou reinstalar o código da Lambda.
- Cache local: Para otimizar a performance e reduzir custos com chamadas à API da AWS, o SmtpConfigProvider.cs faz cache das credenciais obtidas em memória por 5 minutos.
- Decisão: Os envios usam o padrão Strategy integrado ao manipulador de comandos do MediatR (ProcessNotificationCommandHandler.cs).
- Motivo: Facilita a expansão e inclusão de novos canais de envio (ex: WhatsApp, Discord) no futuro. O manipulador decide dinamicamente a estratégia de envio correta (E-mail, SMS ou Push) baseando-se no tipo da notificação recebida no payload.
- Decisão: Após o sucesso ou falha da tentativa de entrega, o worker realiza uma chamada HTTP de volta à API principal rodando na VPS.
- Motivo: Atualiza o banco de dados principal de notificações com o estado real de entrega e registra o log detalhado de erro em caso de falhas.
- .NET 10.0 (C#)
- AWS Lambda & Amazon SQS
- AWS Systems Manager (SSM) Parameter Store
- MailKit: Envio de e-mails via SMTP.
- MediatR: Despacho de comandos em memória.
- Native AOT: Compilação nativa altamente otimizada para serverless.
- SDK do .NET 10 instalado.
- AWS CLI configurado com credenciais de acesso para ler parâmetros do SSM (se for testar integrado à nuvem).
O worker espera que as seguintes variáveis estejam definidas no ambiente de execução:
| Variável | Descrição |
|---|---|
NOTIFICATIONS_API_URL |
Endereço base HTTP da API de Notificações principal (VPS). |
NOTIFICATIONS_API_KEY |
Chave de API de segurança usada para autorizar os callbacks de retorno na API principal. |
PARAMETER_PATH |
Caminho de busca no AWS SSM formatado com a chave do inquilino (ex: /dotcruz/tenants/{0}/smtp-config). |
A pasta de testes possui validações de unidade e integração. Execute-os usando:
dotnet testO deploy é gerenciado automaticamente pelo GitHub Actions através do workflow deploy.yml.
Sempre que um commit é integrado na branch main:
- Prepara o ambiente do SDK do .NET.
- Instala a ferramenta de linha de comando
Amazon.Lambda.Tools. - Configura as credenciais AWS a partir dos segredos criptografados do GitHub.
- Realiza a publicação e atualização da função com base nas definições do arquivo aws-lambda-tools-defaults.json:
dotnet lambda deploy-function notification-delivery-handler-prod