![Sucesso DevEx: Como a Pfizer cresceu para 1.000 engenheiros](https://optimuscloud.com.br/wp-content/uploads/2024/04/1714411325_Sucesso-DevEx-Como-a-Pfizer-cresceu-para-1000-engenheiros-150x150.png)
Sucesso DevEx: Como a Pfizer cresceu para 1.000 engenheiros
29 de abril de 2024![Bancos de dados vetoriais SQL estão moldando o novo paradigma LLM e Big Data](https://optimuscloud.com.br/wp-content/uploads/2024/04/1714434245_Bancos-de-dados-vetoriais-SQL-estao-moldando-o-novo-paradigma-150x150.jpg)
Bancos de dados vetoriais SQL estão moldando o novo paradigma LLM e Big Data
29 de abril de 2024Todos nós já passamos por isso: um site não funciona como esperamos. Talvez a conexão tenha caído, algo tenha acontecido com a API ou um botão simplesmente não parecesse processar — então apenas pressionamos o botão repetidamente ou recarregamos e reiniciamos todo o processo.
Parece uma boa ideia para os usuários, mas é uma dor de cabeça para desenvolvedores web e empresas. Pode causar pedidos duplicados que o usuário, na verdade, não deseja, o que por sua vez leva a múltiplas cobranças, entregas e devoluções. O que um desenvolvedor web deve fazer?
Compreendendo a idempotência
Adrienne Tacke, defensora sênior de desenvolvedores da Cisco, ofereceu uma solução durante a conferência InfoBip Shift da semana passada: invalidar APIs inconsistentes com idempotência.
Idempotente é um termo matemático definido como “denotando um elemento de um conjunto que permanece inalterado em valor quando multiplicado ou de outra forma operado por si mesmo.”
Tecnicamente, reconheceu ela, idempotência não é uma palavra. A palavra é idempotente e é um termo matemático que o dicionário define como “denotando um elemento de um conjunto que permanece inalterado em valor quando multiplicado ou operado por si mesmo”.
“Se você pensar na multiplicação, três vezes um sempre será três, ou quatro vezes um sempre será quatro”, disse ela. “Portanto, não importa quantas vezes você execute algo, com as mesmas entradas, ele permanece inalterado, fornecendo a mesma saída.”
Em tecnologia, uma chamada ou operação de API é idempotente se tiver o mesmo resultado, não importa quantas vezes seja aplicada. Basicamente, isso significa que a API não processa duplicatas, explicou Tacke.
Pode ser um grande problema quando se lida com grande escala. Ela lembrou ao público um dos sete princípios de design de aplicações bem arquitetadas: Design para falhas e duplicatas.
“O próprio Werner Vogels disse… o fracasso sempre acontecerá”, disse Tacke. As falhas levam a novas tentativas, continuou ela, o que leva a duplicatas. “Se ocorrerem duplicatas, a idempotência é a chave para mitigar os efeitos colaterais que ocorrerão”.
Por exemplo, disse Tacke, digamos que seu marido esteja dirigindo e ela decida pedir um bolo para entrega, mas assim que ela envia o pedido, o carro passa por um túnel e o telefone perde a conectividade de rede. Supondo que o pedido não foi processado, ela reenvia. Infelizmente, os dois pedidos foram atendidos e agora ela tem dois bolos a caminho.
“Minha intenção era pedir um bolo, mas como não há idempotência embutida no sistema, o maior efeito colateral é que solicitações duplicadas são consideradas solicitações válidas”, disse ela. “Quando você tem uma solicitação específica e a intenção específica não é capturada, é isso que acontece em um sistema não idempotente. Ele não tem escolha a não ser dizer: ‘Ei, há dois pedidos aqui para dois bolos, vou analisá-los e processá-los’.
A construção de idempotência no sistema impedirá isso e garantirá que apenas um pedido seja cumprido, continuou ela.
Construindo Idempotência em Chamadas de API
A criação de idempotência requer três elementos, explicou Tacke, começando com a chave de idempotência, um identificador exclusivo gerado pelo cliente. Essencialmente, inclui um identificador exclusivo para o pedido que será repetido dentro de um período de tempo específico definido pelo desenvolvedor – digamos, um minuto – que informa ao sistema o que procurar; e se o vir novamente, considerará o pedido como duplicado.
“Este pode ser um identificador único, … pode ser um hash do evento, ou carimbo de data e hora, seja lá o que for, precisa ser algo único e precisa capturar a intenção de suas solicitações”, disse ela.
O próximo elemento é a camada de idempotência, que atua como um filtro, decidindo o que fazer com a solicitação.
“Isso pode estar na camada API, pode estar na camada intermediária, nossa camada de middleware chamada MIDI lida com isso, mas é isso que funciona como um filtro”, disse ela. “É isso que decide o que fazer com esse pedido. Posso usar essa chave de idempotência com o restante da nossa solicitação e ela analisará as informações contidas nela e dirá: O que eu faço com isso? Como faço para lidar com isso? Eu já vi isso antes?
Finalmente, a criação de idempotência requer armazenamento persistente, que serve como uma fonte de verdade para chaves de idempotência e uma lista de pontos de verificação em novas tentativas.
“Esta é a fonte da verdade para o nosso sistema, e é aqui que também pode servir como ponto de verificação se você tiver um sistema com funcionamento mais longo”, disse ela. “Quando obtiver a chave de idempotência, ele olhará para esse armazenamento persistente e dirá: ‘Ei, já vi isso antes?'”
Dentro de uma aplicação com idempotência, a chave dirá ao sistema: “Já vimos esta solicitação”, explicou ela.
“Não importa quantas vezes eu execute isso agora, ele removerá essas solicitações duplicadas e, na verdade, apenas capturará a intenção e me dará apenas o bolo que eu quero”, disse Tacke.
Uma desvantagem é que se o cliente pretendia criar dois pedidos, ele também não reconhecerá o segundo pedido dentro do prazo definido pelo desenvolvedor, forçando o cliente a esperar um certo tempo para fazer um novo pedido. Mas a suposição é que este é um cenário menos provável do que duplicatas acidentais.
Ferramentas e recursos para idempotência de API
Uma ferramenta que Tacke gosta para criar chaves de idempotência em um aplicativo é o AWS Lambda Powertools, que está disponível para .NET, Python e TypeScript.
“Nesse caso, você pode fazer um hash completo de todo o evento ou pode escolher partes específicas do evento para serem hash, e isso se torna sua chave de idempotência”, disse ela.
Ele também possui uma camada de armazenamento persistente, sendo o DynamoDB o padrão, embora agora seja possível “trazer seu próprio armazenamento persistente”, disse ela.
“Muito rapidamente, a maneira como você começaria é ter esse decorador de idempotência, e você poderia facilmente tornar sua solicitação idempotente importando essa biblioteca específica e usando decoradores idempotentes”, disse ela.
O desenvolvedor pode definir uma janela de tempo específica para duplicatas. Por exemplo, ele pode ser configurado para que, se alguém enviar a mesma solicitação no intervalo de 30 segundos ou um minuto, ele as remova automaticamente como solicitações duplicadas.
“Outro recurso que eles têm é que você pode lidar com execuções simultâneas na mesma carga”, acrescentou ela. “Digamos que algo foi processado, agora você tem estados como parte disso, onde diz que se você enviar uma solicitação específica, você envia outra muito rapidamente e (se) acontecer ao mesmo tempo, há é um estado chamado em andamento que será definido para a primeira solicitação. Na verdade, você receberá um erro que diz: ‘Já existe uma solicitação em andamento que já está acontecendo.’ Então, isso removerá essa solicitação duplicada.”
A tabela DynamoDB armazenará o estado e o nome da função como parte da chave de idempotência, a chave hash, disse ela. Isso é bom porque facilita a depuração, acrescentou ela.
“Você pode ver quais funções específicas e quais teclas específicas estão possivelmente causando problemas”, disse ela.
Finalmente, os desenvolvedores podem definir períodos de expiração para registros de idempotência.
“Se você tiver uma escala muito maior, poderá configurá-la para ser um pouco mais rápida ou, dependendo de quanto tempo precisar desses registros, poderá configurá-la para um pouco mais”, disse ela. “Isso é muito importante, porque como você pode imaginar, quanto mais solicitações você receber, maior será o armazenamento persistente, você continuará armazenando e armazenando e armazenando todas essas chaves, todos os resultados de essas possíveis solicitações. Portanto, isso é algo que ajuda a reduzir o inchaço desse armazenamento persistente.”
Há também uma IdempotentAPI que é uma ferramenta .NET, disse ela. Finalmente, a Cisco oferece alguns produtos de API que podem lidar com solicitações idempotentes, acrescentou ela.
Tacke apontou ao público do InfoBip Shift a documentação da API do Stripe, que explica melhor a construção de um aplicativo com idempotência.
A postagem Como impedir pedidos duplicados em aplicativos da Web apareceu pela primeira vez no The New Stack.