SlideShare uma empresa Scribd logo
Lucas Cavalcanti

@lucascs
Arquitetura
Funcional em
Microservices
4 anos depois
4 anos atrás: Era tudo mato
Contexto inicial
-5 engenheiros
-Greenfield: Datomic, Clojure, Kafka
-Ninguém sabia programar em Clojure antes de entrar
-Nenhum guideline consolidado de arquitetura em
Clojure ou Funcional
Escolhas
-Ir o mais rápido possível, colocar no ar, testar, e se
der certo refatorar pra ficar direito, pivotar se não
OU
-Investir na infraestrutura de entrega contínua e já
começar com tudo automatizado, usando as
melhores práticas
Monolito ou Microservices?
Porquê?
-auth, accounts, customers, acquisition, geo
-requisitos de dados/acesso muito diferentes
-Negócio complexo, poder alterar pequenas partes
-grande carga de automação, grande carga de código
de infraestrutura
Continuous Delivery
Pré requisitos
-Automação de build até prod
-Automação de infraestrutura AWS
-Bateria de Testes (unit, integration, e2e)
-CI Server (TW Go)
-Zero downtime deploy (Blue-Green deployment)
-Deploy pra prod automático/um clique
>1000 pessoas!
>140 na engenharia
>150 serviços Clojure
> 30 times
> 4 anos de idade
> 3 Mi clientes
> 15 Mi pedidos
É mais fácil adicionar código hoje do
que era há 3 anos!
SÃO PAULO, BRASIL
Agenda
Imutabilidade
Funções Puras
Schemas
Componentes
Ports and Adapters - Arquitetura hexagonal
Microserviços
SÃO PAULO, BRASIL
Imutabilidade
SOUTHEAST BRAZIL REGION FROM SPACE
Imutabilidade
Definição
“Se eu recebo um valor, é garantido que ele nunca vai mudar”
Tecnologias escolhidas
Imutabilidade
Clojure
Imutabilidade
Todas as estruturas de dados padrão são imutáveis:
-Maps, Lists, Sets
-Records
Mutabilidade é explícita:
-atoms/refs: @
-dynamic vars: *…*
-chamadas java: .nomeDoMetodo
-funções com side effect: funcao!
Datomic
Imutabilidade
Datomic guarda as mudanças/transações, não só os
dados
-parecido com o Git
-append only
-db como valor
-tudo é salvo no banco como dados (transações,
schemas, entidades)
Kafka
Immutabilidade
Filas e tópicos persistentes
-cada consumer tem um offset da sua última
mensagem
-possibilidade de fazer replay de mensagens
AWS + Docker
Immutabilidade
-Cada build gera uma imagem Docker
-Cada deploy sobe uma nova máquina com a nova
versão.
-Assim que a nova máquina está saudável, a máquina
antiga é morta. (blue-green deployment)
-Mudanças de arquitetura geral são feitas criando
uma nova stack de todos os serviços, e depois
fazendo a troca do DNS
Funções Puras
SOUTHEAST BRAZIL REGION FROM SPACE
Funções puras
Definição
“Dadas as mesmas entradas, sempre será produzida a mesma
saída”
Simplicidade
Funções Puras
-mais fácil de entender o que acontece, só é necessário
olhar pras entradas
-mais fácil de testar, não precisa de mocks/preparação de
contexto.
-paralelizável por padrão, sem necessidade de locks, sem
preocupação de ter race conditions
Testes generativos
Funções Puras
-para lógicas mais complexas é difícil cobrir todos os casos
com testes unitários
-gera entradas aleatórias, de acordo com os seus schemas
-verifica uma propriedade da saída
Funções impuras
Funções puras
-as funções que produzem efeitos colaterais devem ser
marcadas como tal. Nós usamos `!` no final do nome das
funções.
-separamos o código que trata e transforma os dados do
código que trata dos efeitos colaterais
-devem ser movidas para as bordas do fluxo, sempre que
possível
Componentes
SOUTHEAST BRAZIL REGION FROM SPACE
Bibliotecas compartilhadas
Componentes
-em geral a comunicação do serviço com o mundo exterior,
via http, kafka, banco de dados, arquivos, etc
-protocolos/interfaces que podem ter múltiplas
implementações, por exemplo mocks para testes
Padronização
Componentes
-mais fácil controlar a comunicação entre os serviços
-monitoramento e logging padronizados
-caixa de ferramentas que facilitam o desenvolvimento
Dependências
Componentes
-sabem responder a mudanças de ambientes
-no startup do serviço eles são construídos e configurados,
de acordo com suas dependências
-estão disponíveis nas pontas do sistema, e são passados
pras funções como argumentos
-As dependências dos fluxos ficam explícitas
Schemas
SOUTHEAST BRAZIL REGION FROM SPACE
Tolerant Readers
Schemas
"Be conservative in what you do, be liberal in what you accept
from others" -- Postel's Law
https://en.wikipedia.org/wiki/Jon_Postel#Postel.27s_Law
Tolerant Readers
Schemas
-produtores de um schema declaram e validam o schema
estrito da mensagem produzida.
-consumidores de um schema declaram e validam só os
campos do schema relevantes para o seu uso, ignorando os
outros campos.
Formatos de comunicação: wire schemas
Schemas
-Wire schemas são como você expõe os dados para outros
serviços/clientes
-esses schemas podem ter campos diferentes dos dados das
entidades, assim conseguimos evoluir as entidades sem
quebrar os clientes
-necessitam de uma camada de adaptação/conversão
-wire schemas são sempre declarados e validados nas
entradas/saídas do serviço
Testes de comunicação
Schemas
-como os schemas estão declarados nas pontas, temos uma
bateria de testes que gera dados aleatórios de acordo com
o schema de saída e valida contra o schema de entrada
-assim a gente garante que a comunicação entre dois
serviços é compatível
-pega bugs de quebras de compatibilidade antes de ir pra
produção
Ports and Adapters
(a.k.a Arquitetura Hexagonal)
SOUTHEAST BRAZIL REGION FROM SPACE
Ports and Adapters
Definição
A lógica principal é independente de onde ela foi executada
(amarelo)
Uma porta é uma das entradas/saídas da aplicação (azul)
Um adaptador é a ponte entre a porta e a lógica principal
(vermelho)
http://www.dossier-andreas.net/software_architecture/ports_and_adapters.html
http://alistair.cockburn.us/Hexagonal+architecture
Ports and Adapters (versão Nubank)
Definição estendida
Lógica de negócios pura (verde)
Controller, que liga os fluxos entre as portas (amarelo)
Uma porta é uma das entradas/saídas da aplicação (azul)
Um adaptador é a ponte entre a porta e a lógica principal
(vermelho)
Portas (Componentes)
Ports and Adapters
-Portas são inicializadas junto
com o serviço
-Cada porta tem seu respectivo
componente
-Serializa os dados para algum
formato de transporte (ex.
JSON, Transit, XML)
-Em geral vem de uma biblioteca
compartilhada entre todos os
serviços
-Testada via testes de
integração, ponta a ponta
HTTP
Kafka
Datomic
File Storage
Metrics
E-mail
Adaptadores (Diplomat)
Ports and Adapters
-Adaptadores são os
conectores das portas
-Contém as funções que
tratam as chamadas HTTP,
mensagens do Kafka, etc
-Adaptam o wire schema para
o schema interno
-Chamam e são chamados
pelas funções controllers
- Testada com versões falsas
dos componentes, ou mocks
HTTP
Kafka
Datomic
File Storage
Metrics
E-mail
Controllers
Ports and Adapters
-Controllers ligam os fluxos
entre as entradas e os seus
side-effects
-Só lidam com schemas
internos
-Delegam a lógica de negócio
para funções puras
-Compõem os resultados dos
efeitos colaterais
-Geralmente testado com
mocks ou via testes de
integração
HTTP
Kafka
Datomic
File Storage
Metrics
E-mail
Lógica de Negócio
Ports and Adapters
-Trata e transforma dados
imutáveis
-Funções puras
-Melhor lugar para checar
invariantes e regras de
negócio
-Pode ser testado com testes
generativos/propriedade
-Deveria ser a maior parte do
código da aplicação
-Testada com testes de
unidade ou generativos
HTTP
Kafka
Datomic
File Storage
Metrics
E-mail
Microserviços
Ports and Adapters
-Cada serviço segue mais ou
menos o mesmo design
-Os serviços se comunicam via
uma das portas (ex HTTP ou
Kafka)
-Serviços NÃO compartilham
bancos de dados
-HTTP responses contém
hipermídia, então podemos
substituir um serviço sem ter
que mudar os clientes mobile
-Testados com testes ponta a
ponta, com todos os serviços
Lições aprendidas
Microserviços
-homogeneidade
-scalability units / sharding
-anti corruption layer para lidar com terceiros
-property based testing pra lógicas complexas
Lições aprendidas
Microserviços
-tolerant readers vs central schemas
-e2e vs checar contratos
-na falta de documentação, testes de integração ajudam
Lições aprendidas
Microserviços
-squads cuidando de grupos de serviços
-documentação e onboarding cada vez mais importantes
-quebrar um serviço que ficou grande é bastante traumático,
mas necessário
-domínio mais complicado, serviços menores
-carga de automatização foi bem maior do que o esperado
-monitoração e tolerância a falhas
Resumo
Imutabilidade em todos os níveis
Lógicas de negócio em Funções Puras
Schemas validados na comunicação
Componentes compartilhados
Arquitetura hexagonal padronizada
Microserviços controlando o escopo
SÃO PAULO, BRASIL
sou.nu/vagasnu
Lucas Cavalcanti

