SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Distributed
Applications With
Perl & Gearman
Issac Goldstand
issac@itsgoodconsulting.com
ABOUT THE PRESENTOR

http://linkedin.com/in/margol
60 seconds before we get started…
Why Distributed?
 Allow



horizontal scaling of compute nodes

Normal resources (CPU, RAM, Disk)
Other resources (specialized HW, SW)

 True

asynchronous worker processing
 Cross-Language support
 Redundant application availability
Gearman Architecture
Worker
Worker

Server

Client

Server (Cluster)

Client

Server

Worker

Worker Pool
Example 1 – Video Processing



User uploads a video
Server processes the video






Server must transcode the video to
several pre-set resolutions/codecs
Server must extract sample still images
Server must run speech-to-text
recognition to extract subtitles (closed
captions)

Once all of that is completed, server
must update the video metadata to
contain all of the newly available
data and metadata
Example 2 – Map/Reduce Style Big Data
 User

searches for information

Server must search catalog 1
 Server must search catalog 2
…
 Server must search catalog n


 Server

must return combined
search results to user
Example 3 – AntiVirus Scanner


User uploads a file
Server must scan with McAfee
 Server must scan with Norton 360
 Server must scan with Sophos
…
 Server must scan with Engine XYZ




Server returns scan results to user
Gearman Performance Stats
 Collected

