SlideShare a Scribd company logo
1 of 33
Download to read offline
Follow this topic:
@rjsmelo
Redis & ZeroMQ: How to
scale your application
RICARDO MELO
Presented at #PHPLX – 11 July 2013
@rjsmelo 2
RICARDO MELO
● CTO @ DRI
● PHP, Mysql, Linux and lots of other
OSS
● ZCE, RHCE, LPI 3, ITIL, etc
● +10 years building (and breaking)
things
@rjsmelo 3
About
● 14 Year old academic spin-off
● Pragmatic OSS Orientation
● PHP, Mysql, SugarCRM, Drupal,
JavaScript, Linux, etc.
● Crafters, Integrators
● Always looking for software developers
– Yes, right now!
1999 - 2013 DRI. Some Rights Reserved. 4
Outline
● Redis
● ZeroMQ
● Use Cases
● Conclusions
1999 - 2013 DRI. Some Rights Reserved. 5
Redis
“Redis is an open source, BSD licensed,
advanced key-value store. It is often
referred to as a data structure server
since keys can contain strings, hashes,
lists, sets and sorted sets.”
source: http://redis.io
1999 - 2013 DRI. Some Rights Reserved. 6
Predis
● Pure PHP Redis Client
– https://github.com/nrk/predis
● Use composer:
– composer install
{
"name": "rjsmelo/talk-redis-zmq",
"description": "Sample code for Redis & ZeroMQ presentation",
"require": {
"ext-zmq": "*",
"predis/predis": "dev-master"
},
"license": "Apache-2.0",
"authors": [
{
"name": "Ricardo Melo",
"email": "ricardo.melo@dri.pt"
}
]
}
1999 - 2013 DRI. Some Rights Reserved. 7
Strings
1 <?php
2 //redis_strings.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 // Using SET
7 $redis->set("SampleKey", "Throw me any thing here....");
8 echo $redis->get("SampleKey") . "n"; // Throw me any thing here....
9
10 // Remove Key
11 $redis->del("SampleKey");
12
13 // Using APPEND
14 $redis->append("SampleKey", "Hello"); // Hello
15 $redis->append("SampleKey", " World!"); // Hello World!
16 echo $redis->get("SampleKey") . "n";
17
18 // Other commands: incr, decr, incrby, getrange, setrange
19 // http://redis.io/commands/#string
1999 - 2013 DRI. Some Rights Reserved. 8
Lists
1 <?php
2 //redis_lists.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 $redis->del('SampleList');
7
8 // Using {L,R}PUSH
9 $redis->lpush('SampleList', 'a'); // a
10 $redis->lpush('SampleList', 'b'); // b, a
11 $redis->rpush('SampleList', 'c'); // b, a, c
12
13 // Using LLEN
14 echo $redis->llen('SampleList') . "n"; // 3
15
16 // Using LINDEX (note: zero indexed)
17 echo $redis->lindex('SampleList', 1) . "n"; // a
18
19 // Using {L,R}POP
20
21 echo $redis->lpop('SampleList') . "n"; // b
22 echo $redis->rpop('SampleList') . "n"; // c
23
24 // Other commands: lrange, rpoplpush
25 // http://redis.io/commands#list
1999 - 2013 DRI. Some Rights Reserved. 9
Sets
1 <?php
2 //redis_sets.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 $redis->del('SampleSet');
7 $redis->del('OtherSampleSet');
8
9 // Using SADD
10 $redis->sadd('SampleSet', 'Hello'); // Hello
11 $redis->sadd('SampleSet', 'World'); // Hello, World
12 $redis->sadd('SampleSet', 'World'); // Hello, World
13
14 // Using SMEMBERS
15 var_dump($redis->smembers('SampleSet')); // Hello, World
16
17 // Using SINTER
18 $redis->sadd('OtherSampleSet', 'Hello');
19 $redis->sadd('OtherSampleSet', 'All');
20 var_dump($redis->sinter('SampleSet', 'OtherSampleSet')); // Hello
21
22 // Using SUNION
23 var_dump($redis->sunion('SampleSet', 'OtherSampleSet')); // Hello, World, All
24
25 // Other commands: smove, srandmember, srem, scard
26 // http://redis.io/commands#set
1999 - 2013 DRI. Some Rights Reserved. 10
Hashes
1 <?php
2 //redis_hashes.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 $redis->del('SampleHash');
7
8 // Using HMSET
9 $redis->hmset("SampleHash", array(
10 'prop_a' => 'aaa',
11 'prop_b' => 'bbb',
12 ));
13
14 // Using HGETALL
15 var_dump($redis->hgetall("SampleHash")); // prop_a=>aaa, prop_b=>bbb
16
17 // Using HSET
18 $redis->hset('SampleHash', 'prop_b', 'ccc');
19
20 //USING HGET
21 echo $redis->hget("SampleHash", 'prop_b') ."n"; // ccc
22
23 // Other commands: hexists, hdel, hlen, hkeys, hvals
24 // http://redis.io/commands/#hash
1999 - 2013 DRI. Some Rights Reserved. 11
Sorted Sets
1 <?php
2 //redis_sorted_sets.php
3 require_once __DIR__ . '/../vendor/autoload.php';
4 $redis = new PredisClient('tcp://localhost:6379');
5
6 $redis->del('SampleSortedSet');
7
8 // Using SADD
9 $redis->zadd('SampleSortedSet', 1, 'Hello'); // Hello(1)
10 $redis->zadd('SampleSortedSet', 2, 'World'); // Hello(1), World(2)
11 $redis->zadd('SampleSortedSet', 3, 'World'); // Hello(1), World(3)
12
13 // Using ZRANGE
14 var_dump($redis->zrange('SampleSortedSet', 0, -1,
array('withscores'=>true))); // Hello(1), World(3)
15
16 // Using ZSCORE
17 echo $redis->zscore('SampleSortedSet', 'World') . "n"; // 3
18
19 // Other commands: zrank, zrevrange, zrangebyscore, zremrangebyscore
20 // http://redis.io/commands#sorted_set
1999 - 2013 DRI. Some Rights Reserved. 12
ZeroMQ
“ØMQ is a high-performance asynchronous
messaging library aimed at use in scalable
distributed or concurrent applications. It provides a
message queue, but unlike message-oriented
middleware, a ØMQ system can run without a
dedicated message broker. With bindings for 30+
languages”
source: https://en.wikipedia.org/wiki/%C3%98MQ
1999 - 2013 DRI. Some Rights Reserved. 13
PHP Module - zmq
#
# ZMQ instalation - http://www.zeromq.org/intro:get-the-software
#
tar xzvf zeromq-3.2.2.tar.gz
cd zeromq-3.2.2
./configure
make
make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
#
# ZMQ PHP Binding Instalation
#
pear channel-discover pear.zero.mq
pecl install pear.zero.mq/zmq-beta
echo "extension=zmq.so" > /etc/php.d/zmq.ini
1999 - 2013 DRI. Some Rights Reserved. 14
Socket Types
● Threads in a process (inproc://)
● Processes in a box (ipc://)
● Processes over the network (tcp://)
● Multicast group (pgm://)
1999 - 2013 DRI. Some Rights Reserved. 15
Pattern: Request - Reply
1999 - 2013 DRI. Some Rights Reserved. 16
Pattern: Request - Reply
1 <?php
2 // zmq_request.php
3 $context = new ZMQContext();
4
5 $requester = new ZMQSocket($context, ZMQ::SOCKET_REQ);
6 $requester->connect("tcp://localhost:5555");
7
8 for ($number = 0 ; $number <= 10 ; $number++) {
9 $mensage = "Hello " . $number . "!";
10 echo "Sending - " . $mensage . "n";
11 $requester->send($mensage);
12 $reply = $requester->recv();
13 echo "Received - " . $reply . "n";
14 }
1 <?php
2 //zmq_reply.php
3 $context = new ZMQContext();
4
5 $responder = new ZMQSocket($context, ZMQ::SOCKET_REP);
6 $responder->bind("tcp://*:5555");
7
8 while (true) {
9 $request = $responder->recv();
10 echo $request . "n";
11 sleep (1); // some work
12 $responder->send("Reply to: " . $request);
13 }
1999 - 2013 DRI. Some Rights Reserved. 17
Pattern: Publish - Subscribe
1999 - 2013 DRI. Some Rights Reserved. 18
Pattern: Publish - Subscribe
1 <?php
2 // zmq_publisher.php
3 $context = new ZMQContext();
4
5 $publisher = $context->getSocket(ZMQ::SOCKET_PUB);
6 $publisher->bind("tcp://*:5556");
7
8 $timezones = array('UTC', 'EST');
9 while (true) {
10 foreach($timezones as $tz) {
11 date_default_timezone_set($tz);
12 $message = date('T:c'); // the message to broadcast
13 $publisher->send($message);
14 }
15 sleep(1);
16 } 1 <?php
2 // zmq_subscriber.php
3 $context = new ZMQContext();
4
5 $subscriber = $context->getSocket(ZMQ::SOCKET_SUB);
6 $subscriber->connect("tcp://localhost:5556");
7
8 $filter = $_SERVER['argc'] > 1 ? $_SERVER['argv'][1] : "UTC";
9 $subscriber->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, $filter);
10
11 while (true) {
12 $message = $subscriber->recv();
13 echo substr($message,4) . "n"; // remove prefix
14 }
1999 - 2013 DRI. Some Rights Reserved. 19
Pattern: Pipeline
20
Pattern: Pipeline
1 <?php
2 // zmq_ventilator.php
3 // extracted from: http://zguide.zeromq.org/
4
5 $context = new ZMQContext();
6
7 // Socket to send messages on
8 $sender = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
9 $sender->bind("tcp://*:5557");
10
11 echo "Press Enter when the workers are ready: ";
12 $fp = fopen('php://stdin', 'r');
13 $line = fgets($fp, 512);
14 fclose($fp);
15 echo "Sending tasks to workersâÀ¦", PHP_EOL;
16
17 // The first message is "0" and signals start of batch
18 $sender->send(0);
19
20 // Send 100 tasks
21 $total_msec = 0; // Total expected cost in msecs
22 for ($task_nbr = 0; $task_nbr < 100; $task_nbr++) {
23 // Random workload from 1 to 100msecs
24 $workload = mt_rand(1, 100);
25 $total_msec += $workload;
26 $sender->send($workload);
27
28 }
29
30 printf ("Total expected cost: %d msecn", $total_msec);
31 sleep (1); // Give 0MQ time to deliver
1999 - 2013 DRI. Some Rights Reserved. 21
Pattern: Pipeline
1 <?php
2 // zmq_worker.php
3 // extracted from: http://zguide.zeromq.org/
4
5 $context = new ZMQContext();
6
7 // Socket to receive messages on
8 $receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL);
9 $receiver->connect("tcp://localhost:5557");
10
11 // Socket to send messages to
12 $sender = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
13 $sender->connect("tcp://localhost:5558");
14
15 // Process tasks forever
16 while (true) {
17 $string = $receiver->recv();
18
19 // Simple progress indicator for the viewer
20 echo $string, PHP_EOL;
21
22 // Do the work
23 usleep($string * 1000);
24
25 // Send results to sink
26 $sender->send("");
27 }
22
Pattern: Pipeline
1 <?php
2 // zmq_sink.php
3 // extracted from: http://zguide.zeromq.org/
4
5 // Prepare our context and socket
6 $context = new ZMQContext();
7 $receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL);
8 $receiver->bind("tcp://*:5558");
9
10 // Wait for start of batch
11 $string = $receiver->recv();
12
13 // Start our clock now
14 $tstart = microtime(true);
15
16 // Process 100 confirmations
17 $total_msec = 0; // Total calculated cost in msecs
18 for ($task_nbr = 0; $task_nbr < 100; $task_nbr++) {
19 $string = $receiver->recv();
20 if ($task_nbr % 10 == 0) {
21 echo ":";
22 } else {
23 echo ".";
24 }
25 }
26
27 $tend = microtime(true);
28
29 $total_msec = ($tend - $tstart) * 1000;
30 echo PHP_EOL;
31 printf ("Total elapsed time: %d msec", $total_msec);
32 echo PHP_EOL;
1999 - 2013 DRI. Some Rights Reserved. 23
Pattern: Pipeline
1999 - 2013 DRI. Some Rights Reserved. 24
Use Case: Service Cluster
Reference: http://zguide.zeromq.org/page:all#Service-Oriented-Reliable-Queuing-Majordomo-Pattern
1999 - 2013 DRI. Some Rights Reserved. 25
Use Case: “Unix Style” Application
● Lots of simple, “focused” programs
– Or in different servers, different languages, etc
● All components collaborate to get the
job done
– cat file | sort | uniq -c
● Glue everything with ZeroMQ
1999 - 2013 DRI. Some Rights Reserved. 26
Use Case: Cache
● We need to cache some values for
speed
● Use SET / GET on Redis
● I could use memcache, but this is a
Redis Talk :-)
● They have similar performance
– http://redis.io/topics/benchmarks
1999 - 2013 DRI. Some Rights Reserved. 27
Use Case: Buffer
● Use Redis as a FIFO (or LIFO)
● Hidden Goods
– Decoupling
– Flow control
– rpoplpush
1999 - 2013 DRI. Some Rights Reserved. 28
Use Case: Background Tasks
● Your application needs to do some
heavy work
– Send Email
– Image Resizing
– Mega Huge map-reduce query to your pentabyte cluster :-)
● You don't want to keep your user
waiting
● Send things to background
1999 - 2013 DRI. Some Rights Reserved. 29
Use Case: Background Tasks
● Use Redis as your Job Queue
– Your application should send job to be run and parameters to the
queue
● Use workers to POP jobs from the
queue and do the heavy work.
● Don't reinvent the well
– Look for php-resqueue
1999 - 2013 DRI. Some Rights Reserved. 30
Conclusions
● Both ZeroMQ and Redis are extremely
fast
● ZeroMQ is great to “glue things” as well
as adding flexibility to scale dynamical
● Redis is great as a queue and allows
you to cope with your load.
Thank you
Follow this topic:
@rjsmelo
QA
Code: https://github.com/rjsmelo/talk-redis-zmq
Feedback: https://joind.in/talk/view/8937
www.dri-global.com
@rjsmelo
ricardo.melo@dri-global.com

