SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
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 para o ar o mais rápido possível, testar, e se der
certo refatorar pra ficar direito, pivotar se não
OU
Investir na infraestrutura de entrega contínua para
responder mais rápido a mudanças
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: @isso-muda
dynamic vars: *muda-por-thread*
chamadas java: .nomeDoMetodo
funções com side effect: faca-isso!
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, logging, tracing, segurança
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
“Seja conservador no que você faz, seja liberal no que você aceita
dos outros” -- 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
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
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!

Weitere ähnliche Inhalte

Was ist angesagt?

Dependency Injection in Apache Spark Applications
Dependency Injection in Apache Spark ApplicationsDependency Injection in Apache Spark Applications
Dependency Injection in Apache Spark ApplicationsDatabricks
 
PySpark dataframe
PySpark dataframePySpark dataframe
PySpark dataframeJaemun Jung
 
Angular - Chapter 2 - TypeScript Programming
Angular - Chapter 2 - TypeScript Programming  Angular - Chapter 2 - TypeScript Programming
Angular - Chapter 2 - TypeScript Programming WebStackAcademy
 
Kafka Connect and Streams (Concepts, Architecture, Features)
Kafka Connect and Streams (Concepts, Architecture, Features)Kafka Connect and Streams (Concepts, Architecture, Features)
Kafka Connect and Streams (Concepts, Architecture, Features)Kai Wähner
 
Spark (Structured) Streaming vs. Kafka Streams
Spark (Structured) Streaming vs. Kafka StreamsSpark (Structured) Streaming vs. Kafka Streams
Spark (Structured) Streaming vs. Kafka StreamsGuido Schmutz
 
Event Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQEvent Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQAraf Karsh Hamid
 
Kafka Summit NYC 2017 - Singe Message Transforms are not the Transformations ...
Kafka Summit NYC 2017 - Singe Message Transforms are not the Transformations ...Kafka Summit NYC 2017 - Singe Message Transforms are not the Transformations ...
Kafka Summit NYC 2017 - Singe Message Transforms are not the Transformations ...confluent
 
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020Matt Raible
 
High Performance and Scalability Database Design
High Performance and Scalability Database DesignHigh Performance and Scalability Database Design
High Performance and Scalability Database DesignTung Ns
 
Simplify CDC Pipeline with Spark Streaming SQL and Delta Lake
Simplify CDC Pipeline with Spark Streaming SQL and Delta LakeSimplify CDC Pipeline with Spark Streaming SQL and Delta Lake
Simplify CDC Pipeline with Spark Streaming SQL and Delta LakeDatabricks
 
Making Apache Spark Better with Delta Lake
Making Apache Spark Better with Delta LakeMaking Apache Spark Better with Delta Lake
Making Apache Spark Better with Delta LakeDatabricks
 
Advance Java Topics (J2EE)
Advance Java Topics (J2EE)Advance Java Topics (J2EE)
Advance Java Topics (J2EE)slire
 

Was ist angesagt? (20)

Dependency Injection in Apache Spark Applications
Dependency Injection in Apache Spark ApplicationsDependency Injection in Apache Spark Applications
Dependency Injection in Apache Spark Applications
 
PySpark dataframe
PySpark dataframePySpark dataframe
PySpark dataframe
 
Unified Stream and Batch Processing with Apache Flink
Unified Stream and Batch Processing with Apache FlinkUnified Stream and Batch Processing with Apache Flink
Unified Stream and Batch Processing with Apache Flink
 
Streaming SQL
Streaming SQLStreaming SQL
Streaming SQL
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Angular - Chapter 2 - TypeScript Programming
Angular - Chapter 2 - TypeScript Programming  Angular - Chapter 2 - TypeScript Programming
Angular - Chapter 2 - TypeScript Programming
 
Rest in flask
Rest in flaskRest in flask
Rest in flask
 
Kafka Connect and Streams (Concepts, Architecture, Features)
Kafka Connect and Streams (Concepts, Architecture, Features)Kafka Connect and Streams (Concepts, Architecture, Features)
Kafka Connect and Streams (Concepts, Architecture, Features)
 
