74
DO YOU QUEUE? ZendCon 2015

2015 ZendCon - Do you queue

Embed Size (px)

Citation preview

Page 1: 2015 ZendCon - Do you queue

DO YOU QUEUE?ZendCon 2015

Page 2: 2015 ZendCon - Do you queue

I AM MIKE WILLBANKS

• Father, Husband, Developer

• VP of Development at Packet Power

• Twitter : @mwillbanks

Page 3: 2015 ZendCon - Do you queue

Task

Producer ConsumerMessages

Messages

Messages

WHAT IS A QUEUE?• Pub/Sub

• FIFO buffer

• Push / Pull

• A way to communicate between applications / systems.

• A way to decouple components.

• A way to offload work.

Page 4: 2015 ZendCon - Do you queue

WHY QUEUE?

Page 5: 2015 ZendCon - Do you queue

THE LONG RUNNING CASE

Request Long-process

Send ResponseResponse

Page 6: 2015 ZendCon - Do you queue

THE INTEROP CASE

Request Conditioning

Service ResponseResponse

Web Service Call

Send Response

Page 7: 2015 ZendCon - Do you queue

NOT YOUR DATABASE

Request Process

Response Send Response

DB

Page 8: 2015 ZendCon - Do you queue

SO WHY QUEUE

• User experience

• System Security

• Load Distribution

• System Reliability

Page 9: 2015 ZendCon - Do you queue

IN PRACTICEYou’ve seen this before…

Page 10: 2015 ZendCon - Do you queue
Page 11: 2015 ZendCon - Do you queue
Page 12: 2015 ZendCon - Do you queue
Page 13: 2015 ZendCon - Do you queue

WHAT YOU MIGHT QUEUE

Page 14: 2015 ZendCon - Do you queue

COMMUNICATIONS

• Emails

• SMS

• Push Notifications

Page 15: 2015 ZendCon - Do you queue

IMAGES

• Conversions

• Resize

• Thumbnail

• Watermark

Page 16: 2015 ZendCon - Do you queue

VIDEO

• Conversion

• Resampling

• Audio overlay

Page 17: 2015 ZendCon - Do you queue

IOT

• Receive messages from devices and process responses

Page 18: 2015 ZendCon - Do you queue

PATTERNS

Page 19: 2015 ZendCon - Do you queue

POINT TO POINT

Point to Point Channel

Receiver

Sender

Page 20: 2015 ZendCon - Do you queue

PUBLISH / SUBSCRIBE

Publiser Subscribe Channel

Subscriber

Subscriber

Subscriber

Page 21: 2015 ZendCon - Do you queue

MESSAGE BUSApplication

ApplicationApplication

Message Bus

Page 22: 2015 ZendCon - Do you queue

PIPELINESender

Receiver

Point to Point Channel

Receiver

Point to Point Channel

Page 23: 2015 ZendCon - Do you queue

INVALID MESSAGE

Channel

Receiver

Sender

X

Invalid Message Channel

Page 24: 2015 ZendCon - Do you queue

PROTOCOLSOr implementations for that matter.

Page 25: 2015 ZendCon - Do you queue

AMQP

• AMQP Working Group (Community and Vendor)

• Platform agnostic protocol.

• Completely open, interoperable and broadly applicable.

• Many severs available and many client libraries.

Page 26: 2015 ZendCon - Do you queue
Page 27: 2015 ZendCon - Do you queue

STOMP

• Simple protocol

• Behaviors follow very simple commands.

• Most message queues can communicate over STOMP.

Page 28: 2015 ZendCon - Do you queue

Connect Send Disconnect

/queue/msg

PHP

STOMP

SERVER

Connect Subscribe Disconnect

/queue/msg

Read

Ack

Page 29: 2015 ZendCon - Do you queue

SQS

• Fairly simple protocol

• Supports delays, timers, and multiple policies.

Page 30: 2015 ZendCon - Do you queue
Page 31: 2015 ZendCon - Do you queue

SPECIAL PURPOSE

