Escolar Documentos
Profissional Documentos
Cultura Documentos
Os doze Fatores
1 – Base de Código
Uma base de código é um único repo (em um sistema de controle de versão centralizado como
Subversion), ou uma série de repositórios que compartilham um registro raiz.
• Se existem várias bases de código, isto não é uma app – é um sistema distribuído. Cada
componente do sistema é uma app, e cada uma pode individualmente ser compatível
com os 12 fatores.
• Múltiplas apps compartilhando uma base de código é uma violação dos 12 fatores. A
solução aqui é dividir o código compartilhado entre bibliotecas que podem ser
incluídas através do gerenciador de dependências.
Existe apenas uma base de código por aplicação, mas existirão vários deploys da mesma.
Um deploy (ou implantação) é uma instância executando a aplicação. Isto é tipicamente um
local de produção, e um ou mais locais de testes.
2 – Dependências
Uma aplicação doze-fatores nunca confia na existência implícita de pacotes em todo o sistema.
Ela declara todas as dependências, completa e exatamente, por meio de um manifesto de
declaração de dependência. Além disso, ela usa uma ferramenta de isolamento de
dependência durante a execução para garantir que não há dependências implícitas
“vazamento” a partir do sistema circundante. A completa e explícita especificação de
dependências é aplicada de maneira uniforme tanto para produção quanto para
desenvolvimento.
Por exemplo, Bundler para Ruby oferece o formato de manifesto Gemfile para declaração de
dependência e bundle exec para isolamento das mesmas. Em Python existem duas
ferramentas separadas para estas etapas – Pip é utilizado para declaração e Virtualenv para
isolamento. Mesmo C tem Autoconf para declaração de dependência, e vinculação estática
pode fornecer o isolamento. Não importa qual o conjunto de ferramentas, declaração de
dependência e isolamento devem ser sempre usados juntos – apenas um ou o outro não é
suficiente para satisfazer doze-fatores.
3 – Configurações
A configuração de uma aplicação é tudo o que é provável variar entre deploys (homologação,
produção, ambientes de desenvolvimento, etc). Isto inclui:
A prova de fogo para saber se uma aplicação tem todas as configurações corretamente
consignadas fora do código é saber se a base de código poderia ter seu código aberto ao
público a qualquer momento, sem comprometer as credenciais.
Note que esta definição de “configuração” não inclui configuração interna da aplicação, como
config/routes.rb em Rails, ou como módulos de códigos são conectados em Spring. Este tipo
de configuração não varia entre deploys, e por isso é melhor que seja feito no código.
4 – Serviços de apoio.
Um serviço de apoio é qualquer serviço que o app consuma via rede como parte de sua
operação normal. Exemplos incluem armazenamentos de dados (como MySQL ou CouchDB),
sistemas de mensagens/filas (tais como RabbitMQ ou Beanstalkd), serviços SMTP para emails
externos (tais como Postfix), e sistemas de cache (tais como Memcached).
Serviços de apoio como o banco de dados são tradicionalmente gerenciados pelos mesmos
administradores de sistema do servidor de deploy de tempo de execução do app.
Adicionalmente à esses serviços localmente gerenciados, o app pode ter serviços providos e
gerenciados por terceiros. Exemplos incluem serviços SMTP (tais como Postmark), serviços de
colheita de métricas (tais como New Relic ou Loggly), serviços de ativos binários (tais como
Amazon S3), e até serviços de consumidores acessíveis via API (tais como Twitter, Google
Maps, ou Last.fm).
O código para um app doze-fatores não faz distinção entre serviços locais e de terceiros. Para o
app, ambos são recursos anexados, acessíveis via uma URL ou outro localizador/credenciais na
config. Um deploy do app doze-fatores devem ser capaz de trocar um banco de dados MySQL
por um gerenciado por terceiros (tais como Amazon RDS) sem realizar quaisquer mudanças no
código do app. Da mesma forma, um servidor local SMTP poderia ser trocado por um serviço
de terceiros (tais como Postmark) sem as mudanças em código. Em ambos os casos, apenas o
identificador de recurso precisa mudar.
Uma base de código é transformada num deploy (de não-desenvolvimento) através de três
estágios:
Cada lançamento deve sempre ter um identificador de lançamento único, tal qual o timestamp
do lançamento (como 2011-04-06-20:32:17) ou um número incremental (como v100).
Lançamentos são livro-razões onde apenas se acrescenta informações, ou seja, uma vez criado
o lançamento não pode ser alterado. Qualquer mudança deve gerar um novo lançamento.
Ferramenta: Capistrano
6 – Processos
No caso mais simples, o código é um script autônomo, o ambiente de execução é o laptop local
de um desenvolvedor com o runtime da linguagem instalado, e o processo é iniciado pela linha
de comando (por exemplo, python my_script). Na outra extremidade do espectro, o deploy em
produção de uma aplicação sofisticada pode utilizar vários tipos de processos, instanciado em
zero ou mais processos em andamento.
O espaço de memória ou sistema de arquivos do processo pode ser usado como um breve,
cache de transação única. Por exemplo, o download de um arquivo grande, operando sobre
ele, e armazenando os resultados da operação no banco de dados. A aplicação doze-fatores
nunca assume que qualquer coisa cacheada na memória ou no disco estará disponível em uma
futura solicitação ou job – com muitos processos de cada tipo rodando, as chances são altas de
que uma futura solicitação será servida por um processo diferente. Mesmo quando rodando
em apenas um processo, um restart (desencadeado pelo deploy de um código, mudança de
configuração, ou o ambiente de execução realocando o processo para uma localização física
diferente) geralmente vai acabar com todo o estado local (por exemplo, memória e sistema de
arquivos).
7 – Vinculo de Portas.
HTTP não é o único serviço que pode ser exportado via vínculo de portas. Quase todos os tipos
de software servidores podem rodar via um processo vinculado a uma porta e aguardar as
requisições chegar. Exemplos incluem ejabberd (comunicando via XMPP), e Redis
(comunicando via protocolo Redis).
Qualquer programa de computador, uma vez executado, está representado por um ou mais
processos. Aplicações web têm tomado uma variedade de formas de processo de execução.
Por exemplo, processos PHP rodam como processos filhos do Apache, iniciados sob demanda
conforme necessário por volume de requisições. Processos Java tomam o caminho inverso,
com a JVM proporcionando um processo uber maciço que reserva um grande bloco de
recursos do sistema (CPU e memória) na inicialização, com concorrência gerenciada
internamente via threads. Em ambos os casos, o(s) processo(os) em execução são apenas
minimamente visíveis para os desenvolvedores da aplicação.
9 – Descartabilidade.
Os processos de um app doze-fatores são descartáveis, significando que podem ser iniciados
ou parados a qualquer momento. Isso facilita o escalonamento elástico, rápido deploy de
código ou mudanças de configuração, e robustez de deploys de produção.
Ferramenta: RabbitMQ
Serviços de apoio, como o banco de dados do app, sistema de filas, ou cache, são uma área
onde paridade entre desenvolvimento e produção é importante. Muitas linguagens oferecem
diferentes bibliotecas que simplificam o acesso ao serviço de apoio, incluindo adaptadores
para os diferentes tipos de serviços.
11 – Logs
Logs são o fluxo de eventos agregados e ordenados por tempo coletados dos fluxos de saída
de todos os processos em execução e serviços de apoio. Logs na sua forma crua são
tipicamente um formato de texto com um evento por linha (apesar que pilhas de exceção
podem ocupar várias linhas). Logs não tem começos ou términos fixos, mas fluem
continuamente enquanto o app estiver operante.
Em deploys de homologação ou produção, cada fluxo dos processos será capturado pelo
ambiente de execução, colados com todos os demais fluxos do app, e direcionados para um ou
mais destinos finais para visualização e arquivamento de longo prazo. Estes destinos de
arquivamento não são visíveis ou configuráveis pelo app, e ao invés disso, são completamente
geridos pelo ambiente de execução. Roteadores de log open source (tais como Logplex e
Fluentd) estão disponíveis para este propósito.
Ferramentas: Hadoop/Hive.
12 - Processos administrativos
A formação de processos é o conjunto de processos que são usados para fazer as negociações
regulares da app como ela é executada (tais como manipulação de requisições web).
Separadamente, os desenvolvedores, muitas vezes desejam fazer tarefas pontuais de
administração ou manutenção para a app, tais como: