O blog da AWS

Como iFood se beneficiou da arquitetura orientada a eventos para modernizar seu middleware financeiro

Por Ricardo Marques, Senior Solution Architect, DNB – LATAM
e Abbas Zahid, Senior Cloud Application Architect

 

Neste blog post, iremos apresentar como a área de finanças do iFood se beneficiou da arquitetura orientada a eventos para decompor uma aplicação monolítica, aumento a velocidade no desenvolvimento de novas funcionalidades, além da resiliência e performance de seu midware financeiro.O departamento de finanças do iFood possui uma plataforma chamada Digital By You (DBY) que ajuda os foodlovers (colaboradores iFood) a simplificar os processos financeiros e a facilitar a tomada de decisões. Com uma base de aproximadamente 100 mil usuários essa plataforma impulsiona uma robusto conjunto de funcionalidades, incluindo geração de requisições, integração com ERP para processamento de requisições de compras (PRs), ordens de compras (POs), portal de acesso para fornecedores e um chatbot.O Time de finanças tinha planos de expansão da platforma, como integração com novas unidades de negócio e integração com outras plataformas financeiras. Além dos planos de expansão o DBY, já vinham recebendo um aumento de demanda além da constante necessidade de inclusão de novas funcionalidades.Como inicialmente a plataforma havia sido construída com uma arquitetura monolítica, seus componentes eram fortemente acoplados o que fazia aumentar a taxa de falhas, bem como o MTTR (Mean Time To Recover). Esse forte acomplamento também levava a uma maior perda de performance nas fases de desenvolvimento e suporte, fazendo os times de suporte terem muita dificuldade em identificar e resolver bugs em produção de forma tempestiva.O iFood enxergou a necessidade de modernizar a plataforma DBY, de uma maneira onde fosse mais simples fazer a expansão da plataforma com a inclusão de novas funcionalidades além de aumentar sua resiliência, performance e escalabilidade.

Figura 1 – Arquitetura monolítica com forte acoplamento

Solução proposta

Para endereçar os problemas acima, o iFood contou com o apoio de um time da AWS chamado Professional Services, que fazendo um trabalho de working backwards pode entender as reais necessidades do time de finanças e direcionar qual deveria ser o caminho a seguir. O working backwards é um método de trabalho AWS, que visa entender as reais necessidades do cliente e desenhar uma solução que atenda especificamente suas necessidades.

Após esse trabalho, iFood e AWS entenderam que para poder endereçar os problemas da plataforma seria necessário uma mudança de paradigma, saindo da arquitetura monolítca para uma arquitetura de microsserviços orientada a eventos, também conhecida como Event Driven Architecture.

A primeira etapa foi a execução de workshops imersivos e Event Stormings, para juntos os times de engenharia e produtos construirem o DDD (Domain Driven Design) da plataforma. O objetivo era alinhar todos os stakeholders garantindo um fluxo de comunicação único través de uma linguagem ubíqua. Mergulhando fundo foi possivel descobrir a essência de cada domínio de negócio e com isso definir precisos Bounded Contexts. Durante esses workshops também foi possível identificar processos de negócios críticos, entidades, agregações e mapear todo fluxo de eventos para melhorar a comunicação e colaboração entre os times.

Com os insights descobertos nas sessões de Event Storm, foi possivel identificar três domínios de negócios principais dentro do monólito existente. Uma vez esses domínios identificados, foi tomada a decisão de decompor o monólito em três microsserviços distintos:

  1. Gerenciamento de Dados Mestre
  2. Provisão
  3. Requisição

Cada serviço com a responsabilidade única sobre seu domínio de negócio, comunicando-se entre si através de uma arquitetura orientada a eventos.

Além dos microsserviços acima, foi levantada a necessidade da criação de uma camada adicional na arquitetura, um BFF (Bakend for Frontend), que ficou responsável por fazer a interface com o mundo legado, agregando dados de multiplos microsserviços para apresentar de forma unificada para os consumidores das APIs, além de transformar as requisições síncronas em assíncronas.

Para hablitar essa nova forma de comunição entre o BFF e os microsserviços adotamos o Amazon EventBridge como barramento de eventos. Com sua simplificidade, escalabilidade, alta disponibilidade e resiliência se tornou a peça principal na estrutura de comunicação. Conectando os microsserviços no EventBridge nós podemos criar uma coreografia entre os microsserviços de forma simples, enviando eventos de um domínio para outro, abstraindo produtores de consumidores e dando autonomia para os domínios.