Spark (Structured) Streaming vs. Kafka Streams
Spark (Structured) Streaming vs. Kafka StreamsSpark (Structured) Streaming vs. Kafka Streams
Spark (Structured) Streaming vs. Kafka Streams
 
Event Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQEvent Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQ
 
Kafka Summit NYC 2017 - Singe Message Transforms are not the Transformations ...
Kafka Summit NYC 2017 - Singe Message Transforms are not the Transformations ...Kafka Summit NYC 2017 - Singe Message Transforms are not the Transformations ...
Kafka Summit NYC 2017 - Singe Message Transforms are not the Transformations ...
 
Java PPT
Java PPTJava PPT
Java PPT
 
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
 
Scala Intro
Scala IntroScala Intro
Scala Intro
 
High Performance and Scalability Database Design
High Performance and Scalability Database DesignHigh Performance and Scalability Database Design
High Performance and Scalability Database Design
 
Simplify CDC Pipeline with Spark Streaming SQL and Delta Lake
Simplify CDC Pipeline with Spark Streaming SQL and Delta LakeSimplify CDC Pipeline with Spark Streaming SQL and Delta Lake
Simplify CDC Pipeline with Spark Streaming SQL and Delta Lake
 
Introduction to Redux
Introduction to ReduxIntroduction to Redux
Introduction to Redux
 
Making Apache Spark Better with Delta Lake
Making Apache Spark Better with Delta LakeMaking Apache Spark Better with Delta Lake
Making Apache Spark Better with Delta Lake
 
Introduction to java 8 stream api
Introduction to java 8 stream apiIntroduction to java 8 stream api
Introduction to java 8 stream api
 
Advance Java Topics (J2EE)
Advance Java Topics (J2EE)Advance Java Topics (J2EE)
Advance Java Topics (J2EE)
 

Ähnlich wie Arquitetura funcional em microservices, 4 anos depois

SoapUI & Jmeter Basics Web service testing
SoapUI & Jmeter Basics Web service testingSoapUI & Jmeter Basics Web service testing
SoapUI & Jmeter Basics Web service testingRicardo Moura
 
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 filasDiego Pacheco
 
Testes webservice tdc
Testes webservice tdcTestes webservice tdc
Testes webservice tdcRicardo Moura
 
Testando aplicações DataSnap
Testando aplicações DataSnapTestando aplicações DataSnap
Testando aplicações DataSnapAndreano Lanusse
 
Aula12 T EES UFS Testes de SW
Aula12  T EES  UFS  Testes de SWAula12  T EES  UFS  Testes de SW
Aula12 T EES UFS Testes de SWguest8ae21d
 
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 IncidenteAlan Carlos
 
Workshop soa, microservices e devops
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devopsDiego Pacheco
 
ODI SERIES - Melhores Práticas
ODI SERIES - Melhores PráticasODI SERIES - Melhores Práticas
ODI SERIES - Melhores PráticasCaio Lima
 
Tipos de automação de teste
Tipos de automação de testeTipos de automação de teste
Tipos de automação de testeMarcos Pessoa
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredElias Nogueira
 
Introdução ao AWS Database Migration Service
Introdução ao AWS Database Migration ServiceIntrodução ao AWS Database Migration Service
Introdução ao AWS Database Migration ServiceAmazon Web Services LATAM
 
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...Affinitas GmbH
 
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 MobileElias Nogueira
 
As Falácias e os Desenganos no Desenvolvimento de Software (TechDays 2005)
As Falácias e os Desenganos no Desenvolvimento de Software (TechDays 2005)As Falácias e os Desenganos no Desenvolvimento de Software (TechDays 2005)
As Falácias e os Desenganos no Desenvolvimento de Software (TechDays 2005)Bruno Camara
 
Arquitetura de Software - Performance, Layers e Domain Layer
Arquitetura de Software - Performance, Layers e Domain LayerArquitetura de Software - Performance, Layers e Domain Layer
Arquitetura de Software - Performance, Layers e Domain LayerAndré Faria Gomes
 
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...fabio perrella
 
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 trincheirasCelso Crivelaro
 
Configuração de Drivers
Configuração de DriversConfiguração de Drivers
Configuração de DriversAVEVA
 

