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:
- Teste suas funções localmente: Use ferramentas como o AWS SAM para emular o ambiente Lambda e testar as funções duráveis antes de implantar.
- Utilize callbacks: O método create_callback() pode ser uma mão na roda para aguardar respostas de APIs externas ou aprovações humanas, evitando travamentos indesejados.
- Condicionalmente aguarde: Com o wait_for_condition(), é possível pausar a execução até que uma condição específica seja atendida, como a conclusão de um processo que está sendo monitorado.
- Explore concorrência: Use as funções parallel() e map() para tratar múltiplas tarefas em paralelo., aumentando a eficiência do seu workflow.
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!