Many queue implementations exist that don’t necessarily sit

under standards…

Page 32: 2015 ZendCon - Do you queue

XMPP

• Best for real-time data.

• Leveraging pub/sub can turn it into more of a generic message system.

• Multiple libraries available.

Page 33: 2015 ZendCon - Do you queue

SOCKET.IO

• New comer

• Real-time bidirectional event-based communication

• Largely leverages pub/sub

Page 34: 2015 ZendCon - Do you queue

ZEROMQ

• The ultimate in message queue flexibility.

• Socket library that acts as a concurrency framework.

Page 35: 2015 ZendCon - Do you queue

GEARMAN

• Application framework for farming out work.

• Job sever for asynchronous or synchronous messages.

Page 36: 2015 ZendCon - Do you queue

BEANSTALKD

• Asynchronous Job Queue

• Supports delays

• Many PHP clients exist

Page 37: 2015 ZendCon - Do you queue

CONSIDERATIONSHow do we evaluate our options…

Page 38: 2015 ZendCon - Do you queue

PULL VS. PUSH

• Always PULL, whenever possible.

• Push eliminates several benefits.

Page 39: 2015 ZendCon - Do you queue

DURABILITY

• Memory residence

• Persistence

• Restart survival

Page 40: 2015 ZendCon - Do you queue

SECURITY

• Authentication

• Queue permissions / restrictions

Page 41: 2015 ZendCon - Do you queue

DELIVERY

• Is the delivery guaranteed?

• If a message cannot be delivered how it it handled?

Page 42: 2015 ZendCon - Do you queue

ROUTING

• Multiple routing scenarios

• Fanout

• Direct

• Topic

• Broadcast

Page 43: 2015 ZendCon - Do you queue

BATCHING

• Do it later but in bulk (credit card processing)

• Can be done via scheduling (cron)

Page 44: 2015 ZendCon - Do you queue

RECEIPT

• Do you get an acknowledgement of receipt?

Page 45: 2015 ZendCon - Do you queue

IMPLEMENTING QUEUES

Page 46: 2015 ZendCon - Do you queue

STARTING POINTS

Page 47: 2015 ZendCon - Do you queue

PUSHING MESSAGES<?php

class UserService { public function save($user) { $this->db->save($user); $stomp = new Stomp('tcp://localhost:61613'); $stomp->send('/queue/email', [ 'to' => $user->getEmail(), 'subject' => 'Welcome', 'message' => 'Welcome', 'headers' => [], ]); } }

Page 48: 2015 ZendCon - Do you queue

HANDLING MESSAGES

<?php $stomp = new Stomp('tcp://localhost:61613'); $stomp->subscribe('/queue/email');

while (true) { if (!$stomp->hasFrame()) { sleep(2); continue ; } $stomp->readFrame(); $email = json_decode($frame->body);

mail($email->to, $email->subject, $email->message, $email->headers); }

Page 49: 2015 ZendCon - Do you queue

MESSAGES

Page 50: 2015 ZendCon - Do you queue

MESSAGE CONSIDERATIONS

• Message Format

• Message Contents

Page 51: 2015 ZendCon - Do you queue

SERIALIZE

O:7:"Message":1:{s:7:"content";a:1:{s:3:"foo";a:1:{s:3:"bar";a:1:{i:0;s:3:"baz";}}}}

Page 52: 2015 ZendCon - Do you queue

WORKERS

Page 53: 2015 ZendCon - Do you queue

WORKER CONSIDERATIONS

• Should do ONE thing and ONE thing well.

• Should attempt to be as quick as possible in handling that type.

• Should be able to be scaled horizontally.

Page 54: 2015 ZendCon - Do you queue

HANDLING WORKERS

• Prevent Memory Leaks

• memory_get_usage

• Handle Signals!

• pcntl_signal

Page 55: 2015 ZendCon - Do you queue

ABSTRACTIONSWe want to make this easy…

Page 56: 2015 ZendCon - Do you queue

<?php