Ähnlich wie Arquitetura funcional em microservices, 4 anos depois (20)

SoapUI & Jmeter Basics Web service testing
SoapUI & Jmeter Basics Web service testingSoapUI & Jmeter Basics Web service testing
SoapUI & Jmeter Basics Web service testing
 
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
 
Testes webservice tdc
Testes webservice tdcTestes webservice tdc
Testes webservice tdc
 
Testando aplicações DataSnap
Testando aplicações DataSnapTestando aplicações DataSnap
Testando aplicações DataSnap
 
Aula12 T EES UFS Testes de SW
Aula12  T EES  UFS  Testes de SWAula12  T EES  UFS  Testes de SW
Aula12 T EES UFS Testes de SW
 
Aula12 TEES UFS Testes de SW
Aula12 TEES UFS Testes de SWAula12 TEES UFS Testes de SW
Aula12 TEES UFS Testes de SW
 
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
 
Workshop soa, microservices e devops
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devops
 
ODI SERIES - Melhores Práticas
ODI SERIES - Melhores PráticasODI SERIES - Melhores Práticas
ODI SERIES - Melhores Práticas
 
Tipos de automação de teste
Tipos de automação de testeTipos de automação de teste
Tipos de automação de teste
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssured
 
Introdução ao AWS Database Migration Service
Introdução ao AWS Database Migration ServiceIntrodução ao AWS Database Migration Service
Introdução ao AWS Database Migration Service
 
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
 
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
 
As Falácias e os Desenganos no Desenvolvimento de Software (TechDays 2005)
As Falácias e os Desenganos no Desenvolvimento de Software (TechDays 2005)As Falácias e os Desenganos no Desenvolvimento de Software (TechDays 2005)
As Falácias e os Desenganos no Desenvolvimento de Software (TechDays 2005)
 
Arquitetura de Software - Performance, Layers e Domain Layer
Arquitetura de Software - Performance, Layers e Domain LayerArquitetura de Software - Performance, Layers e Domain Layer
Arquitetura de Software - Performance, Layers e Domain Layer
 
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...
 
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
 
Configuração de Drivers
Configuração de DriversConfiguração de Drivers
Configuração de Drivers
 

Mehr von Lucas Cavalcanti dos Santos

Mehr von Lucas Cavalcanti dos Santos (7)

Complex made bearable Clojure conj 2019
Complex made bearable Clojure conj 2019Complex made bearable Clojure conj 2019
Complex made bearable Clojure conj 2019
 
Arquitetando uma instituição financeira moderna
Arquitetando uma instituição financeira modernaArquitetando uma instituição financeira moderna
Arquitetando uma instituição financeira moderna
 
Microservices in Clojure
Microservices in ClojureMicroservices in Clojure
Microservices in Clojure
 
Building a powerful double entry accounting system
Building a powerful double entry accounting systemBuilding a powerful double entry accounting system
Building a powerful double entry accounting system
 
Testando a integracao entre serviços - Agile Brazil 2014
Testando a integracao entre serviços - Agile Brazil 2014Testando a integracao entre serviços - Agile Brazil 2014
Testando a integracao entre serviços - Agile Brazil 2014
 
O poder da linguagem Ruby e as suas consequências
O poder da linguagem Ruby e as suas consequênciasO poder da linguagem Ruby e as suas consequências
O poder da linguagem Ruby e as suas consequências
 
Otimizacao prematura-agile-brazil-12
Otimizacao prematura-agile-brazil-12Otimizacao prematura-agile-brazil-12
Otimizacao prematura-agile-brazil-12
 

Arquitetura funcional em microservices, 4 anos depois

  • 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 para o ar o mais rápido possível, testar, e se der certo refatorar pra ficar direito, pivotar se não OU Investir na infraestrutura de entrega contínua para responder mais rápido a mudanças
  • 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: @isso-muda dynamic vars: *muda-por-thread* chamadas java: .nomeDoMetodo funções com side effect: faca-isso!
  • 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, logging, tracing, segurança 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 “Seja conservador no que você faz, seja liberal no que você aceita dos outros” -- 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 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 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