Gearman and Perl

101
Dispatching jobs with Gearman

description

An introduction of what are Gearman and its architecture, and how to use it to dispatch jobs in Perl.

Transcript of Gearman and Perl

Page 1: Gearman and Perl

Dispatching jobs with Gearman

Page 2: Gearman and Perl

or

Page 3: Gearman and Perl

How to farm out jobs

Page 4: Gearman and Perl

or

Page 5: Gearman and Perl

Using Gearmanin Perl

Page 6: Gearman and Perl

Using Gearmanin Perl

Page 7: Gearman and Perl

gearman.org

Page 8: Gearman and Perl
Page 9: Gearman and Perl
Page 10: Gearman and Perl
Page 11: Gearman and Perl
Page 12: Gearman and Perl
Page 13: Gearman and Perl

The name "Gearman" was chosen as an

anagram for "Manager," "since it dispatches

jobs to be done, but does not do anything

useful itself"

Page 14: Gearman and Perl

Originally written in Perl

Page 15: Gearman and Perl

Rewritten in C

Page 16: Gearman and Perl

Clients in Perl, PHP, Phython,

Java, C# (.NET)

Page 17: Gearman and Perl

Clients in Perl, PHP, Phython,

Java, C# (.NET),even MySQL and PostgreSQL

Page 18: Gearman and Perl
Page 19: Gearman and Perl

WTF?

Page 20: Gearman and Perl

Architecture

Part I

Page 21: Gearman and Perl

Application

Job

Page 22: Gearman and Perl

Application

Job (or task)

Page 23: Gearman and Perl

Application

Job

gearmand

Page 24: Gearman and Perl

Application

Job

gearmand

Worker

Job

Page 25: Gearman and Perl

Application

Job

gearmand

Worker

Job Response

Page 26: Gearman and Perl

Application

gearmand

Worker

Worker

Worker

Page 27: Gearman and Perl

Application

gearmand

Worker

Worker

gearmand

Page 28: Gearman and Perl

Application

gearmand

Worker

Worker

gearmand

Application

Page 29: Gearman and Perl

Workers are scalable

Page 30: Gearman and Perl

Run any number you need

Page 31: Gearman and Perl

Run on remote servers

Page 32: Gearman and Perl

Application does not care

Page 33: Gearman and Perl

Application only talks with gearmand server

Page 34: Gearman and Perl

Application only talks with gearmand server

(one or more)

Page 35: Gearman and Perl

One or more application

Page 36: Gearman and Perl

One or more application

Applications throw jobs

Page 37: Gearman and Perl

One or more job servers

Page 38: Gearman and Perl

One or more job servers

Job servers dispatch jobs

Page 39: Gearman and Perl

One or more workers

Page 40: Gearman and Perl

One or more workers(clones or different)

Page 41: Gearman and Perl

One or more workers

Workers do jobs

Page 42: Gearman and Perl

One or more workers

Workers do jobsand may issue new jobs

Page 43: Gearman and Perl

Scalable also means redundant

Page 44: Gearman and Perl

Scalable also means redundant and reliable

Page 45: Gearman and Perl

Scalable also means redundant and reliable*

* when it works properly

Page 46: Gearman and Perl

Differentapproaches

to the architecture

Page 47: Gearman and Perl

Synchronousor

asynchronous

Page 48: Gearman and Perl

Worker either generates a response or works silently

Page 49: Gearman and Perl

Application

Job

gearmand

Worker

Job Response

Response

Synchronous

Page 50: Gearman and Perl

Application

Job

gearmand

Worker

Job Response

Response

Asynchronous

Page 51: Gearman and Perl

Application

Job

gearmand

Worker

Job Response

Response

With a response

Page 52: Gearman and Perl

Application

Job

gearmand

Worker

Job

With no response

“I’m done”

Page 53: Gearman and Perl

Application

Job

gearmand

Worker

Job

With no response

“I’m done”

DatabaseResult

Page 54: Gearman and Perl

Installation

Page 55: Gearman and Perl

Installation

1. Job server2. Client libraries3. Worker libraries

Page 56: Gearman and Perl

Installation

1. Job server C2. Client libraries Perl3. Worker libraries

Page 57: Gearman and Perl

Installation

1. Job server C2. Client libraries Perl XS3. Worker libraries

Page 58: Gearman and Perl

https://launchpad.net/gearmand

$./configure

$make

#makeinstall

Installing job server

Page 59: Gearman and Perl

#cpanGearman

Installing Perl modules

#cpanGearman::Client

#cpanGearman::Worker

or

Page 60: Gearman and Perl

#cpanGearman

Installing Perl modules

#cpanGearman::XS

or

Page 61: Gearman and Perl

Starting gearmand deamon

$gearmand‐d

Page 62: Gearman and Perl

Starting gearmand deamon

$gearmand‐d

or$gearmand‐d\

‐L127.0.0.1\

‐p4730

Page 63: Gearman and Perl

Starting worker(s)

$./worker.pl&

Page 64: Gearman and Perl

Starting worker(s)

$./worker.pl&

or$./workerA.pl&

$./workerB.pl&

Page 65: Gearman and Perl

Starting worker(s)

$./worker.pl&

or$./workerA.pl&

$./workerB.pl&

$./workerA.pl&

$./workerB.pl&

Page 66: Gearman and Perl

Running client

$./client.pl

Page 67: Gearman and Perl

Worker example#!/usr/bin/perl

usev5.10;

usestrict;

useGearman::Worker;

my$worker=newGearman::Worker;

$worker‐>job_servers('127.0.0.1:4730');

$worker‐>register_function(echo=>\&echo);

$worker‐>workwhile1;

subecho{

my$job=shift;

say'+1';

return$job‐>arg+1;

}