in October 2013 (https://groups.google.com/forum/#!topic/gearman/ror1rd6EGX0)
 DealNews – 40 foreground tasks/sec (2 datacenters, 4
servers, 350 workers)
 Etsy – 1000 tasks/sec (2 datacenters, 4 servers, 40 workers)
 Shazam – 10K tasks/sec
 From

my own experience – 30 tasks/sec (1 datacenter, 1
server, 240 workers)
Gearman in Perl
 Gearman

/ Gearman::Server (PP)
 Gearman::XS (“official” libgearman)
 AnyEvent::Gearman and AnyEvent::Gearman::Client (not
the same)
 They aren’t 100% up-to-date
 They aren’t 100% feature-compatible
 The first two are both (individually) good for 90% of use
cases (in my personal experience )
Gearman in other languages










C/C++ - official libgearman+ CLI
PHP – GearmanManager – well maintained
framework, PHP_Gearman (PECL), Net_Gearman (Pure PHP)
Node.JS
.NET/C#
JAVA
Python
UDFs – MySQL, PostgreSQL, Drizzle
Write your own to implement the Gearman binary protocol
Creating a worker
use strict;
use warnings;
use Gearman::Worker;
my $worker = Gearman::Worker->new;
$worker->job_servers('127.0.0.1:4730');
$worker->register_function('say_hello', &hello);
$worker->work ; # will never return
sub hello {
my $arg = $_[0]->arg;
return "Hello, $argn";
}
Testing the worker
[issac@localhost ~]$ gearman -f say_hello 'world'
Hello, world
[issac@localhost ~]$
Writing a client
use strict;
use warnings;
use Gearman::Client;
my $client = Gearman::Client->new;
$client->job_servers('127.0.0.1:4730');
print ${$client->do_task(say_hello => 'world')};
# do_task returns a reference to the response
Writing an asynchronous client
use strict;
use warnings;
use Gearman::Client;
my $client = Gearman::Client->new;
$client->job_servers('127.0.0.1:4730');
my $tasks = $client->new_task_set;
$tasks->add_task(say_hello => 'world', {
on_complete => &done
});
$tasks->wait;
sub done {
print ${$_[0]};
}
Worker response (packet) types
 SUCCESS
 FAIL
 STATUS
 DATA
 EXCEPTION*

 WARNING*
A more sophisticated worker 1/3
use
use
use
use

strict;
warnings;
Gearman::XS qw(:constants);
Gearman::XS::Worker;

my $worker = new Gearman::XS::Worker;
my $ret = $worker->add_server('127.0.0.1');
if ($ret != GEARMAN_SUCCESS) {
printf(STDERR "%sn", $worker->error());
exit(1);
}
$worker->add_options(GEARMAN_WORKER_NON_BLOCKING);
$worker->set_timeout(500);
A more sophisticated worker 2/3
$ret = $worker->add_function("hello", 3, &hello, {});
$ret = $worker->add_function("uhoh", 3, &uhoh, {});
if ($ret != GEARMAN_SUCCESS) {
printf(STDERR "%sn", $worker->error());
}
my $go = 1;
$SIG{TERM} = sub {print "Caught SIGTERMn";$go = 0;};
while ($go) {
my $ret = $worker->work(); # will return after 500ms since we set timeout + nonblocking mode above
if (!($ret == GEARMAN_SUCCESS ||
$ret == GEARMAN_IO_WAIT ||
$ret == GEARMAN_NO_JOBS)) {
printf(STDERR "%sn", $worker->error());
}
$worker->wait();
}
A more sophisticated worker 3/3
sub hello {
my $job = shift;
$job->send_status(1,2);
my $string = "Hello, “.$job->workload()."n";
$job->send_status(2,2);
return $string;
}
sub uhoh{
my $job = shift;
$job->send_warning("uh oh");
$job->send_data($job->workload() . "n");
$job->send_fail();
}
Testing the (slightly) sophisticated worker
[issac@localhost ~]$ gearman -f hello 'world'
50% Complete
100% Complete
Hello, world
[issac@localhost ~]$ gearman -f uhoh 'world'
uh ohworld
Job failed
[issac@localhost ~]$
A more sophisticated client 1/3
use
use
use
use

strict;
warnings;
Gearman::XS qw(:constants);
Gearman::XS::Client;

my $client = Gearman::XS::Client->new;
my $task;
my $ret = $client->add_server('127.0.0.1');
if ($ret != GEARMAN_SUCCESS) {
printf(STDERR "%sn", $client->error());
exit(1);
}
A more sophisticated client 2/3
$client->set_complete_fn(sub {
my $task = shift;
print "COMPLETE: " . $task->data() . "n";
return GEARMAN_SUCCESS;
});
$client->set_data_fn(sub {
print "DATA: " . $_[0]->data() . "n";
return GEARMAN_SUCCESS;
});
$client->set_warning_fn(sub {
print "WARNING: " . $_[0]->data() . "n";
return GEARMAN_SUCCESS;
});
A more sophisticated client 3/3
$client->set_fail_fn(sub {
print "FAIL: " . $_[0]->function_name() . "n";
return GEARMAN_SUCCESS;
});
$client->set_status_fn(sub {
print "STATUS: " . $_[0]->numerator() .
"/" . $_[0]->denominator() . "n";
return GEARMAN_SUCCESS;
});
($ret, $task) = $client->add_task("hello", "world");
($ret, $task) = $client->add_task("uhoh", "it broke");
$ret = $client->run_tasks();
A more sophisticated client (output)
[issac@localhost ~]$ perl asclient.pl
STATUS: 1/2
STATUS: 2/2
COMPLETE: Hello, world
WARNING: uh oh
DATA: it broke
FAIL: uhoh
[issac@localhost ~]$
That’s All, Folks!
Issac Goldstand
issac@itsgoodconsulting.com

Link To Slides

http://www.itsgoodconsulting.com/blog/issac-presenting-distributed-apps-with-gearman-at-telaviv-pm/

Weitere ähnliche Inhalte

Was ist angesagt?

Performance Optimization of Rails Applications
Performance Optimization of Rails ApplicationsPerformance Optimization of Rails Applications
Performance Optimization of Rails Applications
Serge Smetana
 
Rails Application Optimization Techniques & Tools
Rails Application Optimization Techniques & ToolsRails Application Optimization Techniques & Tools
Rails Application Optimization Techniques & Tools
guest05c09d
 
Ruby/rails performance and profiling
Ruby/rails performance and profilingRuby/rails performance and profiling
Ruby/rails performance and profiling
Danny Guinther
 

Was ist angesagt? (20)

Gearman
GearmanGearman
Gearman
 
Gearman, Supervisor and PHP - Job Management with Sanity!
Gearman, Supervisor and PHP - Job Management with Sanity!Gearman, Supervisor and PHP - Job Management with Sanity!
Gearman, Supervisor and PHP - Job Management with Sanity!
 
Gearman and asynchronous processing in PHP applications
Gearman and asynchronous processing in PHP applicationsGearman and asynchronous processing in PHP applications
Gearman and asynchronous processing in PHP applications
 
The Current State of Asynchronous Processing With Ruby
The Current State of Asynchronous Processing With RubyThe Current State of Asynchronous Processing With Ruby
The Current State of Asynchronous Processing With Ruby
 
Asynchronous Processing with Ruby on Rails (RailsConf 2008)
Asynchronous Processing with Ruby on Rails (RailsConf 2008)Asynchronous Processing with Ruby on Rails (RailsConf 2008)
Asynchronous Processing with Ruby on Rails (RailsConf 2008)
 
PowerShell: Automation for everyone
PowerShell: Automation for everyonePowerShell: Automation for everyone
PowerShell: Automation for everyone
 
Performance Optimization of Rails Applications
Performance Optimization of Rails ApplicationsPerformance Optimization of Rails Applications
Performance Optimization of Rails Applications
 
Rails Application Optimization Techniques & Tools
Rails Application Optimization Techniques & ToolsRails Application Optimization Techniques & Tools
Rails Application Optimization Techniques & Tools
 
Making Symofny shine with Varnish - SymfonyCon Madrid 2014
Making Symofny shine with Varnish - SymfonyCon Madrid 2014Making Symofny shine with Varnish - SymfonyCon Madrid 2014
Making Symofny shine with Varnish - SymfonyCon Madrid 2014
 
Care and feeding notes
Care and feeding notesCare and feeding notes
Care and feeding notes
 
Cachopo - Scalable Stateful Services - Madrid Elixir Meetup
Cachopo - Scalable Stateful Services - Madrid Elixir MeetupCachopo - Scalable Stateful Services - Madrid Elixir Meetup
Cachopo - Scalable Stateful Services - Madrid Elixir Meetup
 
Choosing a Web Architecture for Perl
Choosing a Web Architecture for PerlChoosing a Web Architecture for Perl
Choosing a Web Architecture for Perl
 
Building Scalable Websites with Perl
Building Scalable Websites with PerlBuilding Scalable Websites with Perl
Building Scalable Websites with Perl
 
Ruby/rails performance and profiling
Ruby/rails performance and profilingRuby/rails performance and profiling
Ruby/rails performance and profiling
 
Why a new CPAN client cpm is fast
Why a new CPAN client cpm is fastWhy a new CPAN client cpm is fast
Why a new CPAN client cpm is fast
 
Mad scalability: Scaling when you are not Google
Mad scalability: Scaling when you are not GoogleMad scalability: Scaling when you are not Google
Mad scalability: Scaling when you are not Google
 
Ruby 1.9 Fibers
Ruby 1.9 FibersRuby 1.9 Fibers
Ruby 1.9 Fibers
 
Serverless Rust
Serverless RustServerless Rust
Serverless Rust
 
No callbacks, No Threads - Cooperative web servers in Ruby 1.9
No callbacks, No Threads - Cooperative web servers in Ruby 1.9No callbacks, No Threads - Cooperative web servers in Ruby 1.9
No callbacks, No Threads - Cooperative web servers in Ruby 1.9
 
Celery: The Distributed Task Queue
Celery: The Distributed Task QueueCelery: The Distributed Task Queue
Celery: The Distributed Task Queue
 

Andere mochten auch

ZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 Labs
James Dennis
 
Object-Oriented Programming with Perl and Moose
Object-Oriented Programming with Perl and MooseObject-Oriented Programming with Perl and Moose
Object-Oriented Programming with Perl and Moose
Dave Cross
 

Andere mochten auch (14)

Gearman for MySQL
Gearman for MySQLGearman for MySQL
Gearman for MySQL
 
The promise of asynchronous php
The promise of asynchronous phpThe promise of asynchronous php
The promise of asynchronous php
 
Gearman Introduction
Gearman IntroductionGearman Introduction
Gearman Introduction
 
MapReduce Using Perl and Gearman
MapReduce Using Perl and GearmanMapReduce Using Perl and Gearman
MapReduce Using Perl and Gearman
 
Gearman For Beginners
Gearman For BeginnersGearman For Beginners
Gearman For Beginners
 
Scalability In PHP
Scalability In PHPScalability In PHP
Scalability In PHP
 
Klangv2
Klangv2Klangv2
Klangv2
 
Gearman
GearmanGearman
Gearman
 
Scale like an ant, distribute the workload - DPC, Amsterdam, 2011
Scale like an ant, distribute the workload - DPC, Amsterdam,  2011Scale like an ant, distribute the workload - DPC, Amsterdam,  2011
Scale like an ant, distribute the workload - DPC, Amsterdam, 2011
 
ZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 LabsZeroMQ: Super Sockets - by J2 Labs
ZeroMQ: Super Sockets - by J2 Labs
 
Gearman work queue in php
Gearman work queue in phpGearman work queue in php
Gearman work queue in php
 
Object-Oriented Programming with Perl and Moose
Object-Oriented Programming with Perl and MooseObject-Oriented Programming with Perl and Moose
Object-Oriented Programming with Perl and Moose
 
MapReduce入門
MapReduce入門MapReduce入門
MapReduce入門
 
Building a Scalable Web Crawler with Hadoop
Building a Scalable Web Crawler with HadoopBuilding a Scalable Web Crawler with Hadoop
Building a Scalable Web Crawler with Hadoop
 

Ähnlich wie Distributed Applications with Perl & Gearman

Gearmanpresentation 110308165409-phpapp01
Gearmanpresentation 110308165409-phpapp01Gearmanpresentation 110308165409-phpapp01
Gearmanpresentation 110308165409-phpapp01
longtuan
 
Nko workshop - node js crud & deploy
Nko workshop - node js crud & deployNko workshop - node js crud & deploy
Nko workshop - node js crud & deploy
Simon Su
 
Exploiting the newer perl to improve your plugins
Exploiting the newer perl to improve your pluginsExploiting the newer perl to improve your plugins
Exploiting the newer perl to improve your plugins
Marian Marinov
 
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QACreating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
archwisp
 
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
Wesley Beary
 
Yapc::Asia 2008 Tokyo - Easy system administration programming with a framewo...
Yapc::Asia 2008 Tokyo - Easy system administration programming with a framewo...Yapc::Asia 2008 Tokyo - Easy system administration programming with a framewo...
Yapc::Asia 2008 Tokyo - Easy system administration programming with a framewo...
Gosuke Miyashita
 
Troubleshooting Strategies for CloudStack Installations by Kirk Kosinski
Troubleshooting Strategies for CloudStack Installations by Kirk Kosinski Troubleshooting Strategies for CloudStack Installations by Kirk Kosinski
Troubleshooting Strategies for CloudStack Installations by Kirk Kosinski
buildacloud
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统
yiditushe
 

Ähnlich wie Distributed Applications with Perl & Gearman (20)

Gearmanpresentation 110308165409-phpapp01
Gearmanpresentation 110308165409-phpapp01Gearmanpresentation 110308165409-phpapp01
Gearmanpresentation 110308165409-phpapp01
 
Gearman & PHP
Gearman & PHPGearman & PHP
Gearman & PHP
 
Nko workshop - node js crud & deploy
Nko workshop - node js crud & deployNko workshop - node js crud & deploy
Nko workshop - node js crud & deploy
 
Exploiting the newer perl to improve your plugins
Exploiting the newer perl to improve your pluginsExploiting the newer perl to improve your plugins
Exploiting the newer perl to improve your plugins
 
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QACreating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo Web
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
fog or: How I Learned to Stop Worrying and Love the Cloud
fog or: How I Learned to Stop Worrying and Love the Cloudfog or: How I Learned to Stop Worrying and Love the Cloud
fog or: How I Learned to Stop Worrying and Love the Cloud
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php Presentation
 
JUDCon London 2011 - Bin packing with drools planner by example
JUDCon London 2011 - Bin packing with drools planner by exampleJUDCon London 2011 - Bin packing with drools planner by example
JUDCon London 2011 - Bin packing with drools planner by example
 
Scaling python webapps from 0 to 50 million users - A top-down approach
Scaling python webapps from 0 to 50 million users - A top-down approachScaling python webapps from 0 to 50 million users - A top-down approach
Scaling python webapps from 0 to 50 million users - A top-down approach
 
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
fog or: How I Learned to Stop Worrying and Love the Cloud (OpenStack Edition)
 
Yapc::Asia 2008 Tokyo - Easy system administration programming with a framewo...
Yapc::Asia 2008 Tokyo - Easy system administration programming with a framewo...Yapc::Asia 2008 Tokyo - Easy system administration programming with a framewo...
Yapc::Asia 2008 Tokyo - Easy system administration programming with a framewo...
 
Cooking with Chef
Cooking with ChefCooking with Chef
Cooking with Chef
 
Troubleshooting Strategies for CloudStack Installations by Kirk Kosinski
Troubleshooting Strategies for CloudStack Installations by Kirk Kosinski Troubleshooting Strategies for CloudStack Installations by Kirk Kosinski
Troubleshooting Strategies for CloudStack Installations by Kirk Kosinski
 
Postman On Steroids
Postman On SteroidsPostman On Steroids
Postman On Steroids
 
Debugging: Rules & Tools
Debugging: Rules & ToolsDebugging: Rules & Tools
Debugging: Rules & Tools
 
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
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统
 
OSMC 2014: Monitoring VoIP Systems | Sebastian Damm
OSMC 2014: Monitoring VoIP Systems | Sebastian DammOSMC 2014: Monitoring VoIP Systems | Sebastian Damm
OSMC 2014: Monitoring VoIP Systems | Sebastian Damm
 

Kürzlich hochgeladen

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Kürzlich hochgeladen (20)

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
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...
 
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...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
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
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
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
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 

Distributed Applications with Perl & Gearman

  • 1. Distributed Applications With Perl & Gearman Issac Goldstand issac@itsgoodconsulting.com ABOUT THE PRESENTOR http://linkedin.com/in/margol
  • 2. 60 seconds before we get started…
  • 3. Why Distributed?  Allow   horizontal scaling of compute nodes Normal resources (CPU, RAM, Disk) Other resources (specialized HW, SW)  True asynchronous worker processing  Cross-Language support  Redundant application availability
  • 5. Example 1 – Video Processing   User uploads a video Server processes the video     Server must transcode the video to several pre-set resolutions/codecs Server must extract sample still images Server must run speech-to-text recognition to extract subtitles (closed captions) Once all of that is completed, server must update the video metadata to contain all of the newly available data and metadata
  • 6. Example 2 – Map/Reduce Style Big Data  User searches for information Server must search catalog 1  Server must search catalog 2 …  Server must search catalog n   Server must return combined search results to user
  • 7. Example 3 – AntiVirus Scanner  User uploads a file Server must scan with McAfee  Server must scan with Norton 360  Server must scan with Sophos …  Server must scan with Engine XYZ   Server returns scan results to user
  • 8. Gearman Performance Stats  Collected in October 2013 (https://groups.google.com/forum/#!topic/gearman/ror1rd6EGX0)  DealNews – 40 foreground tasks/sec (2 datacenters, 4 servers, 350 workers)  Etsy – 1000 tasks/sec (2 datacenters, 4 servers, 40 workers)  Shazam – 10K tasks/sec  From my own experience – 30 tasks/sec (1 datacenter, 1 server, 240 workers)
  • 9. Gearman in Perl  Gearman / Gearman::Server (PP)  Gearman::XS (“official” libgearman)  AnyEvent::Gearman and AnyEvent::Gearman::Client (not the same)  They aren’t 100% up-to-date  They aren’t 100% feature-compatible  The first two are both (individually) good for 90% of use cases (in my personal experience )
  • 10. Gearman in other languages         C/C++ - official libgearman+ CLI PHP – GearmanManager – well maintained framework, PHP_Gearman (PECL), Net_Gearman (Pure PHP) Node.JS .NET/C# JAVA Python UDFs – MySQL, PostgreSQL, Drizzle Write your own to implement the Gearman binary protocol
  • 11. Creating a worker use strict; use warnings; use Gearman::Worker; my $worker = Gearman::Worker->new; $worker->job_servers('127.0.0.1:4730'); $worker->register_function('say_hello', &hello); $worker->work ; # will never return sub hello { my $arg = $_[0]->arg; return "Hello, $argn"; }
  • 12. Testing the worker [issac@localhost ~]$ gearman -f say_hello 'world' Hello, world [issac@localhost ~]$
  • 13. Writing a client use strict; use warnings; use Gearman::Client; my $client = Gearman::Client->new; $client->job_servers('127.0.0.1:4730'); print ${$client->do_task(say_hello => 'world')}; # do_task returns a reference to the response
  • 14. Writing an asynchronous client use strict; use warnings; use Gearman::Client; my $client = Gearman::Client->new; $client->job_servers('127.0.0.1:4730'); my $tasks = $client->new_task_set; $tasks->add_task(say_hello => 'world', { on_complete => &done }); $tasks->wait; sub done { print ${$_[0]}; }
  • 15. Worker response (packet) types  SUCCESS  FAIL  STATUS  DATA  EXCEPTION*  WARNING*
  • 16. A more sophisticated worker 1/3 use use use use strict; warnings; Gearman::XS qw(:constants); Gearman::XS::Worker; my $worker = new Gearman::XS::Worker; my $ret = $worker->add_server('127.0.0.1'); if ($ret != GEARMAN_SUCCESS) { printf(STDERR "%sn", $worker->error()); exit(1); } $worker->add_options(GEARMAN_WORKER_NON_BLOCKING); $worker->set_timeout(500);
  • 17. A more sophisticated worker 2/3 $ret = $worker->add_function("hello", 3, &hello, {}); $ret = $worker->add_function("uhoh", 3, &uhoh, {}); if ($ret != GEARMAN_SUCCESS) { printf(STDERR "%sn", $worker->error()); } my $go = 1; $SIG{TERM} = sub {print "Caught SIGTERMn";$go = 0;}; while ($go) { my $ret = $worker->work(); # will return after 500ms since we set timeout + nonblocking mode above if (!($ret == GEARMAN_SUCCESS || $ret == GEARMAN_IO_WAIT || $ret == GEARMAN_NO_JOBS)) { printf(STDERR "%sn", $worker->error()); } $worker->wait(); }
  • 18. A more sophisticated worker 3/3 sub hello { my $job = shift; $job->send_status(1,2); my $string = "Hello, “.$job->workload()."n"; $job->send_status(2,2); return $string; } sub uhoh{ my $job = shift; $job->send_warning("uh oh"); $job->send_data($job->workload() . "n"); $job->send_fail(); }
  • 19. Testing the (slightly) sophisticated worker [issac@localhost ~]$ gearman -f hello 'world' 50% Complete 100% Complete Hello, world [issac@localhost ~]$ gearman -f uhoh 'world' uh ohworld Job failed [issac@localhost ~]$
  • 20. A more sophisticated client 1/3 use use use use strict; warnings; Gearman::XS qw(:constants); Gearman::XS::Client; my $client = Gearman::XS::Client->new; my $task; my $ret = $client->add_server('127.0.0.1'); if ($ret != GEARMAN_SUCCESS) { printf(STDERR "%sn", $client->error()); exit(1); }
  • 21. A more sophisticated client 2/3 $client->set_complete_fn(sub { my $task = shift; print "COMPLETE: " . $task->data() . "n"; return GEARMAN_SUCCESS; }); $client->set_data_fn(sub { print "DATA: " . $_[0]->data() . "n"; return GEARMAN_SUCCESS; }); $client->set_warning_fn(sub { print "WARNING: " . $_[0]->data() . "n"; return GEARMAN_SUCCESS; });
  • 22. A more sophisticated client 3/3 $client->set_fail_fn(sub { print "FAIL: " . $_[0]->function_name() . "n"; return GEARMAN_SUCCESS; }); $client->set_status_fn(sub { print "STATUS: " . $_[0]->numerator() . "/" . $_[0]->denominator() . "n"; return GEARMAN_SUCCESS; }); ($ret, $task) = $client->add_task("hello", "world"); ($ret, $task) = $client->add_task("uhoh", "it broke"); $ret = $client->run_tasks();
  • 23. A more sophisticated client (output) [issac@localhost ~]$ perl asclient.pl STATUS: 1/2 STATUS: 2/2 COMPLETE: Hello, world WARNING: uh oh DATA: it broke FAIL: uhoh [issac@localhost ~]$
  • 24. That’s All, Folks! Issac Goldstand issac@itsgoodconsulting.com Link To Slides http://www.itsgoodconsulting.com/blog/issac-presenting-distributed-apps-with-gearman-at-telaviv-pm/