More Related Content

What's hot

Securing Prometheus exporters using HashiCorp Vault
Securing Prometheus exporters using HashiCorp VaultSecuring Prometheus exporters using HashiCorp Vault
Securing Prometheus exporters using HashiCorp VaultBram Vogelaar
 
All about Zookeeper and ClickHouse Keeper.pdf
All about Zookeeper and ClickHouse Keeper.pdfAll about Zookeeper and ClickHouse Keeper.pdf
All about Zookeeper and ClickHouse Keeper.pdfAltinity Ltd
 
Shipping Data from Postgres to Clickhouse, by Murat Kabilov, Adjust
Shipping Data from Postgres to Clickhouse, by Murat Kabilov, AdjustShipping Data from Postgres to Clickhouse, by Murat Kabilov, Adjust
Shipping Data from Postgres to Clickhouse, by Murat Kabilov, AdjustAltinity Ltd
 
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKMySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKYoungHeon (Roy) Kim
 
Data Warehouses in Kubernetes Visualized: the ClickHouse Kubernetes Operator UI
Data Warehouses in Kubernetes Visualized: the ClickHouse Kubernetes Operator UIData Warehouses in Kubernetes Visualized: the ClickHouse Kubernetes Operator UI
Data Warehouses in Kubernetes Visualized: the ClickHouse Kubernetes Operator UIAltinity Ltd
 