@lucascs Obrigado!

Mais conteúdo relacionado

Mais procurados

Data Democratization at Nubank
 Data Democratization at Nubank Data Democratization at Nubank
Data Democratization at Nubank
Databricks
 

Mais procurados (20)

Autorização de transações no Nubank
Autorização de transações no NubankAutorização de transações no Nubank
Autorização de transações no Nubank
 
Microservices Architecture & Testing Strategies
Microservices Architecture & Testing StrategiesMicroservices Architecture & Testing Strategies
Microservices Architecture & Testing Strategies
 
CQRS: Command/Query Responsibility Segregation
CQRS: Command/Query Responsibility SegregationCQRS: Command/Query Responsibility Segregation
CQRS: Command/Query Responsibility Segregation
 
Event Driven Software Architecture Pattern
Event Driven Software Architecture PatternEvent Driven Software Architecture Pattern
Event Driven Software Architecture Pattern
 
Bizweb Microservices Architecture
Bizweb Microservices ArchitectureBizweb Microservices Architecture
Bizweb Microservices Architecture
 
Oracle Capability
Oracle CapabilityOracle Capability
Oracle Capability
 
Developer Experience no Nubank
Developer Experience no NubankDeveloper Experience no Nubank
Developer Experience no Nubank
 
IT Transformation with AWS
IT Transformation with AWSIT Transformation with AWS
IT Transformation with AWS
 
