SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
QUEUES & WORKERS
FASTER PHP APPS USING
PHP DORSET 6/6/16
RICHARD BAKER
twitter.com/r_bake_r
github.com/rjbaker
uk.linkedin.com/in/richjbaker
We’re hiring!
BACKGROUND
MOBILE API
▸ 140+ apps
▸ ~4.5m users
▸ REST/JSON
▸ Apache + PHP + ElasticSearch
▸ 20+ servers / various tasks
▸ Hosted on AWS
THE PROBLEM
TRAFFIC
THE PROBLEM
LATENCY GROWS
ELIMINATE EXPENSIVE, TIME
CONSUMING OPERATIONS AND
CALLS TO EXTERNAL SERVICES
USE MYSQL
WHAT TO QUEUE
MYSQL AS A QUEUE
job_id job_name data status
1 sendEmail {payload} completed
2 sendPush {payload} processing
3 requestThing {payload} waiting
4 resizeSelfie {payload} waiting
WHAT TO QUEUE
WHY NOT USE TRANSACTIONS TO OBTAIN A LOCK?
THE DATABASE IS NOT A
QUEUE. THE DATABASE IS
NOT A QUEUE.
Stephen Corona
WHAT TO QUEUE
https://www.scalingphpbook.com
USE A QUEUE!
QUEUES & WORKERS
MESSAGE QUEUES VS JOB QUEUES
▸ Kind of similar
▸ Most job queues built upon some kind of message queue
▸ Broker messages between systems
▸ Provide transport, storage and protocol
▸ Job queues abstract the lower level message component
▸ Integrate with most applications fairly easily
QUEUES & WORKERS
JOBS VS SCHEDULED TASKS
▸ Run at a predefined point in time ⏰
▸ May repeat at regular intervals or according to
calendar 📅
▸ Typically triggered by cron or other scheduler 🔫
▸ Scheduled tasks can trigger jobs! 💥
CHOOSE A QUEUE WITH
FEATURES BEST SUITED TO
YOUR APPLICATION
CHOOSING A JOB QUEUE
CONSIDERATIONS
▸ Job priority & time sensitivity
▸ Job ordering and consistency (FIFO)
▸ Payload size limits
▸ Message data type & protocol
▸ Support for other languages / client libraries
▸ Failure management / retry policy
▸ Fault tolerance & redundancy
▸ One-time delivery guarantee
▸ Monitoring & statistics
▸ Distribution by task to specific workers e.g. Video encoding
CHOOSING A JOB QUEUE
BEANSTALKD
▸ Protocol similar to Memcached
▸ Clients need to know about all Beanstalkd servers (like memcached!)
▸ Beanstalkd servers can persist jobs, handle restarts without losing jobs
▸ Uses “tubes” to differentiate different queues
▸ Supports job TTR. Failed/hung jobs get put back into queue.
▸ Supports blocking. Client connects and waits for a new job.
▸ Requires setup and maintenance
▸ Loads of client libraries
http://kr.github.io/beanstalkd/
CHOOSING A JOB QUEUE
AMAZON SQS
▸ SAAS - Already using AWS, literally no setup
▸ Massively redundant, cheap, maintenance free
▸ HTTP/JSON under the hood, simple
▸ Supports long-polling.
▸ Best effort FIFO (no guarantees)
▸ No concept of job priority. Use different queues.
▸ Retry policy allows jobs to reappear in queue if not completed in specified time
▸ Configurable number of retries
▸ Queue stats and alarms integrate with autoscaling
▸ Scale worker instances based on queue length/backlog/rate
https://aws.amazon.com/sqs/
CHOOSING A JOB QUEUE
OTHER POPULAR QUEUES
▸ Celery (backed by RabbitMQ) - http://www.celeryproject.org
▸ php-resque (backed by Redis) -https://github.com/
chrisboulton/php-resque
▸ Kafka - http://kafka.apache.org
▸ Gearman - http://gearman.org
▸ Iron.io (SAAS) - https://www.iron.io
▸ Loads more - www.queues.io
PROCESSING
JOBS
PROCESSING JOBS
WORKER PROCESS
▸ Essentially an infinite loop
▸ Executed on command line
▸ Asks queue for new job
▸ Resolves job method
▸ Execute with payload
▸ Delete job from queue
▸ Repeat
PROCESSING JOBS
<?php
$queue = new Queue();
while(true) {
$job = $queue->pop('queue-name');
try {
if ($job->execute()) {
$job->delete();
} else {
$job->release();
}
} catch (Exception $e) {
$job->release();
}
}
IMPROVING THE
WORKER
pcntl_signal_dispatch();
PROCESSING JOBS
PROCESS CONTROL EXTENSIONS (PCNTL)
▸ Respond to unix process signals
▸ Gracefully stop worker processes
▸ Complete current job before exiting
▸ Careful if using Apache mod_php on same
server
▸ http://php.net/manual/en/book.pcntl.php
IMPROVED WORKER
<?php
namespace Demo;
use DemoQueueQueueInterface;
class Worker
{
protected $shouldRun = true;
protected $queue;
public function __construct(QueueInterface $queue)
{
declare(ticks = 1);
$this->queue = $queue;
pcntl_signal(SIGTERM, [$this, 'signalHandler']);
pcntl_signal(SIGINT, [$this, 'signalHandler']);
pcntl_signal(SIGQUIT, [$this, 'signalHandler']);
}
public function run($queueName)
{
echo "Starting worker on queue '{$queueName}' n";
while ($this->shouldRun) {
$job = $this->queue->pop($queueName);
try {
if ($job->execute()) {
$job->delete();
} else {
$job->release();
}
} catch (Exception $e) {
$job->release();
error_log($e->getTraceAsString());
}
pcntl_signal_dispatch();
}
}
public function signalHandler($signal)
{
switch ($signal) {
case SIGTERM:
case SIGINT:
case SIGQUIT:
echo "Job completed. Exiting... n";
$this->shouldRun = false;
break;
}
}
}
IMPROVED WORKER
WTF IS DECLARE(TICKS = 1);?
▸ Officially deprecated
▸ Triggered after php has executed a certain
number of statements
▸ Interacts with pcntl_signal_dispatch()
▸ I admit i’ve not fully tested this with PHP7.0
PROCESSING JOBS
KEEPING WORKERS RUNNING
PROCESSING JOBS
SUPERVISOR
▸ Process manager in similar vein to forever, pm2, php-fpm
▸ Runs as service
▸ Starts and restarts php worker processes
▸ Has CLI client (supervisorctl)
▸ Web interface
▸ Easy to install and configure
http://supervisord.org
PROCESSING JOBS
SUPERVISOR CONFIG [program:alertworker]
command = /usr/bin/php /path/to/queueRunner.php -q=prod-alerts
autorestart = true
autostart = true
directory = /path/to/scripts
environment = DEPLOYMENT='production'
exitcodes = 0,2
numprocs = 1
numprocs_start = 0
priority = 999
startretries = 3
startsecs = 4
stderr_capture_maxbytes = 1MB
stderr_events_enabled = false
stderr_logfile = AUTO
stderr_logfile_backups = 10
stderr_logfile_maxbytes = 50MB
stderr_syslog = false
stdout_capture_maxbytes = 1MB
stdout_events_enabled = true
stdout_logfile = AUTO
stdout_logfile_backups = 10
stdout_logfile_maxbytes = 40MB
stdout_syslog = false
stopsignal = TERM
stopwaitsecs = 10
umask = 022
user = worker
DEMO TIME
THANKS FOR LISTENING!
twitter.com/r_bake_r
github.com/rjbaker
uk.linkedin.com/in/richjbaker