The consequences of sync_binlog != 1
The consequences of sync_binlog != 1The consequences of sync_binlog != 1
The consequences of sync_binlog != 1Jean-François Gagné
 
MariaDB 10.11 key features overview for DBAs
MariaDB 10.11 key features overview for DBAsMariaDB 10.11 key features overview for DBAs
MariaDB 10.11 key features overview for DBAsFederico Razzoli
 
PostgreSQL High_Performance_Cheatsheet
PostgreSQL High_Performance_CheatsheetPostgreSQL High_Performance_Cheatsheet
PostgreSQL High_Performance_CheatsheetLucian Oprea
 
M|18 Deep Dive: InnoDB Transactions and Write Paths
M|18 Deep Dive: InnoDB Transactions and Write PathsM|18 Deep Dive: InnoDB Transactions and Write Paths
M|18 Deep Dive: InnoDB Transactions and Write PathsMariaDB plc
 
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEOClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEOAltinity Ltd
 
Analytics at Speed: Introduction to ClickHouse and Common Use Cases. By Mikha...
Analytics at Speed: Introduction to ClickHouse and Common Use Cases. By Mikha...Analytics at Speed: Introduction to ClickHouse and Common Use Cases. By Mikha...
Analytics at Speed: Introduction to ClickHouse and Common Use Cases. By Mikha...Altinity Ltd
 
