3. AMQP
● Advanced Message Queuing 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 - direct routing
● Sporočila gredo v določeno vrsto.
● Uporabno za workerje (gearman).
Publisher Queue Consumer
8. AMQP - fanout routing
● Vsako sporočilo gre v več vrst.
● Naredi se kopija sporočila za vsako vrsto.
Publisher Queue2 Consumer2
Consumer1
Consumer3
9. 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.
10. 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.
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 – 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();
16. 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();
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
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
Vsak node je lahko na svoji mašini
Celoten protokol je programabilen
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
Queue ima lahko več consumerjev. Sporočilo prejme samo eden (tisti, ki je na razpolago)
Broadcast
Group chat
Primeri uporabe
- geolocation distibucija
- os specifični workerji
- workerji :)
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
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,...
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
Avtentikacija user + pass
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,
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)
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