Contenu connexe

Tendances

Tendances (20)

Text summarization
Text summarizationText summarization
Text summarization
 
Clean code and Code Smells
Clean code and Code SmellsClean code and Code Smells
Clean code and Code Smells
 
gRPC Design and Implementation
gRPC Design and ImplementationgRPC Design and Implementation
gRPC Design and Implementation
 
Rust Intro
Rust IntroRust Intro
Rust Intro
 
gRPC - Fastest Data Transfer Protocol
gRPC - Fastest Data Transfer ProtocolgRPC - Fastest Data Transfer Protocol
gRPC - Fastest Data Transfer Protocol
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
 
Asa packet-flow-00
Asa packet-flow-00Asa packet-flow-00
Asa packet-flow-00
 
Building microservices with grpc
Building microservices with grpcBuilding microservices with grpc
Building microservices with grpc
 
Clean coding-practices
Clean coding-practicesClean coding-practices
Clean coding-practices
 
Solr workshop
Solr workshopSolr workshop
Solr workshop
 
Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)
 
Coding with golang
Coding with golangCoding with golang
Coding with golang
 
Restful api design
Restful api designRestful api design
Restful api design
 
Introduction to gRPC
Introduction to gRPCIntroduction to gRPC
Introduction to gRPC
 
An Introduction to TensorFlow architecture
An Introduction to TensorFlow architectureAn Introduction to TensorFlow architecture
An Introduction to TensorFlow architecture
 
