Post on 02-Jun-2018
8/10/2019 Rabbit MQ y Symfony2
1/81
Scaling Symfony2 ap
with
RabbitMQ
8/10/2019 Rabbit MQ y Symfony2
2/81
Kacer Guni@cak
Software Engineer@SensiLa
Symfony Certified Deve
PHPers Silesia@PHP
https://twitter.com/cakper8/10/2019 Rabbit MQ y Symfony2
3/81
Agenda
!What is RabbitMQ
!How to communicate with it from PHP
!
How to integrate it with Symfony
!Diving into details
!Demo
8/10/2019 Rabbit MQ y Symfony2
4/81
Why would I need Messag
8/10/2019 Rabbit MQ y Symfony2
5/81
Use Cases
! Offloading / Background jobs
! Integration
! Scaling
! Queueing
! Scheduling
! Events
8/10/2019 Rabbit MQ y Symfony2
6/81
Message-oriented Middlew
() allows distributed applic
to communicate and exchangeby sending and receiving mes
http://docs.oracle.com/cd/E19316-01/82
8/10/2019 Rabbit MQ y Symfony2
7/81
8/10/2019 Rabbit MQ y Symfony2
8/81!""#$%%&'('&")*++,-.(-/0'1"')".23&%')"%4!'"50650
8/10/2019 Rabbit MQ y Symfony2
9/81
What is inside the RabbitM
8/10/2019 Rabbit MQ y Symfony2
10/81
Message Broker
8/10/2019 Rabbit MQ y Symfony2
11/81
AMQP
8/10/2019 Rabbit MQ y Symfony2
12/81
Erlang
8/10/2019 Rabbit MQ y Symfony2
13/81
Interoperability
! PHP
! Clojure
! Erlang
!Java
! Perl
! Python
! Ruby
! C#
!JavaScript
! C/C++
! Go
! Lisp
! Haskell
!
8/10/2019 Rabbit MQ y Symfony2
14/81
How does it work?
8/10/2019 Rabbit MQ y Symfony2
15/81
Broker
Bindings
Producer Exchange
Queue
Queue
8/10/2019 Rabbit MQ y Symfony2
16/81
Producer
Producer
8/10/2019 Rabbit MQ y Symfony2
17/81
Exchange
Exchange
8/10/2019 Rabbit MQ y Symfony2
18/81
Direct Exchange
Exchange Queue
8/10/2019 Rabbit MQ y Symfony2
19/81
Fanout Exchange
Exchange
Queue
Queue
8/10/2019 Rabbit MQ y Symfony2
20/81
Topic Exchange
#.error
#.warning, log
*.mobile.*
log.error
log.sql.warning
log.mobile.error
8/10/2019 Rabbit MQ y Symfony2
21/81
. - word separator
8/10/2019 Rabbit MQ y Symfony2
22/81
# - prefix/suffix wildcar
8/10/2019 Rabbit MQ y Symfony2
23/81
* - word wildcard
8/10/2019 Rabbit MQ y Symfony2
24/81
Bindings
Bindings
Exchange
Queue
Queue
8/10/2019 Rabbit MQ y Symfony2
25/81
Queue
Queue
8/10/2019 Rabbit MQ y Symfony2
26/81
Consumer
Consumer
8/10/2019 Rabbit MQ y Symfony2
27/81
How to feed Rabbit from P
8/10/2019 Rabbit MQ y Symfony2
28/81
PHP libraries and tools
!
php-amqplib
! PECL AMQP
! amqphp
! VorpalBunny
! Thumper
! CAMQP
8/10/2019 Rabbit MQ y Symfony2
29/81
Declare queue
?2311-2"031A1-BCDEFG311-2"031
HI,32',!36"IJK
8/10/2019 Rabbit MQ y Symfony2
30/81
Producer
?&6MA1-BCDEFD-66'M-HIU-,,3 43),(VINO?2!'11-,5P7'602R#*7,06!H?&6MJIIJI!-,,3I
-2!3W XYZ [-1" IU-,,3 43),(VI\1WO
8/10/2019 Rabbit MQ y Symfony2
31/81
Consumer
?2',,7'2]A+*12"031H?&6MN ^
-2!3I XYZ _-2-0/-( IJ?&6M5P73(`JW\1WOaO
?2!'11-,5P7'602R2316*&-
HI!-,,3IJIIJ+',6-J")*-J+',6-J+',6-J?2'
B!0,-H23*1"H?2!'11-,5P2',,7'2]6NN ^
?2!'11-,5PB'0"HNOa
8/10/2019 Rabbit MQ y Symfony2
32/81
RabbitMQ & Symf!""#6$%%6-2*)-.+,02]).23&%#!3"36
8/10/2019 Rabbit MQ y Symfony2
33/81
Step 1
8/10/2019 Rabbit MQ y Symfony2
34/81
Install RabbitMQ Bundle
23$-) )-Q*0)- e3,(63*1(%)'770"&Q57*1(,- 9
8/10/2019 Rabbit MQ y Symfony2
35/81
Step 2
8/10/2019 Rabbit MQ y Symfony2
36/81
Enable bundle in Kernel
#*7,02 +*12"031)-M06"-)g*1(,-6HN^
?7*1(,-6AXHhN
1-Bi,([3*1(\_'770"DQg*1(,-\i,([3*1(_'770"DZO
a
8/10/2019 Rabbit MQ y Symfony2
37/81
Step 3
8/10/2019 Rabbit MQ y Symfony2
38/81
Say thanks to
@old_sound :)
8/10/2019 Rabbit MQ y Symfony2
39/81
Step 4
8/10/2019 Rabbit MQ y Symfony2
40/81
Get rid offmanual configura
3,(R63*1(R)'770"R&Q$2311-2"0316$
(-+'*,"$
!36"$ I,32',!36"I#3)"$ K
8/10/2019 Rabbit MQ y Symfony2
41/81
Get rid offmanual configura
#)3(*2-)6$
!-,,3RB3),($
2311-2"031$ (-+'*,"-Y2!'1M-R3#"0316$ ^1'&-$I!-,,3IJ"`#-
2316*&-)6$
!-,,3RB3),($2311-2"031$ (-+'*,"
-Y2!'1M-R3#"0316$ ^1'&-$ I!-,,3IJ "`#-
Q*-*-R3#"0316$ ^1'&-$ I!-,,3Ia
2',,7'2]$ !-,,3RB3),(R6-)/02-
8/10/2019 Rabbit MQ y Symfony2
42/81
Get rid offmanual configura
#)3(*2-)6$
!-,,3RB3),($
2311-2"031$ (-+'*,"-Y2!'1M-R3#"0316$ ^1'&-$ I!-,,3IJ "`#-
2316*&-)6$
!-,,3RB3),($2311-2"031$ (-+'*,"
-Y2!'1M-R3#"0316$ ^1'&-$I!-,,3IJ"`#-
Q*-*-R3#"0316$ ^1'&-$I!-,,3Ia
2',,7'2]$ !-,,3RB3),(R6-)/02-
8/10/2019 Rabbit MQ y Symfony2
43/81
Step 5
8/10/2019 Rabbit MQ y Symfony2
44/81
Produce some data
#*7,02 +*12"03101(-YC2"031H?1'&-N
^?"!065PM-"HI3,(R63*1(R)'770"R&Q.!-,,3RB3),(R#)
5P#*7,06!H?1'&-NOa
8/10/2019 Rabbit MQ y Symfony2
45/81
Step 6
I l
8/10/2019 Rabbit MQ y Symfony2
46/81
Implement consumer
2,'66U-,,343),(G316*&-)0,-&-1"6G316*&-)k^
#*7,02 +*12"031-Y-2*"-HCDEFD-66'M-?&6M^
-2!3WU-,,3?&6M5P73(`VW.FUFRlimOa
a
8/10/2019 Rabbit MQ y Symfony2
47/81
Step 7
C fi S i C t i
8/10/2019 Rabbit MQ y Symfony2
48/81
Configure Service Contain
6-)/02-6$!-,,3RB3),(R6-)/02-$
2,'66$G']#-)\U-,,343),(G316*&-)
8/10/2019 Rabbit MQ y Symfony2
49/81
Step 8
R th C
8/10/2019 Rabbit MQ y Symfony2
50/81
Run the Consumer
.%'##%23163,- )'770"&Q$2316*&-) !-,,3RB3),(
N il d it!
8/10/2019 Rabbit MQ y Symfony2
51/81
Nailed it!
8/10/2019 Rabbit MQ y Symfony2
52/81
Diving into!""#6$%%6-2*)-.+,02]).23
8/10/2019 Rabbit MQ y Symfony2
53/81
Producers
Custom producer class
8/10/2019 Rabbit MQ y Symfony2
54/81
Custom producer class
#)3(*2-)6$
!-,,3RB3),($
2311-2"031$ (-+'*,"
-Y2!'1M-R3#"0316$ ^1'&-$ I!-,,3IJ "`#-"#$%%& '$()*+,-*##./+.01"*+
Custom producer class
8/10/2019 Rabbit MQ y Symfony2
55/81
Custom producer class
2,'66 U-,,3F)3(*2-) -Y"-1(6 F)3(*2-)^#*7,02 +*12"031 #*7,06!H?&6Mg3(`J hN
^?&6Mg3(`A6-)0',0j-H?&6Mg3(`NO
#')-1"$$#*7,06!H?&6Mg3(`J hNOa
a
Set content type
8/10/2019 Rabbit MQ y Symfony2
56/81
Set content type
+*12"031 RR2316")*2"HN^2345%67%*3'.83*839:)*;%.8B*8".0*;2C%DE.0:?F Ga
8/10/2019 Rabbit MQ y Symfony2
57/81
Consumers
Re queue message
8/10/2019 Rabbit MQ y Symfony2
58/81
Re-queue message
#*7,02 +*12"031 -Y-2*"-HCDEFD-66'M- ?&6MN^
5H;
8/10/2019 Rabbit MQ y Symfony2
59/81
Idle timeouts
2316*&-)6$!-,,3RB3),($
2311-2"031$ (-+'*,"
-Y2!'1M-R3#"0316$ ^1'&-$ I!-,,3IJ "`#-
Q*-*-R3#"0316$ ^1'&-$ I!-,,3Ia2',,7'2]$ !-,,3RB3),(R6-)/02-
50#*B35C*.13& LMN
Limit number of message
8/10/2019 Rabbit MQ y Symfony2
60/81
Limit number of message
.%'##%23163,- )'770"&Q$2316*&-) !-,,3RB3),(
Quality of Service
8/10/2019 Rabbit MQ y Symfony2
61/81
Quality of Service
Q36R3#"0316$#)-+-"2!R60j-$ :)+*H*3"4B".183& NOOPQQRQ
D#.A$#& H$#%*=3+1*
8/10/2019 Rabbit MQ y Symfony2
62/81
Exchanges
Exchange options
8/10/2019 Rabbit MQ y Symfony2
63/81
Exchange options
-Y2!'1M-R3#"0316$1'&-$ n3:)*& 05+*"3=H$8.13=3.)5"
01+$A#*& 3+1*=H$#%*
8/10/2019 Rabbit MQ y Symfony2
64/81
Queues
Queue options
8/10/2019 Rabbit MQ y Symfony2
65/81
Queue options
Q*-*-R3#"0316$
1'&-$ n01+$A#*& 3+1*=H$#%*$+D1C*83%&
8/10/2019 Rabbit MQ y Symfony2
66/81
Purge queue
O=$))=".8%.#* +$AA53CX&)1+D* 668.6".8H5+C$35.
8/10/2019 Rabbit MQ y Symfony2
67/81
Connection
Make it lazy!
8/10/2019 Rabbit MQ y Symfony2
68/81
Make it lazy!
3,(R63*1(R)'770"R&Q$
2311-2"0316$(-+'*,"$
!36"$ I,32',!36"I#3)"$ K
8/10/2019 Rabbit MQ y Symfony2
69/81
Setup
Setup Fabric
8/10/2019 Rabbit MQ y Symfony2
70/81
Setup Fabric
O=$))=".8%.#* +$AA53CX&%*31)6H$A+5"
#)3(*2-)6$*#,3'(R#02"*)-$$13.B%*31)BH$A+5"& H$#%*
2316*&-)6$*#,3'(R#02"*)-$
$13.B%*31)BH$A+5"& H$#%*
8/10/2019 Rabbit MQ y Symfony2
71/81
Multiple consumers
Multiple consumers
8/10/2019 Rabbit MQ y Symfony2
72/81
u p e co su e s&*,"0#,-R2316*&-)6$
!-,,3$
2311-2"031$ (-+'*,"-Y2!'1M-R3#"0316$ ^1'&-$I!-,,3IJ"`#-$(0)-Q*-*-6$
!-,,35/0#$1'&-$ !-,,3R/0#2',,7'2]$!-,,3R/0#RB3),(R6-)/02-)3*"01MR]-`6$
5/0#!-,,35)-M*,')$
1'&-$ !-,,3R)-M*,')2',,7'2]$!-,,3R)-M*,')RB3),(R6-)/02
8/10/2019 Rabbit MQ y Symfony2
73/81
Anonymous Consumer
Anonymous Consumer
8/10/2019 Rabbit MQ y Symfony2
74/81
y
#)3(*2-)6$
!-,,3$
2311-2"031$ (-+'*,"
-Y2!'1M-R3#"0316$ ^1'&-$I!-,,3IJ"`#-
Anonymous Consumer
8/10/2019 Rabbit MQ y Symfony2
75/81
y
'131R2316*&-)6$
!-,,3$
2311-2"031$ (-+'*,"
-Y2!'1M-R3#"0316$ ^1'&-$I!-,,3IJ"`#-2',,7'2]$ !-,,3RB3),(R6-)/02-
Anonymous Consumer
8/10/2019 Rabbit MQ y Symfony2
76/81
y
.%'##%23163,-R(-/ )'770"&Q$'13152316*&-) 6+
8/10/2019 Rabbit MQ y Symfony2
77/81
g
8/10/2019 Rabbit MQ y Symfony2
78/81
8/10/2019 Rabbit MQ y Symfony2
79/81
Demo time
Summary
8/10/2019 Rabbit MQ y Symfony2
80/81
! RabbitMQ is fast
! and reliable
! also language agnostic
! and easy to install and use
! gives you flexibility
! supports high-availability, clustering
8/10/2019 Rabbit MQ y Symfony2
81/81
Tank
!