RabbitMQ
AMQP in PHP
Blaž Strmole, Bled, 12. 2. 2015
RabbitMQ
● Message broker
● AMQP in še več
● Napisan v Erlang-u
● Open source
AMQP
● Advanced Message Queuing Protocol
● AMQP is a networking protocol that enables
conforming client applications to
communicate with conforming messaging
middleware brokers.
AMQP - zgodovina
● Zasnovan 2003
● Najprej ga uporabljajo v finančnih aplikacijah
● Nov 2008 izdajo verzijo 0.9.1
● Nov 2011 izdajo verzijo 1.0
● Okt 2012 potrjen kot OASIS standard
● RabbitMQ uporablja 0.9.1
AMQP - model
● Publisher pošlje sporočilo v Exchange
(mailbox).
● Glede na routing se sporočilo distribuira v
Queues.
● Broker ga posreduje Consumer-ju ali pa ga
consumer sam potegne iz queue.
● RabbitMq == Exchange + Queues + Broker
AMQP - Exchange
● Sporočila so poslana sem.
● Vedno obstaja privzet Exchange
● Tu se izvaja routing.
AMQP - direct routing
● Sporočila gredo v določeno vrsto.
● Uporabno za workerje (gearman).
Publisher Queue Consumer
AMQP - fanout routing
● Vsako sporočilo gre v več vrst.
● Naredi se kopija sporočila za vsako vrsto.
Publisher Queue2 Consumer2
Consumer1
Consumer3
AMQP - topic routing
● Sporočilo gre v eno ali več vrst.
● Kam gre se določi glede na routing key od
sporočila.
● Pravila se določijo v Exchange.
AMQP - header routing
● Sporočilo gre v eno vrsto.
● Kam gre se določi s header atributi.
● Podpira any ali all.
● Direct routing on steroids.
AMQP - queues
● Jih je potrebno predhodno določiti (declare).
● Imajo več lastnosti:
– Ime
– Persistenco (durable)
– Exclusive
– Auto-delete
– Argumente
AMQP - consumers
● Push
● Pull
● Lahko več na eno vrsto
● Exclusive consumer
● Potrditev prejema sporočila
(acknowledgement)
● Zavrnitev sporočila
AMQP - connections
● TCP
● Uporabljajo avtentikacijo
● Lahko tudi TLS (SSL)
● Jih je potrrebno zaključevati (close)
RabbitMQ - PHP
● Php-amqplib
– Spisana v PHP (5.3)
– Avtor: Alvaro Videla
– Podpira vse kar RabbitMQ
● Pecl AMQP lib
– Bazira na RabbitMQ C AMQP client lib
RabbitMQ – Primer publisher
use PhpAmqpLibConnectionAMQPConnection;
use PhpAmqpLibMessageAMQPMessage;
$connection = new AMQPConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');
echo " [x] Sent 'Hello World!'n";
$channel->close();
$connection->close();
RabbitMQ – Primer consumer
use PhpAmqpLibConnectionAMQPConnection;
$connection = new AMQPConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
$callback = function($msg) {
echo " [x] Received ", $msg->body, "n";
};
$channel->basic_consume('hello', '', false, true, false, false, $callback);
echo ' [*] Waiting for messages. To exit press CTRL+C', "n";
while(count($channel->callbacks)) {
$channel->wait();
}
$channel->close();
$connection->close();
Vprašanja?
RabbitMQ, AMQP in PHP