Refactoring 101
Refactoring 101Refactoring 101
Refactoring 101
 
Protocol Buffers
Protocol BuffersProtocol Buffers
Protocol Buffers
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
 
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
 
What is Socket Programming in Python | Edureka
What is Socket Programming in Python | EdurekaWhat is Socket Programming in Python | Edureka
What is Socket Programming in Python | Edureka
 

En vedette

Case study: iTunes for K-12
Case study: iTunes for K-12Case study: iTunes for K-12
Case study: iTunes for K-12
Giorgio Sironi
 
Distributed app development with nodejs and zeromq
Distributed app development with nodejs and zeromqDistributed app development with nodejs and zeromq
Distributed app development with nodejs and zeromq
Ruben Tan
 
Crypto With OpenSSL
Crypto With OpenSSLCrypto With OpenSSL
Crypto With OpenSSL
Zhi Guan
 
Case study: Khan Academy
Case study: Khan AcademyCase study: Khan Academy
Case study: Khan Academy
Giorgio Sironi
 
Gearman: A Job Server made for Scale
Gearman: A Job Server made for ScaleGearman: A Job Server made for Scale
Gearman: A Job Server made for Scale
Mike Willbanks
 
Smart blind stick book
Smart blind stick bookSmart blind stick book
Smart blind stick book
Ahmed Moawad
 

En vedette (20)

Queue your work
Queue your workQueue your work
Queue your work
 
Distributed Queue System using Gearman
Distributed Queue System using GearmanDistributed Queue System using Gearman
Distributed Queue System using Gearman
 
CakePHP REST Plugin
CakePHP REST PluginCakePHP REST Plugin
CakePHP REST Plugin
 
Gearman for MySQL
Gearman for MySQLGearman for MySQL
Gearman for MySQL
 
CouchDB @ PoliMi
CouchDB @ PoliMiCouchDB @ PoliMi
CouchDB @ PoliMi
 
Case study: iTunes for K-12
Case study: iTunes for K-12Case study: iTunes for K-12
Case study: iTunes for K-12
 
Case study: Insegnalo
Case study: InsegnaloCase study: Insegnalo
Case study: Insegnalo
 
Chansonnier: web application for multimedia search on song videos
Chansonnier: web application for multimedia search on song videosChansonnier: web application for multimedia search on song videos
Chansonnier: web application for multimedia search on song videos
 
Queue System and Zend\Queue implementation
Queue System and Zend\Queue implementationQueue System and Zend\Queue implementation
Queue System and Zend\Queue implementation
 
Blind detection of image manipulation @ PoliMi
Blind detection of image manipulation @ PoliMiBlind detection of image manipulation @ PoliMi
Blind detection of image manipulation @ PoliMi
 
PHP and node.js Together
PHP and node.js TogetherPHP and node.js Together
PHP and node.js Together
 
VLANs in the Linux Kernel
VLANs in the Linux KernelVLANs in the Linux Kernel
VLANs in the Linux Kernel
 
Distributed app development with nodejs and zeromq
Distributed app development with nodejs and zeromqDistributed app development with nodejs and zeromq
Distributed app development with nodejs and zeromq
 
Crypto With OpenSSL
Crypto With OpenSSLCrypto With OpenSSL
Crypto With OpenSSL
 
Case study: Khan Academy
Case study: Khan AcademyCase study: Khan Academy
Case study: Khan Academy
 
Navigation system for blind using GPS & GSM
Navigation system for blind using GPS & GSMNavigation system for blind using GPS & GSM
Navigation system for blind using GPS & GSM
 