Your first ClickHouse data warehouse
Your first ClickHouse data warehouseYour first ClickHouse data warehouse
Your first ClickHouse data warehouseAltinity Ltd
 
MySQL Timeout Variables Explained
MySQL Timeout Variables Explained MySQL Timeout Variables Explained
MySQL Timeout Variables Explained Mydbops
 
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...Altinity Ltd
 
ClickHouse Deep Dive, by Aleksei Milovidov
ClickHouse Deep Dive, by Aleksei MilovidovClickHouse Deep Dive, by Aleksei Milovidov
ClickHouse Deep Dive, by Aleksei MilovidovAltinity Ltd
 
Linux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQLLinux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQLYoshinori Matsunobu
 
Distributed Lock Manager
Distributed Lock ManagerDistributed Lock Manager
Distributed Lock ManagerHao Chen
 
MySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptxMySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptxNeoClova
 

What's hot (20)

Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to Redis
 
Securing Prometheus exporters using HashiCorp Vault
Securing Prometheus exporters using HashiCorp VaultSecuring Prometheus exporters using HashiCorp Vault
Securing Prometheus exporters using HashiCorp Vault
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to Redis
 
All about Zookeeper and ClickHouse Keeper.pdf
All about Zookeeper and ClickHouse Keeper.pdfAll about Zookeeper and ClickHouse Keeper.pdf
All about Zookeeper and ClickHouse Keeper.pdf
 
Shipping Data from Postgres to Clickhouse, by Murat Kabilov, Adjust
Shipping Data from Postgres to Clickhouse, by Murat Kabilov, AdjustShipping Data from Postgres to Clickhouse, by Murat Kabilov, Adjust
Shipping Data from Postgres to Clickhouse, by Murat Kabilov, Adjust
 
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKMySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELK
 
Data Warehouses in Kubernetes Visualized: the ClickHouse Kubernetes Operator UI
Data Warehouses in Kubernetes Visualized: the ClickHouse Kubernetes Operator UIData Warehouses in Kubernetes Visualized: the ClickHouse Kubernetes Operator UI
Data Warehouses in Kubernetes Visualized: the ClickHouse Kubernetes Operator UI
 
The consequences of sync_binlog != 1
The consequences of sync_binlog != 1The consequences of sync_binlog != 1
The consequences of sync_binlog != 1
 
MariaDB 10.11 key features overview for DBAs
MariaDB 10.11 key features overview for DBAsMariaDB 10.11 key features overview for DBAs
MariaDB 10.11 key features overview for DBAs
 
PostgreSQL High_Performance_Cheatsheet
PostgreSQL High_Performance_CheatsheetPostgreSQL High_Performance_Cheatsheet
PostgreSQL High_Performance_Cheatsheet
 
M|18 Deep Dive: InnoDB Transactions and Write Paths
M|18 Deep Dive: InnoDB Transactions and Write PathsM|18 Deep Dive: InnoDB Transactions and Write Paths
M|18 Deep Dive: InnoDB Transactions and Write Paths
 
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEOClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
ClickHouse Query Performance Tips and Tricks, by Robert Hodges, Altinity CEO
 
Analytics at Speed: Introduction to ClickHouse and Common Use Cases. By Mikha...
Analytics at Speed: Introduction to ClickHouse and Common Use Cases. By Mikha...Analytics at Speed: Introduction to ClickHouse and Common Use Cases. By Mikha...
Analytics at Speed: Introduction to ClickHouse and Common Use Cases. By Mikha...
 
Your first ClickHouse data warehouse
Your first ClickHouse data warehouseYour first ClickHouse data warehouse
Your first ClickHouse data warehouse
 
MySQL Timeout Variables Explained
MySQL Timeout Variables Explained MySQL Timeout Variables Explained
MySQL Timeout Variables Explained
 
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
 
ClickHouse Deep Dive, by Aleksei Milovidov
ClickHouse Deep Dive, by Aleksei MilovidovClickHouse Deep Dive, by Aleksei Milovidov
ClickHouse Deep Dive, by Aleksei Milovidov
 
Linux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQLLinux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQL
 
Distributed Lock Manager
Distributed Lock ManagerDistributed Lock Manager
Distributed Lock Manager
 
MySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptxMySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB-성능개선-202201.pptx
 

Viewers also liked

Europycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQEuropycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQfcrippa
 
Overview of ZeroMQ
Overview of ZeroMQOverview of ZeroMQ
Overview of ZeroMQpieterh
 
Software Architecture over ZeroMQ
Software Architecture over ZeroMQSoftware Architecture over ZeroMQ
Software Architecture over ZeroMQpieterh
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The AnswerIan Barber
 
FOSDEM 2011 - 0MQ
FOSDEM 2011 - 0MQFOSDEM 2011 - 0MQ
FOSDEM 2011 - 0MQpieterh
 
Build reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQBuild reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQRobin Xiao
 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueGleicon Moraes
 
ZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsJames Dennis
 
Redis everywhere - PHP London
Redis everywhere - PHP LondonRedis everywhere - PHP London
Redis everywhere - PHP LondonRicard Clau
 
ZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 VersionZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 VersionIan Barber
 
Incremental Development with Lisp: Building a Game and a Website
Incremental Development with Lisp: Building a Game and a WebsiteIncremental Development with Lisp: Building a Game and a Website
Incremental Development with Lisp: Building a Game and a WebsiteJames Long
 
p5.js について
p5.js についてp5.js について
p5.js についてreona396
 
ZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
ZeroMQ e Redis: soluzioni open source per l'integrazione di componentiZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
ZeroMQ e Redis: soluzioni open source per l'integrazione di componentiMatteo Fortini
 