Page 68: Gearman and Perl

Worker example

my$worker=newGearman::Worker;

$worker‐>job_servers('127.0.0.1:4730');

$worker‐>register_function(echo=>\&echo);

$worker‐>workwhile1;

Page 69: Gearman and Perl

Worker example

my$worker=newGearman::Worker;

$worker‐>job_servers('127.0.0.1:4730');

$worker‐>register_function(echo=>\&echo);

$worker‐>workwhile1;

Connect to the server

Page 70: Gearman and Perl

Worker example

my$worker=newGearman::Worker;

$worker‐>job_servers('127.0.0.1:4730');

$worker‐>register_function(echo=>\&echo);

$worker‐>workwhile1;

Register worker method

Page 71: Gearman and Perl

Worker example

my$worker=newGearman::Worker;

$worker‐>job_servers('127.0.0.1:4730');

$worker‐>register_function(echo=>\&echo);

$worker‐>workwhile1;

Wait for incoming jobs

Page 72: Gearman and Perl

Worker example#!/usr/bin/perl

usev5.10;

usestrict;

useGearman::Worker;

my$worker=newGearman::Worker;

$worker‐>job_servers('127.0.0.1:4730');

$worker‐>register_function(echo=>\&echo);

$worker‐>workwhile1;

subecho{

my$job=shift;

say'+1';

return$job‐>arg+1;

}

Page 73: Gearman and Perl

Job method

subecho{my$job=shift;say'+1';return$job‐>arg+1;}

Receive data

Page 74: Gearman and Perl

Job method

subecho{my$job=shift;say'+1';return$job‐>arg+1;}

Evaluate response

Page 75: Gearman and Perl

Client example#!/usr/bin/perl

use v5.10;use strict;use Gearman::Client;

my $client = new Gearman::Client;$client->job_servers('127.0.0.1:4730');

for (1..10000) {    my $result_ref = $client->do_task('echo', 10);    say $$result_ref;}

Page 76: Gearman and Perl

Client example

for (1..10000) {    my $result_ref = $client->do_task('echo', 10);    say $$result_ref;}

Issue jobs

Page 77: Gearman and Perl

Asynchronous client exampleuse v5.10;use strict;use Gearman::Client;

my $client = new Gearman::Client;$client->job_servers('example.com:4730');

my $tasks = $client->new_task_set;$tasks->add_task(    'echo' => 10,    {        on_complete => \&completed    });

$tasks->wait;

sub completed {    my $result = shift;    say $$result;}

Page 78: Gearman and Perl

my $tasks = $client->new_task_set;$tasks->add_task(    'echo' => 10,    {        on_complete => \&completed    });$tasks->wait;

Get task set placeholder

Asynchronous client example

Page 79: Gearman and Perl

my $tasks = $client->new_task_set;$tasks->add_task(    'echo' => 10,    {        on_complete => \&completed    });$tasks->wait;

Place the task

Asynchronous client example

Page 80: Gearman and Perl

my $tasks = $client->new_task_set;$tasks->add_task(    'echo' => 10,    {        on_complete => \&completed    });$tasks->wait;

and register callback method

Asynchronous client example

Page 81: Gearman and Perl

my $tasks = $client->new_task_set;$tasks->add_task(    'echo' => 10,    {        on_complete => \&completed    });$tasks->wait;

Wait until the job is done

Asynchronous client example

Page 82: Gearman and Perl

sub completed {    my $result = shift;    say $$result;}

Use result somehow

Asynchronous client example

Page 83: Gearman and Perl

XS worker exampleuse v5.10;

use strict;

use Gearman::XS::Worker;

my $worker = new Gearman::XS::Worker;

$worker->add_server('127.0.0.1', 4730);

$worker->add_function('echo', 0, \&echo, undef);

$worker->work() while 1;

sub echo {

    my $job = shift;

    return $job->workload() + 1;

}

Page 84: Gearman and Perl

XS client exampleuse v5.10;

use strict;

use Gearman::XS::Client;

my $client = new Gearman::XS::Client;

$client->add_server('127.0.0.1', 4730);

my ($ret, $result) = $client->do('echo', '15'); # arg as string!

say $result;

Page 85: Gearman and Perl

Async XS client exampleuse v5.10;

use strict;

use Gearman::XS::Client;

my $client = new Gearman::XS::Client;

$client->add_server('127.0.0.1', 4730);

my ($ret1, $task1) = $client->add_task('echo', '15');

my ($ret2, $task2) = $client->add_task('echo', '51');

$client->run_tasks();

Page 86: Gearman and Perl

Monitoring job server

Page 87: Gearman and Perl

TCP protocol

Page 88: Gearman and Perl

Connect with telnet

Page 89: Gearman and Perl

$ telnet localhost 4730

Page 90: Gearman and Perl

$ telnet localhost 4730Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.

Page 91: Gearman and Perl

$ telnet localhost 4730Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.status

Page 92: Gearman and Perl

$ telnet localhost 4730Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.statusecho2   1      1       2echo    5      2       5.

Page 93: Gearman and Perl

echo2   1      1       2echo    5      2       5.

Page 94: Gearman and Perl

echo2   1      1       2echo    5      2       5.

Known worker methods

Page 95: Gearman and Perl

echo2   1      1       2echo    5      2       5.

Jobs running

Page 96: Gearman and Perl

echo2   1      1       2echo    5      2       5.

Jobs queued

Page 97: Gearman and Perl

echo2   1      1       2echo    5      2       5.

Workers available

Page 98: Gearman and Perl

Step by step example

Part III

Page 99: Gearman and Perl

for(...){...}

worker.pl

worker.pl

worker.pl

worker.pl

Page 100: Gearman and Perl

Live demo