O framework de código aberto para aplicativos combina elementos modulares para Kubernetes e oferece suporte a padrões tradicionais de design de aplicativos distribuídos, com novas atualizações a caminho.

Dapr, um sistema de tempo de execução para aplicativos distribuídos, está prestes a sair do programa de incubação da Cloud Native Computing Foundation. As atualizações frequentes trouxeram melhorias para os recursos existentes e adicionaram novas funcionalidades. Isso resultou em uma plataforma robusta para desenvolver e executar aplicativos nativos em nuvem, que podem ser construídos em cima do Kubernetes ou como um binário independente.
A escolha de hospedagem própria possibilita a integração de dispositivos IoT e outros em seus aplicativos, permitindo o acesso direto a eles por meio do código. Isso se conecta a ferramentas que permitem adicionar estado às aplicações sem a necessidade de desenvolver ferramentas próprias para gerenciar o estado fora de um aplicativo Kubernetes.
Outra vantagem interessante da Dapr é o suporte ao desenvolvimento baseado em mensagens, seguindo o tradicional padrão de design ator/mensagem com recursos que garantem a confiabilidade das mensagens e oferecem opções de modelos de consistência. Isso se fundamenta na experiência da plataforma em design de sistemas distribuídos, com profissionais experientes trazendo sua bagagem de anos de atuação, incluindo contribuições no desenvolvimento da plataforma de ator virtual da Microsoft Orleans.
A Microsoft ainda é uma importante colaboradora do projeto, porém surgiram empresas mais recentes que estão direcionando seus esforços para o Dapr. Um exemplo é a Diagrid, estabelecida no final de 2022 por Mark Fussell e Yaron Schneider, antigos engenheiros da Microsoft com vasta experiência em sistemas distribuídos. Fussell, que contribuiu para o Azure Service Fabric, e Schneider, envolvido no KEDA e no Azure Container Apps, são os cofundadores do projeto Dapr.
As ferramentas Diagrid ampliam as funcionalidades da plataforma de código aberto Dapr. A Catalyst disponibiliza interfaces de programação que facilitam a criação de mensagens e aplicativos orientados por fluxos de trabalho, enquanto o Conductor oferece recursos de gerenciamento automatizado e uma interface para visualização dos aplicativos desenvolvidos. A Catalyst está em fase de pré-visualização, e uma versão gratuita do Conductor está disponível para auxiliar no desenvolvimento de aplicações utilizando Dapr.
Quais são as novidades em Dapr?
Conversei com Mark Fussell a respeito da futura edição 1.14 do Dapr e da ideologia que fundamenta essa ferramenta. Segundo ele, o objetivo do Dapr é aprimorar a forma como os aplicativos nativos em nuvem são desenvolvidos, reconhecendo que, essencialmente, estes são aplicativos distribuídos. Ele destaca que o Dapr auxilia os desenvolvedores ao fornecer arquiteturas de software e padrões de codificação, evitando que precisem criá-los do zero.
Esse é um aspecto relevante, pois possibilita a utilização de modelos arquitetônicos consolidados, como atores e processos de trabalho. Segundo Fussell, os processos de trabalho são essenciais, pois podem estabelecer uma execução consistente e possibilitam a criação de um conjunto organizado de outras tarefas. Ao termos uma forma de gerenciar e sincronizar os serviços em um conjunto de microsserviços, podemos considerar como esses serviços são combinados em um aplicativo e como interagem entre si e com os nossos dados.
Eu já examinei Dapr em um estágio inicial de lançamento, e os princípios básicos permanecem inalterados. A plataforma continua oferecendo um conjunto de componentes para ambiente Kubernetes, permitindo a criação de microsserviços baseados em eventos em diversos idiomas e modelos de serviço. Também oferece integração com plataformas de armazenamento conhecidas, como o Redis, para gerenciamento de estado em aplicações distribuídas, garantindo modelos de consistência fortes e eventuais, além de opções de primeira ou última gravação.
Dapr é implantado como uma ferramenta de linha de comando (CLI), com o comando dapr init sendo utilizado para iniciar um conjunto de contêineres que configuram o ambiente para ser compatível com Dapr. Após a instalação, é possível iniciar a interação com a API Dapr por meio dos protocolos http ou gRPC. A equipe disponibiliza uma variedade de exemplos de aplicativos que ilustram o uso de recursos essenciais, como a configuração de um sistema de mensagens pub/sub.
Estamos próximos do lançamento do Dapr 1.14, que traz algumas novas funcionalidades para melhorar o desempenho das APIs já existentes. Isso nos prepara para o lançamento da versão 1.15 do Dapr mais adiante neste ano, que incluirá mais APIs e recursos para facilitar o desenvolvimento de aplicativos multi-nuvem.
Incluir a programação de tarefas no Kubernetes utilizando a interface de programação de empregos do Dapr.
O recurso mais destacado em 1.14 é a API de Empregos da Dapr, que amplia as funcionalidades da plataforma ao atuar como um gerenciador de atores e fornecer uma plataforma para processamento de lotes e operações automatizadas.
A API Dapr Jobs é um componente que se assemelha a um programador, responsável por garantir a execução de uma determinada tarefa. Essa garantia se aplica a pelo menos uma execução e utiliza as capacidades de escalabilidade do Kubernetes para garantir o funcionamento. Além disso, a API oferece suporte ao modo auto-apresentado da Dapr. A execução do trabalho não ocorrerá antes do horário programado, mas pode falhar se solicitada após esse período, pois não há garantia de execução além desse tempo. As informações sobre o cronograma de trabalho são armazenadas no banco de dados etcd especificamente designado para o programador, separado de outras informações do Dapr.
O desenvolvedor desempenha um papel fundamental em um contexto mais amplo, sendo essencial para otimizar o desempenho e a escalabilidade da ferramenta de fluxo de trabalho Dapr. Em aplicações distribuídas, os fluxos de trabalho precisam se expandir para suportar um grande volume de execuções simultâneas. Por esse motivo, foi criado o suporte de Jobs. De acordo com Fussell, “Havia uma demanda significativa para que as pessoas começassem a trabalhar como cron.” Embora o Kubernetes ofereça algumas funcionalidades básicas, estas são muito técnicas e não tão acessíveis aos desenvolvedores.
Você tem a possibilidade de utilizar a API Jobs para além dos serviços de aplicativos, pois é capaz de realizar diversas atividades relacionadas à engenharia de plataforma, atualizações, manutenção de código e operações regulares de aplicativos. Uma atividade comum de aplicação seria a atualização do banco de dados com os dados mais recentes, executando uma operação ETL nos dados dos sistemas de negócios. É viável programar as tarefas para um horário específico, como a integração de um trabalho cron no aplicativo, ou após uma determinada duração, como por exemplo, realizar uma limpeza após a conclusão de uma atividade de aplicação.
Outra possibilidade de utilizar os recursos do Dapr é migrar funções de aplicativos já existentes para um ambiente nativo em nuvem distribuído. Por exemplo, se você costuma armazenar relatórios financeiros para processamento durante a noite, é viável aplicar esse mesmo método ao seu código atualizado, aproveitando as facilidades de escalabilidade oferecidas.
A capacidade de dimensionamento é essencial. É possível empregar um agendamento de tarefas para realizar a mesma atividade em múltiplas cópias, o que possibilita a criação de uma simulação de Monte Carlo e a execução simultânea de diversas variantes para obter resultados de forma ágil.
Essa é, possivelmente, a principal vantagem da Dapr, já que possibilita a integração de diversas aplicações empresariais em ambientes de nuvem nativa, utilizando sua capacidade de orquestração para automatizar a gestão de recursos.
Além de um sidecar
Outra nova funcionalidade útil é o Dapr Shared. Essa opção oferece uma maneira alternativa de utilizar o Dapr com o Kubernetes, permitindo a instalação como um daemonset ou como uma implantação. Embora a prática de trabalhar com um sidecar permaneça como padrão, em certos cenários, como em aplicações sem servidor, pode ser desejável usar as APIs do Dapr sem a sobrecarga de injetar um sidecar a cada inicialização de um contêiner, o que pode resultar em atrasos significativos. Ao mesmo tempo, pode ser necessário manter as APIs e os serviços de mensagens do Dapr em execução mesmo quando um serviço é dimensionado para zero.
Ao utilizar um daemonset, uma instância do Dapr é executada em conjunto com as cargas de trabalho. Sempre que um novo exemplo do aplicativo é implantado no Kubernetes, uma nova instância do daemon Dapr também é implantada para garantir que as APIs do Dapr estejam sempre acessíveis com a menor latência possível. No entanto, essa abordagem consome mais recursos do sistema do que simplesmente usar um sidecar.
Caso haja limitações de recursos, é possível empregar a Dapr como uma implementação no Kubernetes, instalando uma instância do tempo de execução Dapr por cluster. Neste caso, o orquestrador Kubernetes será responsável por selecionar o nó para a execução do Dapr, o que pode resultar em latências de rede entre as cargas de trabalho e as APIs. Portanto, pode ser necessário reavaliar a forma como o seu aplicativo processa mensagens e o modelo de consistência adotado.
A maioria das atualizações na versão 1.14 do Dapr são melhorias em recursos já existentes, como desempenho e segurança, que, juntamente com mudanças significativas, visam facilitar a criação e implementação de aplicações Dapr em diferentes ambientes de nuvem e ferramentas de desenvolvimento. Dentre os diversos SDKs disponíveis, a implementação .Net oferece um conjunto completo de recursos, incluindo suporte para ferramentas de fluxo de trabalho de Actors e Dapr. Para aqueles que preferem Python, Go, JavaScript ou mesmo Java, existem versões estáveis dos SDKs disponíveis; enquanto as versões de C++ e Rust estão em fase de desenvolvimento.