Para assegurar completa autonomia e escalabilidade para cada microsserviço, também decidiu-se por decompor o banco de dados, dessa forma cada microsserviço terá seu próprio banco de dados. Essa abordagem, além de evitar que ocorram gargalos quando muitos serviços acessam um mesmo banco de dados, também garante com que cada microsserviço possa escalar de forma independente e possa ser gerido e evoluído por um time de forma autônoma.

A transição de uma arquitetura monolítica para uma uma arquitetura de microsserviços orientada a eventos traz inúmeras vantagens, diminuir o acoplamento dinâmico, consequentemente aumentando a resiliência, aumenta de performance com uso de comunicação assíncrona, cada microsserviço pode escalar independentemente de acordo com sua capacidade, em caso de falha os outros serviços não são impactados e também melhora manutenibilidade permitindo que cada microsserviço seja evoluido e implantando de forma independente e mais rápido.

Figura 2 – Nova arquitetura DBY orientada a eventos

Amazon EventBridge como principal barramento de eventos

Vamos separar um momento para explorar os benefícios do Amazon EventBrigde e entender o motivo pelo qual foi escolhido para ser o principal barramento de eventos do DBY.

Primeiro e principal ponto, precisávamos de um barramento de eventos que fosse capaz de filtrar e rotear eventos de forma performática, além disso, o EventBridge é um serviço serverless regionalizado com alta disponibilidade nativa, escalável e que consegue atender a alto número de requisições por segundo à uma latência muito baixa.

Segundo, seu modelo de cobrança é pay-as-you-go, ou seja, você paga apenas pelos eventos enviados, o que permite optmizar os custos uma vez que não é necessário pagar por recursos inativos

O EventBridge possui as features abaixo que agregam ainda mais valor:

Rules and Targets: EventBridge permite que você defina regras baseados em padrões, essas regras podem ser aplicadas a qualquer campo do evento de forma que cada evento é filtrado e direcionado para diferentes destinos de forma individual, desacoplando os produtores dos consumidores.

CloudWatch Integration: Possibilita que todos os eventos sejam logados de forma integral, hablitando monitoramento ativo e um throubleshooting eficiente.

EventBridge Pipes: Com Pipes você pode consumir eventos diretamente de serviços como SQS, DynamoDB, Kinesis e Kafka, de forma No-Code. Também permite que você filtre e transforme os eventos antes de entrega-los ao destino.

Archive e Replay: Com Archive você pode transformar o EventBridge em um Event Store, armazenando todos os eventos que passarem pelo barramento, ou criando filtros para armazenar um determinado padrão de evento. Com o replay, você consegue reprocessar todos os eventos que foram armazenados, com regras específicas de replay, permitindo com que você possa reprocessar eventos em casos de falhas, incidentes ou até mesmo uma necessidade pontual de negócio.

