SlideShare une entreprise Scribd logo
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

Speed up web API with Laravel and Swoole using Docker
Speed up web API with Laravel and Swoole using DockerSpeed up web API with Laravel and Swoole using Docker
Speed up web API with Laravel and Swoole using DockerLaravel Poland MeetUp
 
Event driven microservices with axon and spring boot-excitingly boring
Event driven microservices with axon and spring boot-excitingly boringEvent driven microservices with axon and spring boot-excitingly boring
Event driven microservices with axon and spring boot-excitingly boringAllard Buijze
 
Ruin your life using robot framework
Ruin your life using robot frameworkRuin your life using robot framework
Ruin your life using robot frameworkPrayoch Rujira
 
Testcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationTestcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationRichard North
 
Acceptance Test Driven Development and Robot Framework
Acceptance Test Driven Development and Robot FrameworkAcceptance Test Driven Development and Robot Framework
Acceptance Test Driven Development and Robot FrameworkSteve Zhang
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
Introducing Playwright's New Test Runner
Introducing Playwright's New Test RunnerIntroducing Playwright's New Test Runner
Introducing Playwright's New Test RunnerApplitools
 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.jsDinesh U
 
Introduction to Node js
Introduction to Node jsIntroduction to Node js
Introduction to Node jsAkshay Mathur
 
BDD with SpecFlow and Selenium
BDD with SpecFlow and SeleniumBDD with SpecFlow and Selenium
BDD with SpecFlow and SeleniumLiraz Shay
 
Introduction to Bdd and cucumber
Introduction to Bdd and cucumberIntroduction to Bdd and cucumber
Introduction to Bdd and cucumberNibu Baby
 
Robot Framework Dos And Don'ts
Robot Framework Dos And Don'tsRobot Framework Dos And Don'ts
Robot Framework Dos And Don'tsPekka Klärck
 
Selenium with Cucumber
Selenium  with Cucumber Selenium  with Cucumber
Selenium with Cucumber Knoldus Inc.
 
Ansible Introduction
Ansible IntroductionAnsible Introduction
Ansible IntroductionGong Haibing
 
NodeJS - Server Side JS
NodeJS - Server Side JS NodeJS - Server Side JS
NodeJS - Server Side JS Ganesh Kondal
 

Tendances (20)

Spring Boot
Spring BootSpring Boot
Spring Boot
 
Speed up web API with Laravel and Swoole using Docker
Speed up web API with Laravel and Swoole using DockerSpeed up web API with Laravel and Swoole using Docker
Speed up web API with Laravel and Swoole using Docker
 
Event driven microservices with axon and spring boot-excitingly boring
Event driven microservices with axon and spring boot-excitingly boringEvent driven microservices with axon and spring boot-excitingly boring
Event driven microservices with axon and spring boot-excitingly boring
 
Ruin your life using robot framework
Ruin your life using robot frameworkRuin your life using robot framework
Ruin your life using robot framework
 
Test Automation Framework with BDD and Cucumber
Test Automation Framework with BDD and CucumberTest Automation Framework with BDD and Cucumber
Test Automation Framework with BDD and Cucumber
 
Testcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationTestcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentation
 
Acceptance Test Driven Development and Robot Framework
Acceptance Test Driven Development and Robot FrameworkAcceptance Test Driven Development and Robot Framework
Acceptance Test Driven Development and Robot Framework
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
Puppeteer
PuppeteerPuppeteer
Puppeteer
 
Introducing Playwright's New Test Runner
Introducing Playwright's New Test RunnerIntroducing Playwright's New Test Runner
Introducing Playwright's New Test Runner
 
Jenkins Tutorial.pdf
Jenkins Tutorial.pdfJenkins Tutorial.pdf
Jenkins Tutorial.pdf
 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.js
 
Introduction to Node js
Introduction to Node jsIntroduction to Node js
Introduction to Node js
 
Jenkins-CI
Jenkins-CIJenkins-CI
Jenkins-CI
 
BDD with SpecFlow and Selenium
BDD with SpecFlow and SeleniumBDD with SpecFlow and Selenium
BDD with SpecFlow and Selenium
 
Introduction to Bdd and cucumber
Introduction to Bdd and cucumberIntroduction to Bdd and cucumber
Introduction to Bdd and cucumber
 
Robot Framework Dos And Don'ts
Robot Framework Dos And Don'tsRobot Framework Dos And Don'ts
Robot Framework Dos And Don'ts
 
