Por que aplicação reativa?

Os requisitos do aplicativo mudaram drasticamente nos últimos anos. Há apenas alguns anos, um grande aplicativo tinha dezenas de servidores, segundos de tempo de resposta, horas de manutenção offline e gigabytes de dados.
Hoje, os aplicativos são implantados em tudo, desde dispositivos móveis a clusters baseados em nuvem executando milhares de processadores multi-core. Os usuários esperam tempos de resposta em milissegundos e 100% de disponibilidade. Os dados são medidos em petabytes. As demandas de hoje simplesmente não são atendidas pelas arquiteturas de software de ontem.

Aplicações tradicionais

reactive-api-with-php_traditional_

Cada solicitação está usando 2 processos em execução, um para cada instância do servidor HTTP e servidor de banco de dados. A estrutura PHP também pode gerar seu próprio processo adicional.
A instância do servidor HTTP está gerando um objeto de solicitação, que é principalmente sobrecarregado para uso posterior.
A instância do banco de dados está bloqueando a resposta até que tenha concluído sua tarefa.
A resposta do banco de dados está sendo armazenada em buffer pelo processo PHP para gerar o DTO (objeto de transferência de dados).
O processo PHP está usando o DTO para gerar uma resposta JSON para a instância do servidor HTTP.
Todo o processo, começando com a solicitação HTTP até servir a resposta de volta ao cliente, está sendo executado no mesmo thread. Isso usa o comportamento padrão da CPU, o que leva a um uso desequilibrado dos núcleos da CPU.
cpu_traditional_application

Aplicações reativas

Acreditamos que todos os aspectos necessários já são reconhecidos individualmente: queremos sistemas que sejam responsivos, resilientes, elásticos e orientados por mensagens. Chamamos isso de Sistemas Reativos.
reactive-api-with-php_reactive
Não há necessidade de um servidor HTTP. O aplicativo está usando um único processo. PHP e o banco de dados (SQLite) estão rodando dentro deste processo.
Não há necessidade de um objeto de solicitação HTTP sobrecarregado. Os dados necessários são limitados principalmente ao método de solicitação, caminho e carga útil.
A resposta pode ser enviada imediatamente ao cliente, enquanto os dados são processados ​​em background e todas as etapas necessárias são tratadas de forma assíncrona, por meio de eventos.
O banco de dados não está bloqueando a resposta, pois sua tarefa está sendo tratada de forma assíncrona.
Todo o processo está acontecendo em um soquete TCP persistente, permitindo que a resposta seja transmitida ao cliente.
O processo está gerenciando suas tarefas com vários threads, equilibrando o uso de todos os núcleos da CPU.
cpu_reactive_application

Exemplo de implementação

Como exemplo de implementação, usamos componentes leves que empacotamos em contêineres do Docker. AlpineOS e Ubuntu já vêm como imagens Docker prontas para serem usadas.
ReactPHP é responsável por estabelecer o soquete TCP, transferir a solicitação HTTP bruta e enviar a resposta HTTP de volta.
A microestrutura PIMF é responsável por gerenciar os recursos HTTP usando os métodos de solicitação HTTP, validar os dados e manipular a interação de persistência.
reactive-api-with-php_example
Você pode encontrar o código-fonte no GitHub: https://github.com/gjerokrsteski/reactphp-pimf
Sinta-se à vontade para fazer um fork e experimente você mesmo!

Conclusão

Os sistemas construídos como Reactive Systems são mais flexíveis, fracamente acoplados e escaláveis. Isso os torna mais fáceis de desenvolver e passíveis de mudança. Eles são significativamente mais tolerantes ao fracasso e, quando ocorre, eles o enfrentam com elegância, em vez de desastre. Os sistemas reativos são altamente responsivos, fornecendo aos usuários um feedback interativo eficaz.
Recursos:
The Reactive Manifesto
http://www.reactivemanifesto.org
O que é programação reativa?
https://medium.com/reactive-programming/what-is-reactive-programming-bc9fa7f4a7fc#.j5m4cnvck
ReactPHP
http://reactphp.org
PIMF
http://pimf-framework.de
Docker
https: //docs.docker .com