COMUNICAÇÃO ASSÍNCRONA
Frontend
API Gateway
Queue
Service A Service B Service C
book for a class
BOOKING_REQUEST
202
(listening to B_R event)
GET /v2/bar
{"bar":"123"}
BOOKING_CONFIRMED
results via websockets if required
(listening to B_C event)
Send notification
Slide 28
Slide 28 text
COMUNICAÇÃO ASSÍNCRONA
um serviço "subscribe" a um evento
usa os dados (payload) para fazer alguma coisa
event identif er
"BOOKING_REQUEST"
event payload
{
"userId": "1234567890",
"classId": "2345",
"classStartDate": "2020-05-14T15 19 21+00 00"
}
INVESTIGAÇÃO DE BUG
Frontend
API Gateway
Queue
Service A Service B Service C
book for a class
BOOKING_REQUEST
202
(listening to B_R event)
GET /v2/bar
{"bar":"123"}
BOOKING_CONFIRMED
results via websockets if required
(listening to B_C event)
Send notification
Slide 31
Slide 31 text
NÃO ECONOMIZE NOS LOGS
log de todos os requests enviados e recebidos
log de todas as respostas enviadas e recebidas
log de todos os dados de eventos emitidos
log de todos os dados de eventos consumidos
log de todas as decisões importantes
"em microserviços, logs são tipo um best-friend."
RESPONSABILIDADE
cada serviço precisa de uma razão pra existir
é permitido duplicar código, mas não dados
precisa de algum dado? peça outro serviço!
pense 2x antes de sincronizar/copiar dados entre serviços
Slide 35
Slide 35 text
O QUE EVITAR:
2 ou mais serviços compartilhando o mesmo DB
(quem mudou o dado? "source of truth"?)
implementação parcial de domínio
(quando vc tem lógicas iguais/parecidas em serviços diferentes / legado)
PRODUTIVIDADE
evitar a "sopa de linguagens" (2 ou 3 no máximo)
vc contratou a Maria. ela é fodassa em PHP
ela começou um serviço novo em Scala
ela continua mantendo o serviço de boas
Maria sai da empresa
agora vc precisa de 2 pessoas: PHP + Scala
Slide 38
Slide 38 text
PRODUTIVIDADE
usar arquitetura de software e padrões similares
mais fácil de lidar com vários projetos
mais fácil de lidar com várias linguagens
mais fácil de manter
mais fácil de integrar
"DDD/Clean Architecture" se encaixam muito bem!
Slide 39
Slide 39 text
PRODUTIVIDADE
compartilhe processos entre serviços
compartilhe padrões Git/VCS
padrões docker
compartilhe práticas de CI/CD
compartilhe processos de deploy
Slide 40
Slide 40 text
PARTE 3
Implementando microserviços confiáveis
baseados em PHP
Slide 41
Slide 41 text
TÓPICOS
arquitetura de software
execução do PHP
Slide 42
Slide 42 text
ARQUITETURA DE SOFTWARE
precisamos de algo flexível
precisamos de algo organizado
precisamos de qualidade
precisamos de poder
Slide 43
Slide 43 text
Robert C. Martin
"The goal of software architecture is to
minimize the human resources required to
build and maintain the required system."
Slide 44
Slide 44 text
mudar a arquitetura é caro pacacete!
Slide 45
Slide 45 text
ARQUITETURA EM CAMADAS
"deixe opções em aberto"
(acredite, elas mudam)
camadas independentes
casos de uso independentes
comandos independentes
Slide 46
Slide 46 text
DOMAIN-DRIVEN DESIGN
Implementing Domain-Driven Design
Vaughn Vernon
OBJETIVOS:
independente de framework (framework-as-a-tool)
testável sem qualquer elemento externo
independente de UI (Web / Console)
independente de banco de dados
independente de qualquer agente externo
Slide 49
Slide 49 text
CLEAN ARCHITECTURE
Slide 50
Slide 50 text
Clean Architecture
Robert C. Martin (Uncle Bob)
Slide 51
Slide 51 text
SCREAMING ARCHITECTURE
"a arquitetura fala por si só"
sobre o que é seu serviço? (resposta pelo código!)
pagamentos? reservas? autenticação?
ou é uma aplicação escrita em Laravel, Slim ou
Symfony?
THE DEPENDENCY RULE
"source code dependencies must
point only inward, toward higher-level policies"
ninguém de uma camada "interna" pode saber algo concreto de uma
camada "externa".
Slide 55
Slide 55 text
blz, mas como que eu faço isso?
usando interfaces/abstrações!
Slide 56
Slide 56 text
"code is not reusable. abstractions are."
Marco Pivetta (@Ocramius)
Slide 57
Slide 57 text
EXECUÇÃO DO PHP
saindo da zona de conforto
☠
Slide 58
Slide 58 text
"NodeJS is better for microservices"
Slide 59
Slide 59 text
Coroutine based Async PHP programming framework
Build high-performance, scalable, concurrent TCP, UDP, Unix Socket, HTTP,
WebSocket services with PHP and fluent Coroutine API.
https://www.swoole.co.uk/
Slide 60
Slide 60 text
como o PHP funciona naturalmente
php-fpm / "blocking I/O"
CPU I/O
Slide 61
Slide 61 text
como Swoole & Node.js funcionam
"non-blocking I/O" / async
CPU I/O
install RoadRunner
$ make
psr worker.php
while ($request = $psr7 acceptRequest()) {
$response = new \Zend\Diactoros\Response();
$response getBody() write("hello world");
$psr7 respond($response);
}
conf g f le
http:
address: :8080
workers:
command: "php psr worker.php"
pool:
numWorkers: 4
run
$ ./rr serve v d
Slide 72
Slide 72 text
Coroutine Based Concurrency with PHP and Swoole
Bruce Dou | @doubaokun
Feb 2020 PHPUK2020
https://speakerdeck.com/doubaokun/coroutine-based-concurrency-with-php-and-swoole
Slide 73
Slide 73 text
OBRIGADO!
PALESTRA JÁ DISPONÍVEL
⭐
http://speakerdeck.com/jgrossi
http://twitter.com/junior_grossi