Rabbit mq, amqp and php

  • 1.
    RabbitMQ AMQP in PHP BlažStrmole, Bled, 12. 2. 2015
  • 2.
    RabbitMQ ● Message broker ●AMQP in še več ● Napisan v Erlang-u ● Open source
  • 3.
    AMQP ● Advanced MessageQueuing Protocol ● AMQP is a networking protocol that enables conforming client applications to communicate with conforming messaging middleware brokers.
  • 4.
    AMQP - zgodovina ●Zasnovan 2003 ● Najprej ga uporabljajo v finančnih aplikacijah ● Nov 2008 izdajo verzijo 0.9.1 ● Nov 2011 izdajo verzijo 1.0 ● Okt 2012 potrjen kot OASIS standard ● RabbitMQ uporablja 0.9.1
  • 5.
    AMQP - model ●Publisher pošlje sporočilo v Exchange (mailbox). ● Glede na routing se sporočilo distribuira v Queues. ● Broker ga posreduje Consumer-ju ali pa ga consumer sam potegne iz queue. ● RabbitMq == Exchange + Queues + Broker
  • 6.
    AMQP - Exchange ●Sporočila so poslana sem. ● Vedno obstaja privzet Exchange ● Tu se izvaja routing.
  • 7.
    AMQP - directrouting ● Sporočila gredo v določeno vrsto. ● Uporabno za workerje (gearman). Publisher Queue Consumer
  • 8.
    AMQP - fanoutrouting ● Vsako sporočilo gre v več vrst. ● Naredi se kopija sporočila za vsako vrsto. Publisher Queue2 Consumer2 Consumer1 Consumer3
  • 9.
    AMQP - topicrouting ● Sporočilo gre v eno ali več vrst. ● Kam gre se določi glede na routing key od sporočila. ● Pravila se določijo v Exchange.
  • 10.
    AMQP - headerrouting ● Sporočilo gre v eno vrsto. ● Kam gre se določi s header atributi. ● Podpira any ali all. ● Direct routing on steroids.
  • 11.
    AMQP - queues ●Jih je potrebno predhodno določiti (declare). ● Imajo več lastnosti: – Ime – Persistenco (durable) – Exclusive – Auto-delete – Argumente
  • 12.
    AMQP - consumers ●Push ● Pull ● Lahko več na eno vrsto ● Exclusive consumer ● Potrditev prejema sporočila (acknowledgement) ● Zavrnitev sporočila
  • 13.
    AMQP - connections ●TCP ● Uporabljajo avtentikacijo ● Lahko tudi TLS (SSL) ● Jih je potrrebno zaključevati (close)
  • 14.
    RabbitMQ - PHP ●Php-amqplib – Spisana v PHP (5.3) – Avtor: Alvaro Videla – Podpira vse kar RabbitMQ ● Pecl AMQP lib – Bazira na RabbitMQ C AMQP client lib
  • 15.
    RabbitMQ – Primerpublisher use PhpAmqpLibConnectionAMQPConnection; use PhpAmqpLibMessageAMQPMessage; $connection = new AMQPConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->queue_declare('hello', false, false, false, false); $msg = new AMQPMessage('Hello World!'); $channel->basic_publish($msg, '', 'hello'); echo " [x] Sent 'Hello World!'n"; $channel->close(); $connection->close();
  • 16.
    RabbitMQ – Primerconsumer use PhpAmqpLibConnectionAMQPConnection; $connection = new AMQPConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->queue_declare('hello', false, false, false, false); $callback = function($msg) { echo " [x] Received ", $msg->body, "n"; }; $channel->basic_consume('hello', '', false, true, false, false, $callback); echo ' [*] Waiting for messages. To exit press CTRL+C', "n"; while(count($channel->callbacks)) { $channel->wait(); } $channel->close(); $connection->close();
  • 17.

Editor's Notes

  • #3 message-oriented middleware exchange server Publisher (vaš program) → rabbitMQ (server) → consumer (worker) cluster Amqp = Advanced Message Queuing Protocol Več kasneje... Erlang – razvil ericsson, 1986 od 1998 open source
  • #5 Organization for the Advancement of Structured Information Standards 0.9 to 1.0 totalna razlika, ni več celotna infrastruktura ampak samo še protokola za izmenjavo sporočil Nista kompatibilna v nobeno smer
  • #6 Vsak node je lahko na svoji mašini Celoten protokol je programabilen
  • #7 Exchange ima IME, persistance (ali preživi restart), auto delete (se pobriše, ko so vsi queue izprazneni), itd. Privzet Default exchange - noname - navidezno se poveže na vse queue, po imenu Štirje tipi routinga: - direct - fan out - topic - headers
  • #8 Queue ima lahko več consumerjev. Sporočilo prejme samo eden (tisti, ki je na razpolago)
  • #9 Broadcast Group chat
  • #10 Primeri uporabe - geolocation distibucija - os specifični workerji - workerji :)
  • #11 Tako kot http message ima tudi amqp message header Lahko več atributov In / ali X-match atribut to določa Ignorira routing key, prioriteta pred vsem drugim
  • #12 Ime 255 bytov utf8 Lahko se generira avtomatsko Amq na začetku je prepovedan, rezervirano Durable Durable so zapisane na disk Preživijo restart Exclusive Uporabne samo z eno povezavo Se uničijo če se uniči povezava Auto delete Se pobrišejo, ko se odjavi zadnji consumer Argumenti, za dodatne funkcionalnosti ala TTL - določeni Content type, encoding, routing key, priority,...
  • #13 exclusive consumer Noben drug ne more jemati iz vrste dokler to dela on Potrditev - ko se pošlje consumerju, auto ack - consumer mora potrditi prejem/obdelavo - sporočilo ostane dokler ni potrjeno Zavrnitev - reject → discard or requeue
  • #14 Avtentikacija user + pass
  • #15 Alvaro Videla – tudi razvijalec pri rabbitMQ Takoj kot je kaj novega je tudi tu (extensions, plugini) Relativno počasna za povezavo uporablja stream_socket_client Pecl hitra, izkušnje Obe sta amqp knjižnjice in se lahko uporabljata z katerimkoli sistemov ki pozna amqp 9.1 StormMQ, Apache Qpid,
  • #16 queue_declare Ime, passive, durable, exclusive, auto-delete Passive = false, jo naredi če je še ni Passive = true, se samo proba povezati nanjo, če je ni dobimo error (exception)
  • #17 queue_declare Ime, passive, durable, exclusive, auto-delete basic_consume Queue ime, hello consumer tag, prazno, unikatno ime consumerja če je prazno se generira avtomatsko, no_local, false (true consumer in publisher morata imeti ločen connection) no_ack, true → auto ack Exclusive, false (samo ta consumer?) no_wait, false, ali naj consumer čaka na odgovor z serverja callback