Selenium with Cucumber
Selenium  with Cucumber Selenium  with Cucumber
Selenium with Cucumber
 
Ansible Introduction
Ansible IntroductionAnsible Introduction
Ansible Introduction
 
NodeJS - Server Side JS
NodeJS - Server Side JS NodeJS - Server Side JS
NodeJS - Server Side JS
 

En vedette

Distributed Queue System using Gearman
Distributed Queue System using GearmanDistributed Queue System using Gearman
Distributed Queue System using GearmanEric Cho
 
Case study: iTunes for K-12
Case study: iTunes for K-12Case study: iTunes for K-12
Case study: iTunes for K-12Giorgio Sironi
 
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 videosGiorgio Sironi
 
Queue System and Zend\Queue implementation
Queue System and Zend\Queue implementationQueue System and Zend\Queue implementation
Queue System and Zend\Queue implementationGianluca Arbezzano
 
Blind detection of image manipulation @ PoliMi
Blind detection of image manipulation @ PoliMiBlind detection of image manipulation @ PoliMi
Blind detection of image manipulation @ PoliMiGiorgio Sironi
 
VLANs in the Linux Kernel
VLANs in the Linux KernelVLANs in the Linux Kernel
VLANs in the Linux KernelKernel TLV
 
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 zeromqRuben Tan
 
Crypto With OpenSSL
Crypto With OpenSSLCrypto With OpenSSL
Crypto With OpenSSLZhi Guan
 
Case study: Khan Academy
Case study: Khan AcademyCase study: Khan Academy
Case study: Khan AcademyGiorgio Sironi
 
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 & GSMPrateek Anand
 
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 EveryoneDr. Geophysics
 
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 ScaleMike Willbanks
 
Smart blind stick book
Smart blind stick bookSmart blind stick book
Smart blind stick bookAhmed Moawad
 
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 mapsanchit bhargava
 

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

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?The Software House
 
Introduction to LAVA Workload Scheduler
Introduction to LAVA Workload SchedulerIntroduction to LAVA Workload Scheduler
Introduction to LAVA Workload SchedulerNopparat Nopkuat
 
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 EngineeraPiotr Wikiel
 
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 NextPrateek Maheshwari
 
Mass Report Generation Using REST APIs
Mass Report Generation Using REST APIsMass Report Generation Using REST APIs
Mass Report Generation Using REST APIsSalesforce Developers
 
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 usersoazabir
 
Clug 2011 March web server optimisation
Clug 2011 March  web server optimisationClug 2011 March  web server optimisation
Clug 2011 March web server optimisationgrooverdan
 
Node.js: CAMTA Presentation
Node.js: CAMTA PresentationNode.js: CAMTA Presentation
Node.js: CAMTA PresentationRob Tweed
 
Copper: A high performance workflow engine
Copper: A high performance workflow engineCopper: A high performance workflow engine
Copper: A high performance workflow enginedmoebius
 
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 scalabilityWim Godden
 
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 2011rob_dimarco
 
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!Jeff Anderson
 
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 ApproachAkshaya Mahapatra
 
NoCOUG Presentation on Oracle RAT
NoCOUG Presentation on Oracle RATNoCOUG Presentation on Oracle RAT
NoCOUG Presentation on Oracle RATHenryBowers
 
Yaetos Tech Overview
Yaetos Tech OverviewYaetos Tech Overview
Yaetos Tech Overviewprevota
 
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 +...Chris Fregly
 
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 2015Masahiro Nagano
 
Presentation of OrientDB v2.2 - Webinar
Presentation of OrientDB v2.2 - WebinarPresentation of OrientDB v2.2 - Webinar
Presentation of OrientDB v2.2 - WebinarOrient Technologies
 

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

Multi-cluster Kubernetes Networking- Patterns, Projects and Guidelines
Multi-cluster Kubernetes Networking- Patterns, Projects and GuidelinesMulti-cluster Kubernetes Networking- Patterns, Projects and Guidelines
Multi-cluster Kubernetes Networking- Patterns, Projects and GuidelinesSanjeev Rampal
 
Article writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptxArticle writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptxabhinandnam9997
 
ER(Entity Relationship) Diagram for online shopping - TAE
ER(Entity Relationship) Diagram for online shopping - TAEER(Entity Relationship) Diagram for online shopping - TAE
ER(Entity Relationship) Diagram for online shopping - TAEHimani415946
 
