Criando Azure Functions para entradas idênticas
A realidade da arquitetura controlada por eventos e controlada por mensagens determina a necessidade de aceitar solicitações idênticas enquanto preserva a integridade dos dados e a estabilidade do sistema.
Para ilustrar, considere um botão de chamada de elevador. Quando você pressiona o botão, ele acende e um elevador é enviado para o andar. Alguns instantes depois, outra pessoa entra no lobby. Essa pessoa sorri para você e pressiona o botão iluminado uma segunda vez. Você sorri de volta e se diverte lembrando que o comando para chamar um elevador é idempotente.
Pressionar um botão de chamada de elevador uma segunda, terceira ou quarta vez não tem nenhuma influência sobre o resultado final. Quando você pressiona o botão, independentemente do número de vezes, o elevador é enviado para o andar. Sistemas idempotentes, como o elevador, chegam ao mesmo resultado independentemente de quantas vezes comandos idênticos são emitidos.
Quando se trata de criar aplicativos, considere os seguintes cenários:
- O que acontecerá se um aplicativo de controle de inventário tentar excluir o mesmo produto mais de uma vez?
- Como um aplicativo de recursos humanos se comporta quando há mais de uma solicitação para criar um registro de funcionário para a mesma pessoa?
- Para onde vai o dinheiro se um aplicativo de serviços bancários receber 100 solicitações para fazer a mesma retirada?
Há muitos contextos em que as solicitações para uma função podem receber comandos idênticos. Algumas situações incluem:
- Políticas de repetição enviando a mesma solicitação muitas vezes.
- Comandos em cache reproduzidos para o aplicativo.
- Erros de aplicativo enviando várias solicitações idênticas.
Para proteger a integridade dos dados e do sistema, um aplicativo idempotente contém lógica que pode conter os seguintes comportamentos:
- Verificar a existência de dados antes de tentar executar uma exclusão.
- Verificar se os dados já existem antes de tentar executar uma ação de criação.
- Reconciliar a lógica que cria consistência eventual nos dados.
- Controle de simultaneidade.
- Detecção de duplicação.
- Validação da atualização de dados.
- Lógica de proteção para verificação de dados de entrada.
Em última instância, a idempotência é obtida ao garantir que uma determinada ação seja possível e seja executada apenas uma vez.