Understanding MicroSERVICE Architecture with Java & Spring Boot
Understanding MicroSERVICE Architecture with Java & Spring BootUnderstanding MicroSERVICE Architecture with Java & Spring Boot
Understanding MicroSERVICE Architecture with Java & Spring Boot
 
Microservice vs. Monolithic Architecture
Microservice vs. Monolithic ArchitectureMicroservice vs. Monolithic Architecture
Microservice vs. Monolithic Architecture
 
White Paper: Application Modernization
White Paper: Application Modernization  White Paper: Application Modernization
White Paper: Application Modernization
 
AWS SQS for better architecture
AWS SQS for better architectureAWS SQS for better architecture
AWS SQS for better architecture
 
Introduction to Event-Driven Architecture
Introduction to Event-Driven Architecture Introduction to Event-Driven Architecture
Introduction to Event-Driven Architecture
 
Communication in a Microservice Architecture
Communication in a Microservice ArchitectureCommunication in a Microservice Architecture
Communication in a Microservice Architecture
 
Event driven architecture
Event driven architectureEvent driven architecture
Event driven architecture
 
Batchable vs @future vs Queueable
Batchable vs @future vs QueueableBatchable vs @future vs Queueable
Batchable vs @future vs Queueable
 
Data Democratization at Nubank
 Data Democratization at Nubank Data Democratization at Nubank
Data Democratization at Nubank
 
Accelerate Your Digital Transformation Journey with Pimcore
Accelerate Your Digital Transformation Journey with PimcoreAccelerate Your Digital Transformation Journey with Pimcore
Accelerate Your Digital Transformation Journey with Pimcore
 
Microservices: Mais que uma arquitetura de software, uma filosofia de desenvo...
Microservices: Mais que uma arquitetura de software, uma filosofia de desenvo...Microservices: Mais que uma arquitetura de software, uma filosofia de desenvo...
Microservices: Mais que uma arquitetura de software, uma filosofia de desenvo...
 
Micro services vs Monolith Architecture
Micro services vs Monolith ArchitectureMicro services vs Monolith Architecture
Micro services vs Monolith Architecture
 