The Use of AI in Indonesia Election 2024: A Case Study
The Use of AI in Indonesia Election 2024: A Case StudyThe Use of AI in Indonesia Election 2024: A Case Study
The Use of AI in Indonesia Election 2024: A Case StudyDamar Juniarto
 
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理aagad
 
How to Use Contact Form 7 Like a Pro.pptx
How to Use Contact Form 7 Like a Pro.pptxHow to Use Contact Form 7 Like a Pro.pptx
How to Use Contact Form 7 Like a Pro.pptxGal Baras
 
Pvtaan Social media marketing proposal.pdf
Pvtaan Social media marketing proposal.pdfPvtaan Social media marketing proposal.pdf
Pvtaan Social media marketing proposal.pdfPvtaan
 
History+of+E-commerce+Development+in+China-www.cfye-commerce.shop
History+of+E-commerce+Development+in+China-www.cfye-commerce.shopHistory+of+E-commerce+Development+in+China-www.cfye-commerce.shop
History+of+E-commerce+Development+in+China-www.cfye-commerce.shoplaozhuseo02
 
How Do I Begin the Linksys Velop Setup Process?
How Do I Begin the Linksys Velop Setup Process?How Do I Begin the Linksys Velop Setup Process?
How Do I Begin the Linksys Velop Setup Process?Linksys Velop Login
 
The+Prospects+of+E-Commerce+in+China.pptx
The+Prospects+of+E-Commerce+in+China.pptxThe+Prospects+of+E-Commerce+in+China.pptx
The+Prospects+of+E-Commerce+in+China.pptxlaozhuseo02
 
The AI Powered Organization-Intro to AI-LAN.pdf
The AI Powered Organization-Intro to AI-LAN.pdfThe AI Powered Organization-Intro to AI-LAN.pdf
The AI Powered Organization-Intro to AI-LAN.pdfSiskaFitrianingrum
 

Dernier (12)

Multi-cluster Kubernetes Networking- Patterns, Projects and Guidelines
Multi-cluster Kubernetes Networking- Patterns, Projects and GuidelinesMulti-cluster Kubernetes Networking- Patterns, Projects and Guidelines
Multi-cluster Kubernetes Networking- Patterns, Projects and Guidelines
 
Article writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptxArticle writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptx
 
ER(Entity Relationship) Diagram for online shopping - TAE
ER(Entity Relationship) Diagram for online shopping - TAEER(Entity Relationship) Diagram for online shopping - TAE
ER(Entity Relationship) Diagram for online shopping - TAE
 
The Best AI Powered Software - Intellivid AI Studio
The Best AI Powered Software - Intellivid AI StudioThe Best AI Powered Software - Intellivid AI Studio
The Best AI Powered Software - Intellivid AI Studio
 
The Use of AI in Indonesia Election 2024: A Case Study
The Use of AI in Indonesia Election 2024: A Case StudyThe Use of AI in Indonesia Election 2024: A Case Study
The Use of AI in Indonesia Election 2024: A Case Study
 
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
 
How to Use Contact Form 7 Like a Pro.pptx
How to Use Contact Form 7 Like a Pro.pptxHow to Use Contact Form 7 Like a Pro.pptx
How to Use Contact Form 7 Like a Pro.pptx
 
Pvtaan Social media marketing proposal.pdf
Pvtaan Social media marketing proposal.pdfPvtaan Social media marketing proposal.pdf
Pvtaan Social media marketing proposal.pdf
 
History+of+E-commerce+Development+in+China-www.cfye-commerce.shop
History+of+E-commerce+Development+in+China-www.cfye-commerce.shopHistory+of+E-commerce+Development+in+China-www.cfye-commerce.shop
History+of+E-commerce+Development+in+China-www.cfye-commerce.shop
 
How Do I Begin the Linksys Velop Setup Process?
How Do I Begin the Linksys Velop Setup Process?How Do I Begin the Linksys Velop Setup Process?
How Do I Begin the Linksys Velop Setup Process?
 
The+Prospects+of+E-Commerce+in+China.pptx
The+Prospects+of+E-Commerce+in+China.pptxThe+Prospects+of+E-Commerce+in+China.pptx
The+Prospects+of+E-Commerce+in+China.pptx
 
The AI Powered Organization-Intro to AI-LAN.pdf
The AI Powered Organization-Intro to AI-LAN.pdfThe AI Powered Organization-Intro to AI-LAN.pdf
The AI Powered Organization-Intro to AI-LAN.pdf
 

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