interface QueueInterface { public function __construct(Stomp $stomp, $queue); public function dispatch(); public function publish(array $message); public function work(StompFrame $message); }

Page 57: 2015 ZendCon - Do you queue

<?php

class AbstractQueue implements QueueInterface { protected $stomp; protected $queue; protected $signal;

public function __construct(Stomp $stomp, $queue) { $this->stomp = $stomp; $this->queue = $queue; }

protected function prepare() { if (php_sapi_name() != 'cli') { throw new RuntimeException('You cannot dispatch outside of the CLI'); }

if (function_exists('pcntl_signal')) { pcntl_signal(SIGTERM, array($this, 'signal')); pcntl_signal(SIGINT, array($this, 'signal')); pcntl_signal(SIGHUP, array($this, 'signal')); } }

protected function signal($signal) { $this->signal = $signal; }

Page 58: 2015 ZendCon - Do you queue

public function dispatch() { $this->prepare();

while (true) { if ($this->signal) { break ; }

if (!$this->stomp->hasFrame()) { $this->wait(); continue ; }

$frame = $this->stomp->readFrame(); if ($this->validate($frame)) { $this->work($frame); }

$this->stomp->ack($frame); } }

protected function wait() { sleep(1); }

protected function validate(StompFrame $message) { return false; }

public function publish(array $message) { return $this->stomp->send($this->queue, json_encode($message)); }

Page 59: 2015 ZendCon - Do you queue

<?php

class EmailQueue extends AbstractQueue { public function validate(StompFrame $message) { if (!array_key_exists('to', $message)) { return false; } return true; }

public function work(StompFrame $message) { $mail = json_decode($message);

mail($mail->to, $mail->subject, $mail->message); } }

Page 60: 2015 ZendCon - Do you queue

BOOTSTRAPPINGLeverage your existing infrastructure as much as possible!

Page 61: 2015 ZendCon - Do you queue

<?php declare(ticks=1);

include 'vendor/autoload.php'; $app = Zend\Mvc\Application::init(include 'config/application.config.php'); $sm = $app->getServiceManager();

if (!isset($argv[1])) { fprintf(STDERR, "Syntax: worker <name>\n\n"); exit(1); } $name = $argv[1];

try { echo "Starting worker: " . $name . ' as ' . get_current_user() . PHP_EOL; $consumer = $sm->get($name); $consumer->dispatch(); } catch (\Exception $e) { fprintf(STDERR, "%s\n", $msg); exit(1); } $consumer = null;

echo 'Shutdown ' . $name . ' worker gracefully.' . PHP_EOL; exit(0);

Page 62: 2015 ZendCon - Do you queue

EVENTS

Page 63: 2015 ZendCon - Do you queue

SERVICES TRIGGER EVENTS

<?php

use Zend\EventManager\EventManagerAwareTrait;

class UserService { use EventManagerAwareTrait;

public function save($user) { $this->db->save($user); $this->getEventManager()->trigger('save', null, ['user' => $user]); } }

Page 64: 2015 ZendCon - Do you queue

ATTACH EVENTS

<?php

use Zend\ServiceManager\ServiceManager;

$sm = new ServiceManager(); $service = $sm->get('UserService'); $queue = $sm->get('EmailQueue'); $service->getEventManager()->attach('save', function($e) use ($queue) { $params = $e->getParams(); $queue->publish([ 'to' => $params['user']['email'], 'subject' => 'Welcome', 'message' => 'Welcome', 'headers' => [], ]); });

Page 65: 2015 ZendCon - Do you queue

HANDLING PROGRESS

• Keep track by using a generic handler

• Or, keep track via your database.

Page 66: 2015 ZendCon - Do you queue

TOOLING

Page 67: 2015 ZendCon - Do you queue

SUPERVISOR

• Daemon that runs on the server.

• Monitors programs and keeps them running in case of failure.

• Handles logging.

Page 68: 2015 ZendCon - Do you queue

PAINLESS INSTALLATION

sudo easy_install supervisor sudo echo_supervisord_conf > /etc/supervisord.conf sudo service supervisor start

Page 69: 2015 ZendCon - Do you queue

EXAMPLE PROGRAM CONFIGURATION

[program:emailworker] command=/usr/bin/php /var/www/worker "MyProject\Queue\Email"

process_name=%(program_name)s_%(process_num)d numprocs=2

numprocs_start=2 user=www-data autostart=true ; start at supervisord start (default: true) autorestart=true ; retstart at unexpected quit (default: true) startsecs=10 ; number of secs prog must stay running (def. 10) startretries=5 ; max # of serial start failures (default 3) log_stdout=true ; if true, log program stdout (default true) log_stderr=true ; if true, log program stderr (def false) redirect_stderr=true ; if true, redirect stderr to stdout stdout_logfile=/var/www/logs/worker-panoramaqueuekrpano.log stdout_logfile_maxbytes=10MB stdout_logfile_backups=15

Page 70: 2015 ZendCon - Do you queue

SUPERVISORD MULTI SERVER MONITORING TOOL

https://github.com/mlazarov/supervisord-monitor

Page 71: 2015 ZendCon - Do you queue

WHEN BAD THINGS HAPPEN

Page 72: 2015 ZendCon - Do you queue

QUEUE BACKUP

• Most of all issues with queues are that a queue has backed up.

Page 73: 2015 ZendCon - Do you queue

WORKER EXCEPTIONS

• Broken code causes hardships, but recoverable!

Page 74: 2015 ZendCon - Do you queue

• https://pixabay.com/en/autobahn-accident-germany-car-road-837643/• https://pixabay.com/en/traffic-rent-a-car-traffic-jam-637118/• https://pixabay.com/en/airplanes-line-runway-military-713662/• https://pixabay.com/en/leo-animal-savannah-lioness-safari-350690/• https://pixabay.com/en/user-top-view-office-keyboard-154199/• https://pixabay.com/en/mechanics-engine-springs-mechanic-424130/• https://pixabay.com/en/laughter-fun-happiness-boy-child-449781/• https://pixabay.com/en/umbrellas-red-blue-patterns-205386/• https://pixabay.com/en/spot-runs-start-la-stadion-862274/• https://pixabay.com/en/artistic-the-art-of-abstraction-948588/• https://pixabay.com/en/boots-work-boots-shoes-647035/• https://pixabay.com/en/meerkat-watch-guard-cute-676944/• https://pixabay.com/en/broken-window-hole-glass-damage-960188/• https://pixabay.com/en/police-security-safety-protection-869216/• https://pixabay.com/en/parcel-package-packaging-box-575623/• https://pixabay.com/en/directory-signposts-trail-direction-494457/• https://pixabay.com/en/cookies-chocolate-chip-food-dessert-28423/• https://pixabay.com/en/phone-communication-call-select-735060/• https://pixabay.com/en/receipt-note-paper-bill-document-575750/• https://pixabay.com/en/tools-construct-craft-repair-864983/• https://pixabay.com/en/moore-oklahoma-tornado-disaster-112781/• https://pixabay.com/en/network-iot-internet-of-things-782707/• https://pixabay.com/en/mobile-phone-smartphone-app-426559/• https://pixabay.com/en/mr-site-build-crane-baukran-462074/• https://pixabay.com/en/film-projector-movie-projector-738806/• https://pixabay.com/en/calves-legs-human-standing-on-540519/• https://pixabay.com/en/notebook-pages-opened-paper-note-820078/• https://pixabay.com/en/letters-penpal-cards-leave-stack-566810/• https://pixabay.com/en/spray-household-surface-shine-315164/• https://pixabay.com/en/industry-crafts-gears-mechanical-94448/• https://pixabay.com/en/hornet-wasp-insect-sting-macro-11514/• https://pixabay.com/en/honey-bees-bees-hive-bee-hive-401238/• https://pixabay.com/en/temple-china-door-handle-840526/• https://pixabay.com/en/no-button-push-sign-icon-symbol-685042/

Image Credits

THANK YOU!http://joind.in/talk/view/15538