Um exemplo de uso do EventBridge na nova plataforma do DBY é o caso de uso onde o frontend faz uma consulta de uma lista de materiais para o microsserviço de provisões. Veja a sequência de execução transformando uma requisição síncrona em assíncrona e depois retornando a requisição inicial de forma síncrona:

  1. O frontend faz faz um resquest síncrono para o BFF
  2. O BFF envia um evento assíncrono para o EventBridge:
    {    "eventType": "MaterialListRequested",    "companyCode": "12",    "functionalArea": "34}
  3. O EventBridge roteia o evento para o backend responsável de acordo com o campo eventType
  4. O bakcend processa a requisição de forma assíncrona
  5. O BFF faz polling no backend para obter a resposta atualizada
  6. O BFF retorna a requisicao síncrona inicial para o frontend

Importante relembrar que a nova plataforma do DBY precisava manter a compatibilidade com outros sistemas legados, por isso foi feita a inclusão da camada de BFF para fazer a troca de requisições síncronas para assíncronas e vice versa.

Figura 3 – Digrama de sequência do fluxo de requisião para o microsserviço de provisão

Estratégia de migração e implantação

Para se evitar downtime e perda de integridade nos dados, optou-se por fazer uma migração de dados do monólito para a nova plataforma do DBY de uma vez só durante uma janela de migração onde a plataforma não está em uso. Para se decidir sobre a forma de migração foram considerados fatores como horários de utilizaçao da plataforma, quantidade de dados a serem migrados e tecnologia do banco de dados antes e depois da migração.

No caso da plataforma DBY, existia uma janela de manutenção onde a plataforma não era acessada e a quantidade de dados a ser migrada caberia dentro dessa janela. Outro fator importante é que a tecnologia de banco de dados utilizada pelo monólito e pela nova plataforma era a mesma, em ambas estava sendo utlizado Postgres, sendo assim não foi necessário fazer uma conversão de esquemas, apenas a divisão dos dados de um único banco de dados, em alguns bancos de dados separados por microsserviço.

Para estratégia de implantação foi escolhia a Canary. Essa estratégia permite que seja liberada a nova versão da plataforma para uma pequena porcentagem de usuários, de forma que podemos acompanhar e identificar rapaidamente caso algum problema ocorra, possibilitando também uma rápida ação de rollback. Após um determinado periodo de tempo não havendo qualquer incidente, completamos a implantação levando 100% da nova versão para o ambiente produtivo. Importante frisar que para se ter uma estratégia de implantação Canary, é necessário haver um processo de CI/CD bem estruturado e automatizado, onde se estabeleça métricas para medir o sucesso da implantação bem como, ações automatizadas para conclusão ou rollback.

Com as estratégias de migração de dados e de implantação com Canary, pudemos garantir uma segura troca de versão da plataforma, saindo do monólito para a arquitetura em microsserviços orientada a eventos.

Benefícios obtidos pelo iFood

A modernização da plataforma decompondo o monólito em microsserviços usando uma arquitetura orientada a eventos entregrou benefícios significativos ao time da finanças do iFood. Anteriormente eles possuiam dificuldades para disponibilizar novas funcionalidades rapidamente, prejudicando o time-to-market. Após a migração, o tempo de desenvolvimento de novas funcionalidades caiu de 1 mês para 1 semana. Com a distribuição dos microsserviços por domínios, os times tiveram mais autonomia e velocidade, podendo desenvolver seu microsserviço sem ter a preocupação com outras partes da plataforma.

A transição para requisições assíncronas permitiu aos times melhorar a experiencia do usuario final. Com a eliminação de muitas chamadas síncronas que aumentavam o acoplamento dinâmico entre os componentes, precebeu-se uma melhora significativa na performance e na resiliência. Falhas em um determinado serviços não impactam mais os outros serviços, permitindo uma experiencia inenterrupta para o cliente final. Adicionalmente, a adoção do EventBridge permitiu a inclusão de novas capacidades facilmente, como uso de DLQs (Dead Letter Queue) e políticas de retentativa garantindo que nenhum evento seja perdido caso algum microsserviço esteja inoperante.

Importante lembrar que o uso do domain driven design teve grande contribuição para se identificar de forma eficiente quais são os domínios de negócio, dando a eles autonomia. Com limites entre domínios bem definidos os times podem agora trabalhar de forma independente, focando nas suas áreas de conhecimento específicas.

Baseado em dados obtidos após a implementação da nova arquitetura, percebeu-se um aumento na disponibilidade da paltaforma em 30%, redução no MTTR (mean time to recover) de 90% e diminuição no tempo de entrega de novas funcionalidades de 50%.

Conclusão

A jornada de modernização é uma jornada contínua e os times do iFood contam com o poder dos serviços da AWS, bem como uso de boas práticas para continuar a otimizar duas aplicações. Abraçando a inovação e adotando modernas abordagens de arquitetura estarão bem equipados para atender a crescente demanda e se adaptarem às futuras necessidades de negócio. A modernização da plataforma DBY é um exemplo da importancia de se abrir a mudanças se beneficiando de serviços que facilitam e aceleram a implementação de soluções modernas e robustas.

 


Sobre os autores

Ricardo Marques é Senior Solutions Architect na AWS, com mais de 15 anos de experiência em desenvolvimento de software, arquiteturas de soluções escaláveis, cloud native, orientação a eventos e. Ele trabalha apoiando clientes nativos digitais, ajudando-os em sua jornada para a nuvem. Também é professor em MBA de arquiteturas cloud.

https://www.linkedin.com/in/ricardo-marques-45846425

 

 

 

 

Abbas Zahid é um arquiteto sênior de aplicações na AWS, com mais de 11 anos de experiência na indústria de cloud. Ao longo de sua carreira, ele se concentrou no desenvolvimento e na arquitetura de aplicações nativas da cloud em diferentes plataformas de cloud, entregando produtos seguros, escaláveis e resilientes. Atualmente ajuda clientes a modernizar suas aplicações usando vários estilos arquitetônicos e aproveitando os benefícios de cloud disponíveis na AWS.

https://www.linkedin.com/in/abbas-zahid-50b50a50