Zmq in context of openstack
Zmq in context of openstackZmq in context of openstack
Zmq in context of openstackYatin Kumbhare
 
Lisp for Python Programmers
Lisp for Python ProgrammersLisp for Python Programmers
Lisp for Python ProgrammersVsevolod Dyomkin
 
Asynchronous PHP and Real-time Messaging
Asynchronous PHP and Real-time MessagingAsynchronous PHP and Real-time Messaging
Asynchronous PHP and Real-time MessagingSteve Rhoades
 
4 evolution-of-programming-languages
4 evolution-of-programming-languages4 evolution-of-programming-languages
4 evolution-of-programming-languagesRohit Shrivastava
 
Introduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalkIntroduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalkMahmoud Said
 
Building ZingMe News Feed System
Building ZingMe News Feed SystemBuilding ZingMe News Feed System
Building ZingMe News Feed SystemChau Thanh
 

Viewers also liked (20)

Europycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQEuropycon2011: Implementing distributed application using ZeroMQ
Europycon2011: Implementing distributed application using ZeroMQ
 
Overview of ZeroMQ
Overview of ZeroMQOverview of ZeroMQ
Overview of ZeroMQ
 
Software Architecture over ZeroMQ
Software Architecture over ZeroMQSoftware Architecture over ZeroMQ
Software Architecture over ZeroMQ
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The Answer
 
FOSDEM 2011 - 0MQ
FOSDEM 2011 - 0MQFOSDEM 2011 - 0MQ
FOSDEM 2011 - 0MQ
 
Build reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQBuild reliable, traceable, distributed systems with ZeroMQ
Build reliable, traceable, distributed systems with ZeroMQ
 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message Queue
 
ZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 Labs
 
Redis everywhere - PHP London
Redis everywhere - PHP LondonRedis everywhere - PHP London
Redis everywhere - PHP London
 
ZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 VersionZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 Version
 
Incremental Development with Lisp: Building a Game and a Website
Incremental Development with Lisp: Building a Game and a WebsiteIncremental Development with Lisp: Building a Game and a Website
Incremental Development with Lisp: Building a Game and a Website
 
ZeroMQ in PHP
ZeroMQ in PHPZeroMQ in PHP
ZeroMQ in PHP
 
p5.js について
p5.js についてp5.js について
p5.js について
 
ZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
ZeroMQ e Redis: soluzioni open source per l'integrazione di componentiZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
ZeroMQ e Redis: soluzioni open source per l'integrazione di componenti
 
Zmq in context of openstack
Zmq in context of openstackZmq in context of openstack
Zmq in context of openstack
 
Lisp for Python Programmers
Lisp for Python ProgrammersLisp for Python Programmers
Lisp for Python Programmers
 
Asynchronous PHP and Real-time Messaging
Asynchronous PHP and Real-time MessagingAsynchronous PHP and Real-time Messaging
Asynchronous PHP and Real-time Messaging
 
4 evolution-of-programming-languages
4 evolution-of-programming-languages4 evolution-of-programming-languages
4 evolution-of-programming-languages
 
Introduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalkIntroduction to ZeroMQ - eSpace TechTalk
Introduction to ZeroMQ - eSpace TechTalk
 
Building ZingMe News Feed System
Building ZingMe News Feed SystemBuilding ZingMe News Feed System
Building ZingMe News Feed System
 

Similar to Redis & ZeroMQ: How to scale your application

OWASP TOP 10 for PHP Programmers
OWASP TOP 10 for PHP ProgrammersOWASP TOP 10 for PHP Programmers
OWASP TOP 10 for PHP Programmersrjsmelo
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday DeveloperRoss Tuck
 
The Truth About Lambdas in PHP
The Truth About Lambdas in PHPThe Truth About Lambdas in PHP
The Truth About Lambdas in PHPSharon Levy
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous phpWim Godden
 
ZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionIan Barber
 
4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebookguoqing75
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统yiditushe
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous phpWim Godden
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframeworkRadek Benkel
 
Melhorando sua API com DSLs
Melhorando sua API com DSLsMelhorando sua API com DSLs
Melhorando sua API com DSLsAugusto Pascutti
 
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSLPHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSLiMasters
 
Drupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdfDrupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdfLuca Lusso
 
2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pagessparkfabrik
 
Debugging: Rules & Tools
Debugging: Rules & ToolsDebugging: Rules & Tools
Debugging: Rules & ToolsIan Barber
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Kang-min Liu
 
Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionDebugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionIan Barber
 
PHP Data Objects
PHP Data ObjectsPHP Data Objects
PHP Data ObjectsWez Furlong
 
PHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP LimogesPHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP Limoges✅ William Pinaud
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applicationselliando dias
 

Similar to Redis & ZeroMQ: How to scale your application (20)

OWASP TOP 10 for PHP Programmers
OWASP TOP 10 for PHP ProgrammersOWASP TOP 10 for PHP Programmers
OWASP TOP 10 for PHP Programmers
 
Fatc
FatcFatc
Fatc
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday Developer
 
The Truth About Lambdas in PHP
The Truth About Lambdas in PHPThe Truth About Lambdas in PHP
The Truth About Lambdas in PHP
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous php
 
ZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 Version
 
4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous php
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframework
 
Melhorando sua API com DSLs
Melhorando sua API com DSLsMelhorando sua API com DSLs
Melhorando sua API com DSLs
 
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSLPHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
PHP Experience 2016 - [Palestra] Melhorando a comunicação da API através de DSL
 
Drupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdfDrupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdf
 
2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages
 
Debugging: Rules & Tools
Debugging: Rules & ToolsDebugging: Rules & Tools
Debugging: Rules & Tools
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 
Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionDebugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 Version
 
PHP Data Objects
PHP Data ObjectsPHP Data Objects
PHP Data Objects
 
PHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP LimogesPHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP Limoges
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 

More from rjsmelo

Docker and Running multiple versions of PHP @ CareerZoo Dublin
Docker and Running multiple versions of PHP @ CareerZoo DublinDocker and Running multiple versions of PHP @ CareerZoo Dublin
Docker and Running multiple versions of PHP @ CareerZoo Dublinrjsmelo
 
Docker & PHP - Practical use case
Docker & PHP - Practical use caseDocker & PHP - Practical use case
Docker & PHP - Practical use caserjsmelo
 
PHP QA Tools
PHP QA ToolsPHP QA Tools
PHP QA Toolsrjsmelo
 
PHPUnit your bug exterminator
PHPUnit your bug exterminatorPHPUnit your bug exterminator
PHPUnit your bug exterminatorrjsmelo
 
A Certificação LPI
A Certificação LPIA Certificação LPI
A Certificação LPIrjsmelo
 
PHP and Application Security - OWASP Road Show 2013
PHP and Application Security - OWASP Road Show 2013PHP and Application Security - OWASP Road Show 2013
PHP and Application Security - OWASP Road Show 2013rjsmelo
 
PHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicaçõesPHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicaçõesrjsmelo
 

More from rjsmelo (7)

Docker and Running multiple versions of PHP @ CareerZoo Dublin
Docker and Running multiple versions of PHP @ CareerZoo DublinDocker and Running multiple versions of PHP @ CareerZoo Dublin
Docker and Running multiple versions of PHP @ CareerZoo Dublin
 
Docker & PHP - Practical use case
Docker & PHP - Practical use caseDocker & PHP - Practical use case
Docker & PHP - Practical use case
 
PHP QA Tools
PHP QA ToolsPHP QA Tools
PHP QA Tools
 
PHPUnit your bug exterminator
PHPUnit your bug exterminatorPHPUnit your bug exterminator
PHPUnit your bug exterminator
 
A Certificação LPI
A Certificação LPIA Certificação LPI
A Certificação LPI
 
PHP and Application Security - OWASP Road Show 2013
PHP and Application Security - OWASP Road Show 2013PHP and Application Security - OWASP Road Show 2013
PHP and Application Security - OWASP Road Show 2013
 
PHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicaçõesPHP e a (in)segurança de aplicações
PHP e a (in)segurança de aplicações
 

Recently uploaded

Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 

Recently uploaded (20)

Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 