Semelhante a Arquitetura Funcional em Microservices

Replicacao Object Sistemas
Replicacao Object SistemasReplicacao Object Sistemas
Replicacao Object Sistemas
taniamaciel
 
Produtividade em integração de aplicações com apache camel tdc2012-são paulo-...
Produtividade em integração de aplicações com apache camel tdc2012-são paulo-...Produtividade em integração de aplicações com apache camel tdc2012-são paulo-...
Produtividade em integração de aplicações com apache camel tdc2012-são paulo-...
Adriano Tavares
 
Tdc 2013 eric lemes - integracoes entre sistemas-2
Tdc 2013   eric lemes - integracoes entre sistemas-2Tdc 2013   eric lemes - integracoes entre sistemas-2
Tdc 2013 eric lemes - integracoes entre sistemas-2
Eric Lemes
 
Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...
Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...
Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...
Ricardo Ferreira
 
Microservices, soa e o melhor das filas
Microservices, soa e o melhor das filasMicroservices, soa e o melhor das filas
Microservices, soa e o melhor das filas
Diego Pacheco
 

Semelhante a Arquitetura Funcional em Microservices (20)

Arquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depoisArquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depois
 
XML-RPC.pdf
XML-RPC.pdfXML-RPC.pdf
XML-RPC.pdf
 
ALM e Operações - Workshop - Como Diagnosticar um Incidente
ALM e Operações - Workshop - Como Diagnosticar um IncidenteALM e Operações - Workshop - Como Diagnosticar um Incidente
ALM e Operações - Workshop - Como Diagnosticar um Incidente
 
Replicacao Object Sistemas
Replicacao Object SistemasReplicacao Object Sistemas
Replicacao Object Sistemas
 
Comdad 5
Comdad 5Comdad 5
Comdad 5
 
Modelo osi
Modelo osiModelo osi
Modelo osi
 
Escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Escalando uma plataforma de e-mail transacional- aprendizado das trincheirasEscalando uma plataforma de e-mail transacional- aprendizado das trincheiras
Escalando uma plataforma de e-mail transacional- aprendizado das trincheiras
 
Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado da...
Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado da...Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado da...
Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado da...
 
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO, Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
 
Produtividade em Integração de Aplicações com Apache Camel
Produtividade em Integração de Aplicações com Apache CamelProdutividade em Integração de Aplicações com Apache Camel
Produtividade em Integração de Aplicações com Apache Camel
 
Produtividade em integração de aplicações com apache camel tdc2012-são paulo-...
Produtividade em integração de aplicações com apache camel tdc2012-são paulo-...Produtividade em integração de aplicações com apache camel tdc2012-são paulo-...
Produtividade em integração de aplicações com apache camel tdc2012-são paulo-...
 
Funcionalidades das versões 9.x do PostgreSQL
Funcionalidades das versões 9.x do PostgreSQLFuncionalidades das versões 9.x do PostgreSQL
Funcionalidades das versões 9.x do PostgreSQL
 
Testando aplicações DataSnap
Testando aplicações DataSnapTestando aplicações DataSnap
Testando aplicações DataSnap
 
Workshop soa, microservices e devops
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devops
 
Tdc 2013 eric lemes - integracoes entre sistemas-2
Tdc 2013   eric lemes - integracoes entre sistemas-2Tdc 2013   eric lemes - integracoes entre sistemas-2
Tdc 2013 eric lemes - integracoes entre sistemas-2
 
Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...
Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...
Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...
 
ODI SERIES - Melhores Práticas
ODI SERIES - Melhores PráticasODI SERIES - Melhores Práticas
ODI SERIES - Melhores Práticas
 
Modelos TCP/IP e OSI para CCNA
Modelos TCP/IP e OSI para CCNAModelos TCP/IP e OSI para CCNA
Modelos TCP/IP e OSI para CCNA
 
Microservices, soa e o melhor das filas
Microservices, soa e o melhor das filasMicroservices, soa e o melhor das filas
Microservices, soa e o melhor das filas
 
Automação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e MobileAutomação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e Mobile
 

