Construindo Aplicações PHP com
TWELVE-FACTOR APP
Marcela Godoy
06 de Março de 2018
#MeuLugarEmTI
Marcela Godoy
Backend Developer @Eduzz
Coorganizadora Meetup @PHPSP - Campinas
@magodoy88 helloworld@marcelagodoy.net
Cloud Computing
2008 2012
Maior foco no negócio
Escalabilidade para demandas crescentes
Usuário final sem preocupação com infraestrutura
Utilizado em qualquer lugar e em diferentes plataformas
Cloud Computing
SaaS
Software as a Service
(Software como Serviço)
Provedor
SaaS
Aplicação
Data
Runtime
Middleware
O/S
Virtualization
Servers
Storage
Networking
Fácil de implementar gradualmente
Aplicação sempre atualizada, compatível e segura
O provedor cuida de tudo
Acesso de qualquer lugar em diferentes plataformas
SaaS
600 Startups brasileiras
Possuem ao menos um produto
SaaS
SaaS
Eficiente
Sustentável
Padrões de desenvolvimento
Facilite o trabalho do time
Como construir uma aplicação SaaS?
Adam
Wiggins + Heroku
Team
The Twelve-Factor App
The Twelve-Factor App
Facilitar a dinâmica entre desenvolvedores
Resolver problemas sistêmicos
Boas práticas
Escalabilidade
Portabilidade
The Twelve-Factor App
Refactoring
Improving the Design of Existing Code
(Martin Fowler - 1999)
Patterns of Enterprise Application Architecture
(Martin Fowler - 2003)
The Twelve-Factor App
I. Base de Código
“Uma base de código rastreada por controle de versão.
Muitos deploys.”
Controle de Versão
(GIT, Mercurial, Subversion)
Repositório
(Base de código)
I. Base de Código
Relação de um-para-um:
I. Base de CódigoI. Base de Código
Uma base de código = Uma aplicação
Vários deploys para a mesma base de código
I. Base de Código
Várias bases de código envolvidas = Sistema distribuído
Várias aplicações na mesma base = Errado!
I. Base de Código
+ +
II. Dependências
“Declare e isole explicitamente as dependências.”
Gerenciador de dependências
II. Dependências
Dependências declaradas e isoladas
Manifesto de
declaração
Dependências declaradas e isoladas
Ferramenta de
isolamento
Declaração e isolamento de dependência sempre juntos
II. Dependências
Recursos do Sistema devem ser vendorizados
II. Dependências
Como assim?
II. Dependências
II. Dependências
vendor/autoload.php
$ composer install
$ composer update
III. Configurações
“Armazene as configurações no ambiente.”
Configuração:
Tudo que é provável variar entre deploys
III. Configurações
Constantes no código = muito trabalho!
Armazenar as configurações em um arquivo de variáveis
de ambiente
III. Configurações
Novo deploy sem alterar a base de código
Estou fazendo isso certo?
III. Configurações
“Minha base de código poderia ser um repositório
público sem comprometer a minha segurança?”
Veja só
III. Configurações
III. Configurações
III. Configurações
III. Configurações
III. Configurações
IV. Serviços de Apoio
“Trate serviços de apoio como recursos anexados.”
Qualquer serviço que a aplicação consuma como parte
de sua operação (Gerenciamento de dados, cache, filas)
IV. Serviços de Apoio
Serviço de
apoio
Recurso Configurações
Facilidade para acoplar e desacoplar recursos da
aplicação
IV. Serviços de Apoio
Sabe como?
IV. Serviços de Apoio
IV. Serviços de Apoio
IV. Serviços de Apoio
V. Build, Release, Run
“Separe estritamente os estágios de construção e execução.”
Para que a base de código se transforme em versão:
V. Build, Release, Run
Build + Release Run+
Commit + Dependências = Build
V. Build, Release, Run
Build + Configurações do Deploy = Release
(Não se esqueça do nome da versão!)
Release + ambiente de execução + start( ) = Run!
V. Build, Release, Run
Releases nunca voltam ao estágio de Build!
Códigos alterados geram novas Releases
Ferramentas de Deploy revertem Releases (Rollback!)
Novos códigos no Deploy iniciam uma nova Build
V. Build, Release, Run
VI. Processos
“Execute a aplicação como um ou mais processos que
não armazenam estados.”
Processos de stateless e shared-nothing
VI. Processos
Dados consistentes devem ser armazenados em
serviços de apoio
Escalabilidade horizontal
Memórias e sistemas de arquivos apenas para
cache de transição única
VI. Processos
Sessões persistentes – NÃÃÃÃO!
(Use um datastore: memcached, redis...)
VI. Processos
VII. Vínculo de Portas
“Exporte serviços via vínculo de portas.”
Aplicação auto-contida
VII. Vínculo de Portas
Escuta e recebe requisições através de uma porta
Um app torna-se serviço de outro vinculando portas
VII. Vínculo de Portas
VIII. Concorrência
“Escale através do processo modelo.”
VIII. Concorrência
A execução de uma aplicação é representada
por processos
Arquitete a aplicação para lidar com diferentes
cargas
VIII. Concorrência
Performance vs. Custo
Escalonamento por meio de paralelização
IX. Descartabilidade
“Maximize robustez com inicialização rápida e
desligamento suave.”
IX. Descartabilidade
Processos são descartáveis
Escalonamento elástico
Deploy rápido
Produção robusta
IX. Descartabilidade
Desligamento suave:
Porta de
serviço
Requisições
finalizam Desligamento
IX. Descartabilidade
Morte súbita:
Falha de
hardware
Retorna tarefas
à fila
Ferramenta
Backend
X. Paridade entre Desenvolvimento
E Produção
“Mantenha o desenvolvimento, homologação e produção
os mais similares possível.”
X. Paridade entre Desenvolvimento e Produção
( 1 ) Tempo: Dev trabalhando no deploy
local a muito tempo...
( 2 ) Pessoal: O Dev finalizou o código, mas está esperando
o time de deploy
( 3 ) Ferramentas: O Dev utiliza OSX, Nginx e SQLite.
Enquanto isso em produção temos Linux, Apache e MySQL
X. Paridade entre Desenvolvimento e Produção
Implantação contínua:
“Garante entrega ao usuário final sem gargalo
no ambiente de homologação”
X. Paridade entre Desenvolvimento e Produção
( 1 ) Tempo: Dev escreve o código e realiza o deploy em
poucas horas
( 2 ) Pessoal: O Dev finalizou o código, é envolvido com o
deploy e acompanha o comportamento em produção
( 3 ) Ferramentas: Mantenha desenvolvimento e produção
o mais similar possível!
X. Paridade entre Desenvolvimento e Produção
O desenvolvedor não deve usar ferramentas
adaptadoras
Deploys com mesmas versões de cada
serviço de apoio
XI. Logs
“Trate logs como fluxos de eventos.”
XI. Logs
“Fluxos de eventos agregados e ordenados por tempo,
coletados dos fluxos de saída de todos os processos em
execução dos serviços de apoio”
XI. Logs
Não escreve ou gera serviços de Log
Gerido pelo ambiente de execução
XI. Logs
Captura-se o fluxo de saída;
Agrupa-se a outros fluxos;
Direciona para um arquivamento
de longo prazo
XI. Logs
Elasticseach Logstach Kibana
XII. Processos Administrativos
“Rode tarefas de administração/gestão em
processos pontuais.”
XII. Processos Administrativos
Processos Pontuais:
Migração de uma base de dados,
Execução arbitrária de códigos...
Execução em ambiente idêntico a outros processos
Utilizar declaração e isolamento de dependências
E ao final...
Estamos prontos para escalar
Possuímos uma ótima portabilidade
Seguimos boas práticas
Temos uma aplicação robusta
E ao final...
Era isso que a gente queria!
Referências
www.12factor.net Beyond the Twelve-Factor App
Kevin Hoffman
Obrigada!
@magodoy88 helloworld@marcelagodoy.net

Construindo Aplicações PHP com Twelve-Factor App