Redis & ZeroMQ: How to scale your application

  • 1. Follow this topic: @rjsmelo Redis & ZeroMQ: How to scale your application RICARDO MELO Presented at #PHPLX – 11 July 2013
  • 2. @rjsmelo 2 RICARDO MELO ● CTO @ DRI ● PHP, Mysql, Linux and lots of other OSS ● ZCE, RHCE, LPI 3, ITIL, etc ● +10 years building (and breaking) things
  • 3. @rjsmelo 3 About ● 14 Year old academic spin-off ● Pragmatic OSS Orientation ● PHP, Mysql, SugarCRM, Drupal, JavaScript, Linux, etc. ● Crafters, Integrators ● Always looking for software developers – Yes, right now!
  • 4. 1999 - 2013 DRI. Some Rights Reserved. 4 Outline ● Redis ● ZeroMQ ● Use Cases ● Conclusions
  • 5. 1999 - 2013 DRI. Some Rights Reserved. 5 Redis “Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.” source: http://redis.io
  • 6. 1999 - 2013 DRI. Some Rights Reserved. 6 Predis ● Pure PHP Redis Client – https://github.com/nrk/predis ● Use composer: – composer install { "name": "rjsmelo/talk-redis-zmq", "description": "Sample code for Redis & ZeroMQ presentation", "require": { "ext-zmq": "*", "predis/predis": "dev-master" }, "license": "Apache-2.0", "authors": [ { "name": "Ricardo Melo", "email": "ricardo.melo@dri.pt" } ] }
  • 7. 1999 - 2013 DRI. Some Rights Reserved. 7 Strings 1 <?php 2 //redis_strings.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 // Using SET 7 $redis->set("SampleKey", "Throw me any thing here...."); 8 echo $redis->get("SampleKey") . "n"; // Throw me any thing here.... 9 10 // Remove Key 11 $redis->del("SampleKey"); 12 13 // Using APPEND 14 $redis->append("SampleKey", "Hello"); // Hello 15 $redis->append("SampleKey", " World!"); // Hello World! 16 echo $redis->get("SampleKey") . "n"; 17 18 // Other commands: incr, decr, incrby, getrange, setrange 19 // http://redis.io/commands/#string
  • 8. 1999 - 2013 DRI. Some Rights Reserved. 8 Lists 1 <?php 2 //redis_lists.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 $redis->del('SampleList'); 7 8 // Using {L,R}PUSH 9 $redis->lpush('SampleList', 'a'); // a 10 $redis->lpush('SampleList', 'b'); // b, a 11 $redis->rpush('SampleList', 'c'); // b, a, c 12 13 // Using LLEN 14 echo $redis->llen('SampleList') . "n"; // 3 15 16 // Using LINDEX (note: zero indexed) 17 echo $redis->lindex('SampleList', 1) . "n"; // a 18 19 // Using {L,R}POP 20 21 echo $redis->lpop('SampleList') . "n"; // b 22 echo $redis->rpop('SampleList') . "n"; // c 23 24 // Other commands: lrange, rpoplpush 25 // http://redis.io/commands#list
  • 9. 1999 - 2013 DRI. Some Rights Reserved. 9 Sets 1 <?php 2 //redis_sets.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 $redis->del('SampleSet'); 7 $redis->del('OtherSampleSet'); 8 9 // Using SADD 10 $redis->sadd('SampleSet', 'Hello'); // Hello 11 $redis->sadd('SampleSet', 'World'); // Hello, World 12 $redis->sadd('SampleSet', 'World'); // Hello, World 13 14 // Using SMEMBERS 15 var_dump($redis->smembers('SampleSet')); // Hello, World 16 17 // Using SINTER 18 $redis->sadd('OtherSampleSet', 'Hello'); 19 $redis->sadd('OtherSampleSet', 'All'); 20 var_dump($redis->sinter('SampleSet', 'OtherSampleSet')); // Hello 21 22 // Using SUNION 23 var_dump($redis->sunion('SampleSet', 'OtherSampleSet')); // Hello, World, All 24 25 // Other commands: smove, srandmember, srem, scard 26 // http://redis.io/commands#set
  • 10. 1999 - 2013 DRI. Some Rights Reserved. 10 Hashes 1 <?php 2 //redis_hashes.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 $redis->del('SampleHash'); 7 8 // Using HMSET 9 $redis->hmset("SampleHash", array( 10 'prop_a' => 'aaa', 11 'prop_b' => 'bbb', 12 )); 13 14 // Using HGETALL 15 var_dump($redis->hgetall("SampleHash")); // prop_a=>aaa, prop_b=>bbb 16 17 // Using HSET 18 $redis->hset('SampleHash', 'prop_b', 'ccc'); 19 20 //USING HGET 21 echo $redis->hget("SampleHash", 'prop_b') ."n"; // ccc 22 23 // Other commands: hexists, hdel, hlen, hkeys, hvals 24 // http://redis.io/commands/#hash
  • 11. 1999 - 2013 DRI. Some Rights Reserved. 11 Sorted Sets 1 <?php 2 //redis_sorted_sets.php 3 require_once __DIR__ . '/../vendor/autoload.php'; 4 $redis = new PredisClient('tcp://localhost:6379'); 5 6 $redis->del('SampleSortedSet'); 7 8 // Using SADD 9 $redis->zadd('SampleSortedSet', 1, 'Hello'); // Hello(1) 10 $redis->zadd('SampleSortedSet', 2, 'World'); // Hello(1), World(2) 11 $redis->zadd('SampleSortedSet', 3, 'World'); // Hello(1), World(3) 12 13 // Using ZRANGE 14 var_dump($redis->zrange('SampleSortedSet', 0, -1, array('withscores'=>true))); // Hello(1), World(3) 15 16 // Using ZSCORE 17 echo $redis->zscore('SampleSortedSet', 'World') . "n"; // 3 18 19 // Other commands: zrank, zrevrange, zrangebyscore, zremrangebyscore 20 // http://redis.io/commands#sorted_set
  • 12. 1999 - 2013 DRI. Some Rights Reserved. 12 ZeroMQ “ØMQ is a high-performance asynchronous messaging library aimed at use in scalable distributed or concurrent applications. It provides a message queue, but unlike message-oriented middleware, a ØMQ system can run without a dedicated message broker. With bindings for 30+ languages” source: https://en.wikipedia.org/wiki/%C3%98MQ
  • 13. 1999 - 2013 DRI. Some Rights Reserved. 13 PHP Module - zmq # # ZMQ instalation - http://www.zeromq.org/intro:get-the-software # tar xzvf zeromq-3.2.2.tar.gz cd zeromq-3.2.2 ./configure make make install echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf ldconfig # # ZMQ PHP Binding Instalation # pear channel-discover pear.zero.mq pecl install pear.zero.mq/zmq-beta echo "extension=zmq.so" > /etc/php.d/zmq.ini
  • 14. 1999 - 2013 DRI. Some Rights Reserved. 14 Socket Types ● Threads in a process (inproc://) ● Processes in a box (ipc://) ● Processes over the network (tcp://) ● Multicast group (pgm://)
  • 15. 1999 - 2013 DRI. Some Rights Reserved. 15 Pattern: Request - Reply
  • 16. 1999 - 2013 DRI. Some Rights Reserved. 16 Pattern: Request - Reply 1 <?php 2 // zmq_request.php 3 $context = new ZMQContext(); 4 5 $requester = new ZMQSocket($context, ZMQ::SOCKET_REQ); 6 $requester->connect("tcp://localhost:5555"); 7 8 for ($number = 0 ; $number <= 10 ; $number++) { 9 $mensage = "Hello " . $number . "!"; 10 echo "Sending - " . $mensage . "n"; 11 $requester->send($mensage); 12 $reply = $requester->recv(); 13 echo "Received - " . $reply . "n"; 14 } 1 <?php 2 //zmq_reply.php 3 $context = new ZMQContext(); 4 5 $responder = new ZMQSocket($context, ZMQ::SOCKET_REP); 6 $responder->bind("tcp://*:5555"); 7 8 while (true) { 9 $request = $responder->recv(); 10 echo $request . "n"; 11 sleep (1); // some work 12 $responder->send("Reply to: " . $request); 13 }
  • 17. 1999 - 2013 DRI. Some Rights Reserved. 17 Pattern: Publish - Subscribe
  • 18. 1999 - 2013 DRI. Some Rights Reserved. 18 Pattern: Publish - Subscribe 1 <?php 2 // zmq_publisher.php 3 $context = new ZMQContext(); 4 5 $publisher = $context->getSocket(ZMQ::SOCKET_PUB); 6 $publisher->bind("tcp://*:5556"); 7 8 $timezones = array('UTC', 'EST'); 9 while (true) { 10 foreach($timezones as $tz) { 11 date_default_timezone_set($tz); 12 $message = date('T:c'); // the message to broadcast 13 $publisher->send($message); 14 } 15 sleep(1); 16 } 1 <?php 2 // zmq_subscriber.php 3 $context = new ZMQContext(); 4 5 $subscriber = $context->getSocket(ZMQ::SOCKET_SUB); 6 $subscriber->connect("tcp://localhost:5556"); 7 8 $filter = $_SERVER['argc'] > 1 ? $_SERVER['argv'][1] : "UTC"; 9 $subscriber->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, $filter); 10 11 while (true) { 12 $message = $subscriber->recv(); 13 echo substr($message,4) . "n"; // remove prefix 14 }
  • 19. 1999 - 2013 DRI. Some Rights Reserved. 19 Pattern: Pipeline
  • 20. 20 Pattern: Pipeline 1 <?php 2 // zmq_ventilator.php 3 // extracted from: http://zguide.zeromq.org/ 4 5 $context = new ZMQContext(); 6 7 // Socket to send messages on 8 $sender = new ZMQSocket($context, ZMQ::SOCKET_PUSH); 9 $sender->bind("tcp://*:5557"); 10 11 echo "Press Enter when the workers are ready: "; 12 $fp = fopen('php://stdin', 'r'); 13 $line = fgets($fp, 512); 14 fclose($fp); 15 echo "Sending tasks to workersâÀ¦", PHP_EOL; 16 17 // The first message is "0" and signals start of batch 18 $sender->send(0); 19 20 // Send 100 tasks 21 $total_msec = 0; // Total expected cost in msecs 22 for ($task_nbr = 0; $task_nbr < 100; $task_nbr++) { 23 // Random workload from 1 to 100msecs 24 $workload = mt_rand(1, 100); 25 $total_msec += $workload; 26 $sender->send($workload); 27 28 } 29 30 printf ("Total expected cost: %d msecn", $total_msec); 31 sleep (1); // Give 0MQ time to deliver
  • 21. 1999 - 2013 DRI. Some Rights Reserved. 21 Pattern: Pipeline 1 <?php 2 // zmq_worker.php 3 // extracted from: http://zguide.zeromq.org/ 4 5 $context = new ZMQContext(); 6 7 // Socket to receive messages on 8 $receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL); 9 $receiver->connect("tcp://localhost:5557"); 10 11 // Socket to send messages to 12 $sender = new ZMQSocket($context, ZMQ::SOCKET_PUSH); 13 $sender->connect("tcp://localhost:5558"); 14 15 // Process tasks forever 16 while (true) { 17 $string = $receiver->recv(); 18 19 // Simple progress indicator for the viewer 20 echo $string, PHP_EOL; 21 22 // Do the work 23 usleep($string * 1000); 24 25 // Send results to sink 26 $sender->send(""); 27 }
  • 22. 22 Pattern: Pipeline 1 <?php 2 // zmq_sink.php 3 // extracted from: http://zguide.zeromq.org/ 4 5 // Prepare our context and socket 6 $context = new ZMQContext(); 7 $receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL); 8 $receiver->bind("tcp://*:5558"); 9 10 // Wait for start of batch 11 $string = $receiver->recv(); 12 13 // Start our clock now 14 $tstart = microtime(true); 15 16 // Process 100 confirmations 17 $total_msec = 0; // Total calculated cost in msecs 18 for ($task_nbr = 0; $task_nbr < 100; $task_nbr++) { 19 $string = $receiver->recv(); 20 if ($task_nbr % 10 == 0) { 21 echo ":"; 22 } else { 23 echo "."; 24 } 25 } 26 27 $tend = microtime(true); 28 29 $total_msec = ($tend - $tstart) * 1000; 30 echo PHP_EOL; 31 printf ("Total elapsed time: %d msec", $total_msec); 32 echo PHP_EOL;
  • 23. 1999 - 2013 DRI. Some Rights Reserved. 23 Pattern: Pipeline
  • 24. 1999 - 2013 DRI. Some Rights Reserved. 24 Use Case: Service Cluster Reference: http://zguide.zeromq.org/page:all#Service-Oriented-Reliable-Queuing-Majordomo-Pattern
  • 25. 1999 - 2013 DRI. Some Rights Reserved. 25 Use Case: “Unix Style” Application ● Lots of simple, “focused” programs – Or in different servers, different languages, etc ● All components collaborate to get the job done – cat file | sort | uniq -c ● Glue everything with ZeroMQ
  • 26. 1999 - 2013 DRI. Some Rights Reserved. 26 Use Case: Cache ● We need to cache some values for speed ● Use SET / GET on Redis ● I could use memcache, but this is a Redis Talk :-) ● They have similar performance – http://redis.io/topics/benchmarks
  • 27. 1999 - 2013 DRI. Some Rights Reserved. 27 Use Case: Buffer ● Use Redis as a FIFO (or LIFO) ● Hidden Goods – Decoupling – Flow control – rpoplpush
  • 28. 1999 - 2013 DRI. Some Rights Reserved. 28 Use Case: Background Tasks ● Your application needs to do some heavy work – Send Email – Image Resizing – Mega Huge map-reduce query to your pentabyte cluster :-) ● You don't want to keep your user waiting ● Send things to background
  • 29. 1999 - 2013 DRI. Some Rights Reserved. 29 Use Case: Background Tasks ● Use Redis as your Job Queue – Your application should send job to be run and parameters to the queue ● Use workers to POP jobs from the queue and do the heavy work. ● Don't reinvent the well – Look for php-resqueue
  • 30. 1999 - 2013 DRI. Some Rights Reserved. 30 Conclusions ● Both ZeroMQ and Redis are extremely fast ● ZeroMQ is great to “glue things” as well as adding flexibility to scale dynamical ● Redis is great as a queue and allows you to cope with your load.
  • 32. Follow this topic: @rjsmelo QA Code: https://github.com/rjsmelo/talk-redis-zmq Feedback: https://joind.in/talk/view/8937