Arquitetura Funcional em Microservices

  • 2.
  • 3.
  • 4. 4 anos atrás: Era tudo mato Contexto inicial -5 engenheiros -Greenfield: Datomic, Clojure, Kafka -Ninguém sabia programar em Clojure antes de entrar -Nenhum guideline consolidado de arquitetura em Clojure ou Funcional
  • 5. Escolhas -Ir o mais rápido possível, colocar no ar, testar, e se der certo refatorar pra ficar direito, pivotar se não OU -Investir na infraestrutura de entrega contínua e já começar com tudo automatizado, usando as melhores práticas
  • 6. Monolito ou Microservices? Porquê? -auth, accounts, customers, acquisition, geo -requisitos de dados/acesso muito diferentes -Negócio complexo, poder alterar pequenas partes -grande carga de automação, grande carga de código de infraestrutura
  • 7. Continuous Delivery Pré requisitos -Automação de build até prod -Automação de infraestrutura AWS -Bateria de Testes (unit, integration, e2e) -CI Server (TW Go) -Zero downtime deploy (Blue-Green deployment) -Deploy pra prod automático/um clique
  • 8. >1000 pessoas! >140 na engenharia >150 serviços Clojure > 30 times > 4 anos de idade > 3 Mi clientes > 15 Mi pedidos
  • 9. É mais fácil adicionar código hoje do que era há 3 anos! SÃO PAULO, BRASIL
  • 10. Agenda Imutabilidade Funções Puras Schemas Componentes Ports and Adapters - Arquitetura hexagonal Microserviços SÃO PAULO, BRASIL
  • 12. Imutabilidade Definição “Se eu recebo um valor, é garantido que ele nunca vai mudar”
  • 14. Clojure Imutabilidade Todas as estruturas de dados padrão são imutáveis: -Maps, Lists, Sets -Records Mutabilidade é explícita: -atoms/refs: @ -dynamic vars: *…* -chamadas java: .nomeDoMetodo -funções com side effect: funcao!
  • 15. Datomic Imutabilidade Datomic guarda as mudanças/transações, não só os dados -parecido com o Git -append only -db como valor -tudo é salvo no banco como dados (transações, schemas, entidades)
  • 16. Kafka Immutabilidade Filas e tópicos persistentes -cada consumer tem um offset da sua última mensagem -possibilidade de fazer replay de mensagens
  • 17. AWS + Docker Immutabilidade -Cada build gera uma imagem Docker -Cada deploy sobe uma nova máquina com a nova versão. -Assim que a nova máquina está saudável, a máquina antiga é morta. (blue-green deployment) -Mudanças de arquitetura geral são feitas criando uma nova stack de todos os serviços, e depois fazendo a troca do DNS
  • 18. Funções Puras SOUTHEAST BRAZIL REGION FROM SPACE
  • 19. Funções puras Definição “Dadas as mesmas entradas, sempre será produzida a mesma saída”
  • 20. Simplicidade Funções Puras -mais fácil de entender o que acontece, só é necessário olhar pras entradas -mais fácil de testar, não precisa de mocks/preparação de contexto. -paralelizável por padrão, sem necessidade de locks, sem preocupação de ter race conditions
  • 21. Testes generativos Funções Puras -para lógicas mais complexas é difícil cobrir todos os casos com testes unitários -gera entradas aleatórias, de acordo com os seus schemas -verifica uma propriedade da saída
  • 22. Funções impuras Funções puras -as funções que produzem efeitos colaterais devem ser marcadas como tal. Nós usamos `!` no final do nome das funções. -separamos o código que trata e transforma os dados do código que trata dos efeitos colaterais -devem ser movidas para as bordas do fluxo, sempre que possível
  • 24. Bibliotecas compartilhadas Componentes -em geral a comunicação do serviço com o mundo exterior, via http, kafka, banco de dados, arquivos, etc -protocolos/interfaces que podem ter múltiplas implementações, por exemplo mocks para testes
  • 25. Padronização Componentes -mais fácil controlar a comunicação entre os serviços -monitoramento e logging padronizados -caixa de ferramentas que facilitam o desenvolvimento
  • 26. Dependências Componentes -sabem responder a mudanças de ambientes -no startup do serviço eles são construídos e configurados, de acordo com suas dependências -estão disponíveis nas pontas do sistema, e são passados pras funções como argumentos -As dependências dos fluxos ficam explícitas
  • 28. Tolerant Readers Schemas "Be conservative in what you do, be liberal in what you accept from others" -- Postel's Law https://en.wikipedia.org/wiki/Jon_Postel#Postel.27s_Law
  • 29. Tolerant Readers Schemas -produtores de um schema declaram e validam o schema estrito da mensagem produzida. -consumidores de um schema declaram e validam só os campos do schema relevantes para o seu uso, ignorando os outros campos.
  • 30. Formatos de comunicação: wire schemas Schemas -Wire schemas são como você expõe os dados para outros serviços/clientes -esses schemas podem ter campos diferentes dos dados das entidades, assim conseguimos evoluir as entidades sem quebrar os clientes -necessitam de uma camada de adaptação/conversão -wire schemas são sempre declarados e validados nas entradas/saídas do serviço
  • 31. Testes de comunicação Schemas -como os schemas estão declarados nas pontas, temos uma bateria de testes que gera dados aleatórios de acordo com o schema de saída e valida contra o schema de entrada -assim a gente garante que a comunicação entre dois serviços é compatível -pega bugs de quebras de compatibilidade antes de ir pra produção
  • 32. Ports and Adapters (a.k.a Arquitetura Hexagonal) SOUTHEAST BRAZIL REGION FROM SPACE
  • 33. Ports and Adapters Definição A lógica principal é independente de onde ela foi executada (amarelo) Uma porta é uma das entradas/saídas da aplicação (azul) Um adaptador é a ponte entre a porta e a lógica principal (vermelho) http://www.dossier-andreas.net/software_architecture/ports_and_adapters.html http://alistair.cockburn.us/Hexagonal+architecture
  • 34. Ports and Adapters (versão Nubank) Definição estendida Lógica de negócios pura (verde) Controller, que liga os fluxos entre as portas (amarelo) Uma porta é uma das entradas/saídas da aplicação (azul) Um adaptador é a ponte entre a porta e a lógica principal (vermelho)
  • 35. Portas (Componentes) Ports and Adapters -Portas são inicializadas junto com o serviço -Cada porta tem seu respectivo componente -Serializa os dados para algum formato de transporte (ex. JSON, Transit, XML) -Em geral vem de uma biblioteca compartilhada entre todos os serviços -Testada via testes de integração, ponta a ponta HTTP Kafka Datomic File Storage Metrics E-mail
  • 36. Adaptadores (Diplomat) Ports and Adapters -Adaptadores são os conectores das portas -Contém as funções que tratam as chamadas HTTP, mensagens do Kafka, etc -Adaptam o wire schema para o schema interno -Chamam e são chamados pelas funções controllers - Testada com versões falsas dos componentes, ou mocks HTTP Kafka Datomic File Storage Metrics E-mail
  • 37. Controllers Ports and Adapters -Controllers ligam os fluxos entre as entradas e os seus side-effects -Só lidam com schemas internos -Delegam a lógica de negócio para funções puras -Compõem os resultados dos efeitos colaterais -Geralmente testado com mocks ou via testes de integração HTTP Kafka Datomic File Storage Metrics E-mail
  • 38. Lógica de Negócio Ports and Adapters -Trata e transforma dados imutáveis -Funções puras -Melhor lugar para checar invariantes e regras de negócio -Pode ser testado com testes generativos/propriedade -Deveria ser a maior parte do código da aplicação -Testada com testes de unidade ou generativos HTTP Kafka Datomic File Storage Metrics E-mail
  • 39. Microserviços Ports and Adapters -Cada serviço segue mais ou menos o mesmo design -Os serviços se comunicam via uma das portas (ex HTTP ou Kafka) -Serviços NÃO compartilham bancos de dados -HTTP responses contém hipermídia, então podemos substituir um serviço sem ter que mudar os clientes mobile -Testados com testes ponta a ponta, com todos os serviços
  • 40. Lições aprendidas Microserviços -homogeneidade -scalability units / sharding -anti corruption layer para lidar com terceiros -property based testing pra lógicas complexas
  • 41. Lições aprendidas Microserviços -tolerant readers vs central schemas -e2e vs checar contratos -na falta de documentação, testes de integração ajudam
  • 42. Lições aprendidas Microserviços -squads cuidando de grupos de serviços -documentação e onboarding cada vez mais importantes -quebrar um serviço que ficou grande é bastante traumático, mas necessário -domínio mais complicado, serviços menores -carga de automatização foi bem maior do que o esperado -monitoração e tolerância a falhas
  • 43. Resumo Imutabilidade em todos os níveis Lógicas de negócio em Funções Puras Schemas validados na comunicação Componentes compartilhados Arquitetura hexagonal padronizada Microserviços controlando o escopo SÃO PAULO, BRASIL