Map Projections, Datums, GIS and GPS for Everyone
Map Projections, Datums, GIS and GPS for EveryoneMap Projections, Datums, GIS and GPS for Everyone
Map Projections, Datums, GIS and GPS for Everyone
 
Gearman: A Job Server made for Scale
Gearman: A Job Server made for ScaleGearman: A Job Server made for Scale
Gearman: A Job Server made for Scale
 
Smart blind stick book
Smart blind stick bookSmart blind stick book
Smart blind stick book
 
Vehicle tracking system using gps and google map
Vehicle tracking system using gps and google mapVehicle tracking system using gps and google map
Vehicle tracking system using gps and google map
 

Similaire à Faster PHP apps using Queues and Workers

Deferred Processing in Ruby - Philly rb - August 2011
Deferred Processing in Ruby - Philly rb - August 2011Deferred Processing in Ruby - Philly rb - August 2011
Deferred Processing in Ruby - Philly rb - August 2011
rob_dimarco
 
Automating Software Development Life Cycle - A DevOps Approach
Automating Software Development Life Cycle - A DevOps ApproachAutomating Software Development Life Cycle - A DevOps Approach
Automating Software Development Life Cycle - A DevOps Approach
Akshaya Mahapatra
 

Similaire à Faster PHP apps using Queues and Workers (20)

Node, can you even in CPU intensive operations?
Node, can you even in CPU intensive operations?Node, can you even in CPU intensive operations?
Node, can you even in CPU intensive operations?
 
Introduction to LAVA Workload Scheduler
Introduction to LAVA Workload SchedulerIntroduction to LAVA Workload Scheduler
Introduction to LAVA Workload Scheduler
 
Confitura 2018 — Apache Beam — Promyk Nadziei Data Engineera
Confitura 2018 — Apache Beam — Promyk Nadziei Data EngineeraConfitura 2018 — Apache Beam — Promyk Nadziei Data Engineera
Confitura 2018 — Apache Beam — Promyk Nadziei Data Engineera
 
Apache Samza 1.0 - What's New, What's Next
Apache Samza 1.0 - What's New, What's NextApache Samza 1.0 - What's New, What's Next
Apache Samza 1.0 - What's New, What's Next
 
Mass Report Generation Using REST APIs
Mass Report Generation Using REST APIsMass Report Generation Using REST APIs
Mass Report Generation Using REST APIs
 
Scaling asp.net websites to millions of users
Scaling asp.net websites to millions of usersScaling asp.net websites to millions of users
Scaling asp.net websites to millions of users
 
Clug 2011 March web server optimisation
Clug 2011 March  web server optimisationClug 2011 March  web server optimisation
Clug 2011 March web server optimisation
 
About Node.js
About Node.jsAbout Node.js
About Node.js
 
Node.js: CAMTA Presentation
Node.js: CAMTA PresentationNode.js: CAMTA Presentation
Node.js: CAMTA Presentation
 
Copper: A high performance workflow engine
Copper: A high performance workflow engineCopper: A high performance workflow engine
Copper: A high performance workflow engine
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 
Deferred Processing in Ruby - Philly rb - August 2011
Deferred Processing in Ruby - Philly rb - August 2011Deferred Processing in Ruby - Philly rb - August 2011
Deferred Processing in Ruby - Philly rb - August 2011
 
NGINX Can Do That? Test Drive Your Config File!
NGINX Can Do That? Test Drive Your Config File!NGINX Can Do That? Test Drive Your Config File!
NGINX Can Do That? Test Drive Your Config File!
 
Automating Software Development Life Cycle - A DevOps Approach
Automating Software Development Life Cycle - A DevOps ApproachAutomating Software Development Life Cycle - A DevOps Approach
Automating Software Development Life Cycle - A DevOps Approach
 
NoCOUG Presentation on Oracle RAT
NoCOUG Presentation on Oracle RATNoCOUG Presentation on Oracle RAT
NoCOUG Presentation on Oracle RAT
 
Yaetos Tech Overview
Yaetos Tech OverviewYaetos Tech Overview
Yaetos Tech Overview
 
PipelineAI + TensorFlow AI + Spark ML + Kuberenetes + Istio + AWS SageMaker +...
PipelineAI + TensorFlow AI + Spark ML + Kuberenetes + Istio + AWS SageMaker +...PipelineAI + TensorFlow AI + Spark ML + Kuberenetes + Istio + AWS SageMaker +...
PipelineAI + TensorFlow AI + Spark ML + Kuberenetes + Istio + AWS SageMaker +...
 
