Recentemente, a AWS trouxe uma novidade que promete agitar o cenário de desenvolvimento de aplicações serverless: as Funções Duráveis para Lambda. Essa nova capacidade permite que desenvolvedores criem aplicações complexas e de múltiplos passos utilizando funções Lambda padrão, sem a necissidade de depender de orquestrações mais complicadas, como as que são feitas com o AWS Step Functions. Mas o que isso realmente significa para nós, arquitetos de software?

Introdução

A ideia por trás das Funções Duráveis é bastante simples, mas poderosa. Elas permitem que os desenvolvedores expressem a lógica de aplicações stateful diretamente no código das funções, sem a necessidade de abstrair a máquina de estados. Isso não só simplifica o desenvolvimento, mas também reduz custos operacionais, já que a execução pode ser suspensa por até um ano em pontos definidos, sem incorrer em taxas de computação ociosas.

Entendendo as Funções Duráveis

O grande trunfo das Funções Duráveis reside em duas primitivas fundamentais: context.step() e context.wait(). A primeira permite que você adicione tentativas automáticas e checkpoints à sua lógica de negócios. Isso significa que, após a conclusão de um passo, ele não será reprocessado durante uma possível repetição. Por outro lado, o método context.wait() pausa a execução por um tempo determinado, liberando a função até que seja necessário retomar, sem cobrar por isso.

A implementação disso é bem simples e intuitiva, como podemos ver no exemplo a seguir:

import { DurableContext, withDurableExecution } from "@aws/durable-execution-sdk-js";
export const handler = withDurableExecution(
  async (event: any, context: DurableContext) => {
    const { orderId, amount, items } = event;
    // Reserva de inventário
    const inventory = await context.step("reserve-inventory", async () => {
      return await inventoryService.reserve(items);
    });
    // Processamento de pagamento
    const payment = await context.step("process-payment", async () => {
      return await paymentService.charge(amount);
    });
    // Criação de envio
    const shipment = await context.step("create-shipment", async () => {
      return await shippingService.createShipment(orderId, inventory);
    });
    return { orderId, status: 'completed', shipment };
  }
);

Dicas Avançadas para Utilização

Agora, vamos além do básico. Aqui estão algumas dicas que podem te ajudar a tirar o máximo proveito das Funções Duráveis:

Conclusão

As Funções Duráveis da AWS são um passo significativo na evolução das aplicações serverless. Elas não só simplificam a lógica de negócios, mas também permitem que os desenvolvedores se concentrem mais no que realmente importa: a entrega de valor ao usuário final. No entanto, é essencial refletir sobre quando usar essa abordagem em vez de soluções mais tradicionais, como o AWS Step Functions. Afinal, nem toda situação exige a complexidade de um orquestrador, mas ter essa opção à mão pode ser um divisor de águas.

Por fim, vale a pena lembrar que, apesar das vantagens, cada projeto tem suas particularidades. Portanto, uma análise cuidadosa das demandas é fundamental para decidir o melhor caminho a seguir. O futuro da orquestração de aplicativos está aqui, e é hora de aproveitá-lo!