Tirando o coelho da cartola
Integrando sistemas com RabbitMQ
Quem sou eu
❖ Programador PHP!
❖ Twitter: @nelson_senna!
❖ Blog: http://nelsonsar.github.io
Por que integrar?
Como podemos integrar sistemas?
Opções conhecidas
❖ Integração com arquivos;!
❖ Banco de dados compartilhado;!
❖ Remote Procedure Call (RPC);
Integração com arquivos❖ Formatos que tem suporte para múltiplas linguagens e múltiplas plataformas
(CSV, JSON, XML, etc);!
❖ Fraco acoplamento entre sistemas que precisam ser integrados;!
❖ Nome, tempo de atualização e remoção precisam ser acordados entre as aplicações;!
❖ Implementação de como processar o arquivo em cada aplicação;!
❖ Concorrência leitura e escrita;!
❖ Aplicações acessando o mesmo disco ou transferência de arquivos entre discos;!
❖ Alta probabilidade dos sistemas ficarem fora de sincronia e de conflitos de dados.
Banco de dados compartilhado❖ Consistência entre os dados;!
❖ Concorrência feita através do sistema de transação do banco de dados;!
❖ Uso da linguagem SQL para integração;!
❖ Estrutura que satisfaça todas as aplicações envolvidas na integração;!
❖ Distribuir o banco de dados;!
❖ Performance prejudicada devido a vários “locks”;!
❖ “Deadlock”;
Remote Procedure Call (RPC)
❖ Permite a construção de aplicações responsáveis pelos dados que elas mantém;!
❖ Capacidade de prover múltiplas interfaces para um mesmo dado;!
❖ Produz acoplamento entre as aplicações envolvidas na integração;!
❖ Requisições síncronas (Não necessariamente…);
É… E…? Fodeu, então?
Não! É pra isso que eu estou aqui!
Mensagens
❖ Acoplamento entre as aplicações tendendo a zero;!
❖ Mecanismo de “retry”;!
❖ Assíncrono;!
❖ RabbitMQ!
Por que o RabbitMQ?
❖ Fácil de instalar;!
❖ Fácil de monitorar;!
❖ Fácil de usar;!
❖ “Clustering” dinâmico, fácil de criar e manter;!
❖ Documentação excelente;!
❖ Utiliza o protocolo AMQP e não o utiliza quando o assunto é performance;!
❖ Plugins;!
❖ Extensão PECL e phpamqp-lib;!
❖ Open source;!
❖ Suporte comercial;
E como funciona?
Protocolo AMQP
Producer Exchange Queue Consumermensagem
binding
resposta
mensagem
RabbitMQ
AMQP: Componentes
❖ Exchanges;!
❖ Message Queues (Filas);!
❖ Bindings;!
❖ Channel (Canal);!
❖ Virtual Hosts;
Exchange?
Exchanges padrão
❖ Default;!
❖ Direct;!
❖ Fanout;!
❖ Topic;!
❖ Headers;
Default exchange
❖ Otimização no código do RabbitMQ (mais rápida que as demais);!
❖ Útil para pequenas aplicações;
Direct exchange
exchange
q1
q2
q3
routing_key: key1
routing_key: key2
routing_key: key3
Fanout exchange
exchange
q1
q2
q3
Topic exchange
Headers exchange
❖ Direct exchanges with lasers;!
❖ Mais de um critério para encaminhamento;
E a fila faz o que?
Propriedades da fila
❖ Exclusiva ou compartilhada;!
❖ Durável ou temporária;!
❖ Nomeada pelo cliente ou pelo servidor;
E como o exchange sabe para qual fila entregar a mensagem?
Bindings ligam exchanges às filas!
Posso ter várias conexões ao mesmo tempo?
Claro! Os canais possibilitam isso!
É, mas, se eu tiver que ter uma instância do RabbitMQ para cada uma das minhas
aplicações vai ficar complicado de gerenciar…
É… vai mesmo…
Sorte que não precisa! Você pode ter vários virtual hosts, uma para cada aplicação!
Falou de tudo, menos de mensagem…
AMQP: Mensagens
❖ Criadas pelo “producer”;!
❖ Roteadas pelo exchange e entregues às filas (ou não…);!
❖ Filas encaminham a mensagem aos “consumers”;!
❖ Podem ser persistidas em disco (Mas, você não vai querer fazer isso…);!
❖ Podem ser aceitas ou rejeitadas pelo “consumer”.
Ótimo! Agora só falta me provar que é fácil de usar, né?
Criando seu producer
Criando seu consumer
Fácil, hã?
Dúvidas?
Muito obrigado!