To AWS with Ansible
To AWS with AnsibleTo AWS with Ansible
To AWS with Ansible
 
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015
 
Presentation of OrientDB v2.2 - Webinar
Presentation of OrientDB v2.2 - WebinarPresentation of OrientDB v2.2 - Webinar
Presentation of OrientDB v2.2 - Webinar
 

Dernier

VIP Call Girls Himatnagar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Himatnagar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Himatnagar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Himatnagar 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
ydyuyu
 
💚😋 Bilaspur Escort Service Call Girls, 9352852248 ₹5000 To 25K With AC💚😋
💚😋 Bilaspur Escort Service Call Girls, 9352852248 ₹5000 To 25K With AC💚😋💚😋 Bilaspur Escort Service Call Girls, 9352852248 ₹5000 To 25K With AC💚😋
💚😋 Bilaspur Escort Service Call Girls, 9352852248 ₹5000 To 25K With AC💚😋
nirzagarg
 
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
nilamkumrai
 
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men 🔝mehsana🔝 Escorts...
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men  🔝mehsana🔝   Escorts...➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men  🔝mehsana🔝   Escorts...
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men 🔝mehsana🔝 Escorts...
nirzagarg
 
6.High Profile Call Girls In Punjab +919053900678 Punjab Call GirlHigh Profil...
6.High Profile Call Girls In Punjab +919053900678 Punjab Call GirlHigh Profil...6.High Profile Call Girls In Punjab +919053900678 Punjab Call GirlHigh Profil...
6.High Profile Call Girls In Punjab +919053900678 Punjab Call GirlHigh Profil...
@Chandigarh #call #Girls 9053900678 @Call #Girls in @Punjab 9053900678
 
Call Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 

Dernier (20)

Sarola * Female Escorts Service in Pune | 8005736733 Independent Escorts & Da...
Sarola * Female Escorts Service in Pune | 8005736733 Independent Escorts & Da...Sarola * Female Escorts Service in Pune | 8005736733 Independent Escorts & Da...
Sarola * Female Escorts Service in Pune | 8005736733 Independent Escorts & Da...
 
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
 
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
 
VIP Call Girls Himatnagar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Himatnagar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Himatnagar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Himatnagar 7001035870 Whatsapp Number, 24/07 Booking
 
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
 
Microsoft Azure Arc Customer Deck Microsoft
Microsoft Azure Arc Customer Deck MicrosoftMicrosoft Azure Arc Customer Deck Microsoft
Microsoft Azure Arc Customer Deck Microsoft
 
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
 
(+971568250507 ))# Young Call Girls in Ajman By Pakistani Call Girls in ...
(+971568250507  ))#  Young Call Girls  in Ajman  By Pakistani Call Girls  in ...(+971568250507  ))#  Young Call Girls  in Ajman  By Pakistani Call Girls  in ...
(+971568250507 ))# Young Call Girls in Ajman By Pakistani Call Girls in ...
 
💚😋 Bilaspur Escort Service Call Girls, 9352852248 ₹5000 To 25K With AC💚😋
💚😋 Bilaspur Escort Service Call Girls, 9352852248 ₹5000 To 25K With AC💚😋💚😋 Bilaspur Escort Service Call Girls, 9352852248 ₹5000 To 25K With AC💚😋
💚😋 Bilaspur Escort Service Call Girls, 9352852248 ₹5000 To 25K With AC💚😋
 
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
 
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
 
Real Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtReal Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirt
 
Russian Call Girls in %(+971524965298 )# Call Girls in Dubai
Russian Call Girls in %(+971524965298  )#  Call Girls in DubaiRussian Call Girls in %(+971524965298  )#  Call Girls in Dubai
Russian Call Girls in %(+971524965298 )# Call Girls in Dubai
 
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men 🔝mehsana🔝 Escorts...
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men  🔝mehsana🔝   Escorts...➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men  🔝mehsana🔝   Escorts...
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men 🔝mehsana🔝 Escorts...
 
Dubai=Desi Dubai Call Girls O525547819 Outdoor Call Girls Dubai
Dubai=Desi Dubai Call Girls O525547819 Outdoor Call Girls DubaiDubai=Desi Dubai Call Girls O525547819 Outdoor Call Girls Dubai
Dubai=Desi Dubai Call Girls O525547819 Outdoor Call Girls Dubai
 
6.High Profile Call Girls In Punjab +919053900678 Punjab Call GirlHigh Profil...
6.High Profile Call Girls In Punjab +919053900678 Punjab Call GirlHigh Profil...6.High Profile Call Girls In Punjab +919053900678 Punjab Call GirlHigh Profil...
6.High Profile Call Girls In Punjab +919053900678 Punjab Call GirlHigh Profil...
 
Wagholi & High Class Call Girls Pune Neha 8005736733 | 100% Gennuine High Cla...
Wagholi & High Class Call Girls Pune Neha 8005736733 | 100% Gennuine High Cla...Wagholi & High Class Call Girls Pune Neha 8005736733 | 100% Gennuine High Cla...
Wagholi & High Class Call Girls Pune Neha 8005736733 | 100% Gennuine High Cla...
 
Call Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
Al Barsha Night Partner +0567686026 Call Girls Dubai
Al Barsha Night Partner +0567686026 Call Girls  DubaiAl Barsha Night Partner +0567686026 Call Girls  Dubai
Al Barsha Night Partner +0567686026 Call Girls Dubai
 
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...
 

Faster PHP apps using Queues and Workers

  • 1. QUEUES & WORKERS FASTER PHP APPS USING PHP DORSET 6/6/16
  • 4. BACKGROUND MOBILE API ▸ 140+ apps ▸ ~4.5m users ▸ REST/JSON ▸ Apache + PHP + ElasticSearch ▸ 20+ servers / various tasks ▸ Hosted on AWS
  • 7. ELIMINATE EXPENSIVE, TIME CONSUMING OPERATIONS AND CALLS TO EXTERNAL SERVICES
  • 9. WHAT TO QUEUE MYSQL AS A QUEUE job_id job_name data status 1 sendEmail {payload} completed 2 sendPush {payload} processing 3 requestThing {payload} waiting 4 resizeSelfie {payload} waiting
  • 10. WHAT TO QUEUE WHY NOT USE TRANSACTIONS TO OBTAIN A LOCK?
  • 11. THE DATABASE IS NOT A QUEUE. THE DATABASE IS NOT A QUEUE. Stephen Corona WHAT TO QUEUE https://www.scalingphpbook.com
  • 13. QUEUES & WORKERS MESSAGE QUEUES VS JOB QUEUES ▸ Kind of similar ▸ Most job queues built upon some kind of message queue ▸ Broker messages between systems ▸ Provide transport, storage and protocol ▸ Job queues abstract the lower level message component ▸ Integrate with most applications fairly easily
  • 14. QUEUES & WORKERS JOBS VS SCHEDULED TASKS ▸ Run at a predefined point in time ⏰ ▸ May repeat at regular intervals or according to calendar 📅 ▸ Typically triggered by cron or other scheduler 🔫 ▸ Scheduled tasks can trigger jobs! 💥
  • 15. CHOOSE A QUEUE WITH FEATURES BEST SUITED TO YOUR APPLICATION
  • 16. CHOOSING A JOB QUEUE CONSIDERATIONS ▸ Job priority & time sensitivity ▸ Job ordering and consistency (FIFO) ▸ Payload size limits ▸ Message data type & protocol ▸ Support for other languages / client libraries ▸ Failure management / retry policy ▸ Fault tolerance & redundancy ▸ One-time delivery guarantee ▸ Monitoring & statistics ▸ Distribution by task to specific workers e.g. Video encoding
  • 17. CHOOSING A JOB QUEUE BEANSTALKD ▸ Protocol similar to Memcached ▸ Clients need to know about all Beanstalkd servers (like memcached!) ▸ Beanstalkd servers can persist jobs, handle restarts without losing jobs ▸ Uses “tubes” to differentiate different queues ▸ Supports job TTR. Failed/hung jobs get put back into queue. ▸ Supports blocking. Client connects and waits for a new job. ▸ Requires setup and maintenance ▸ Loads of client libraries http://kr.github.io/beanstalkd/
  • 18. CHOOSING A JOB QUEUE AMAZON SQS ▸ SAAS - Already using AWS, literally no setup ▸ Massively redundant, cheap, maintenance free ▸ HTTP/JSON under the hood, simple ▸ Supports long-polling. ▸ Best effort FIFO (no guarantees) ▸ No concept of job priority. Use different queues. ▸ Retry policy allows jobs to reappear in queue if not completed in specified time ▸ Configurable number of retries ▸ Queue stats and alarms integrate with autoscaling ▸ Scale worker instances based on queue length/backlog/rate https://aws.amazon.com/sqs/
  • 19. CHOOSING A JOB QUEUE OTHER POPULAR QUEUES ▸ Celery (backed by RabbitMQ) - http://www.celeryproject.org ▸ php-resque (backed by Redis) -https://github.com/ chrisboulton/php-resque ▸ Kafka - http://kafka.apache.org ▸ Gearman - http://gearman.org ▸ Iron.io (SAAS) - https://www.iron.io ▸ Loads more - www.queues.io
  • 21. PROCESSING JOBS WORKER PROCESS ▸ Essentially an infinite loop ▸ Executed on command line ▸ Asks queue for new job ▸ Resolves job method ▸ Execute with payload ▸ Delete job from queue ▸ Repeat
  • 22. PROCESSING JOBS <?php $queue = new Queue(); while(true) { $job = $queue->pop('queue-name'); try { if ($job->execute()) { $job->delete(); } else { $job->release(); } } catch (Exception $e) { $job->release(); } }
  • 25. PROCESSING JOBS PROCESS CONTROL EXTENSIONS (PCNTL) ▸ Respond to unix process signals ▸ Gracefully stop worker processes ▸ Complete current job before exiting ▸ Careful if using Apache mod_php on same server ▸ http://php.net/manual/en/book.pcntl.php
  • 26. IMPROVED WORKER <?php namespace Demo; use DemoQueueQueueInterface; class Worker { protected $shouldRun = true; protected $queue; public function __construct(QueueInterface $queue) { declare(ticks = 1); $this->queue = $queue; pcntl_signal(SIGTERM, [$this, 'signalHandler']); pcntl_signal(SIGINT, [$this, 'signalHandler']); pcntl_signal(SIGQUIT, [$this, 'signalHandler']); }
  • 27. public function run($queueName) { echo "Starting worker on queue '{$queueName}' n"; while ($this->shouldRun) { $job = $this->queue->pop($queueName); try { if ($job->execute()) { $job->delete(); } else { $job->release(); } } catch (Exception $e) { $job->release(); error_log($e->getTraceAsString()); } pcntl_signal_dispatch(); } } public function signalHandler($signal) { switch ($signal) { case SIGTERM: case SIGINT: case SIGQUIT: echo "Job completed. Exiting... n"; $this->shouldRun = false; break; } } }
  • 28. IMPROVED WORKER WTF IS DECLARE(TICKS = 1);? ▸ Officially deprecated ▸ Triggered after php has executed a certain number of statements ▸ Interacts with pcntl_signal_dispatch() ▸ I admit i’ve not fully tested this with PHP7.0
  • 30. PROCESSING JOBS SUPERVISOR ▸ Process manager in similar vein to forever, pm2, php-fpm ▸ Runs as service ▸ Starts and restarts php worker processes ▸ Has CLI client (supervisorctl) ▸ Web interface ▸ Easy to install and configure http://supervisord.org
  • 31. PROCESSING JOBS SUPERVISOR CONFIG [program:alertworker] command = /usr/bin/php /path/to/queueRunner.php -q=prod-alerts autorestart = true autostart = true directory = /path/to/scripts environment = DEPLOYMENT='production' exitcodes = 0,2 numprocs = 1 numprocs_start = 0 priority = 999 startretries = 3 startsecs = 4 stderr_capture_maxbytes = 1MB stderr_events_enabled = false stderr_logfile = AUTO stderr_logfile_backups = 10 stderr_logfile_maxbytes = 50MB stderr_syslog = false stdout_capture_maxbytes = 1MB stdout_events_enabled = true stdout_logfile = AUTO stdout_logfile_backups = 10 stdout_logfile_maxbytes = 40MB stdout_syslog = false stopsignal = TERM stopwaitsecs = 10 umask = 022 user = worker