SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Downloaden Sie, um offline zu lesen
Entre na fila. Processamento distribuído usando Gearman
Elton Luís Minetto
Quem sou eu?
• Graduado e pós-graduado em Ciência da Computação.
• Trabalha com PHP/MySQL desde 2000.
• Trabalha com Linux desde 1998
• Autor do livro Frameworks para Desenvolvimento em
PHP - Editora Novatec e co-autor do livro Grid
Computing in Research and Education - IBM Redbooks
• Membro do PHPSC
• Diretor de Desenvolvimento do Drimio e professor na
Unochapecó(Chapecó/SC)
• Sócio da Coderockr
O problema
A solução
O que é
• É um framework genérico para distribuir jobs a serem
executados por uma ou mais máquinas
• Permite uma aplicação executar tarefas em paralelo,
com balanceamento da carga de processos, e até
invocar códigos escritos em outras linguagens
• Pode ser usado em uma variedade enorme de
aplicações. Desde sites de alto tráfego até manipulação
de imagens e grande bancos de dados
Quem criou
• A primeira implementação foi criada pela Danga
Interactive,desenvolvedores do Memcached e MogileFS,
para suportar sites de grande tráfego como LiveJournal
• O nome é um anagrama para "Manager"
Vantagens
• Open Source - comunidade de desenvolvimento muito
ativa
• Multi-language - Existem interfaces para desenvolver
em várias linguagens (C, PHP, Perl, MySQL UDF, Python,
etc). Clients podem ser em uma linguagem, workers em
outra
• Rápido - possui protocolo e interfaces simples, com um
servidor desenvolvido em C
• Sem "single point of failure" - é escalável e tolerante a
falhas
• Digg: +45 servers, 400mil jobs/dia
• Yahoo: +60 servers, 6milhões jobs/dia
• Síncrono ou assíncrono - as tarefas podem ser
executadas das duas formas
Terminologia
• Client- Cria um job a ser executado e o envia a um
servidor de jobs
• Worker - Registra-se em um servidor de jobs e pega
jobs para executar
• Job Server - Recebe os jobs e coordena a entrega de
um job para um worker executar
Arquitetura
Fonte: http://www.gearman.org
Fluxo
Fonte: http://www.gearman.org
Instalando
wget http://launchpad.net/gearmand/trunk/0.13/+download/
gearmand-0.13.tar.gz
tar xfvz gearmand-0.13.tar.gz
cd gearmand-0.13
./configure
make
sudo make install
Iniciando o server
• Simples:
/usr/local/sbin/gearmand -d
• Completo:
/usr/local/sbin/gearmand -d -u <user> -L <host> -p 70
• Sendo
-d Inicia como um daemon em background
-u <user> Executa como o usuário específico
-L <host> Fica ouvindo neste ip
-p <port> Ouve na porta específica (defaul 4730)
PHP
• Instalando a extensão do PHP:
wget http://pecl.php.net/get/gearman-0.7.0.tgz
tar xfvz gearman-0.7.0.tgz
cd gearman-0.7.0
phpize
./configure
make
sudo make install
• Adicionar no php.ini:
extension = gearman.so
Síncrono X Assíncrono
• Síncrono, ou “em primeiro plano”(“foreground”). O
cliente fica parado esperando o fim da execução da
tarefa
• Assíncrono, ou “em segundo plano”(“background”). O
cliente continua sua execução e o trabalho vai ser
realizado por algum Worker. O cliente pode ser avisado
do status por métodos e callbacks
PHP - Exemplo: Cliente Síncrono
<?php
1. $client= new GearmanClient();
2. /*indica em quais servidores o cliente pode enviar
jobs. No caso somente o localhost, pois não é passado
nada*/
3. $client->addServer();
4. /*adiciona um job síncrono, para a fila chamada title,
enviando uma string como parâmetro*/
5. print $client->do("title", "o solisc é muito leGal");
6. print "n";
7. ?>
PHP - Exemplo: Worker Síncrono
<?php
1. $worker= new GearmanWorker();
2. $worker->addServer();//servidores q vai atender
3. /*registra a função title_function como responsável por
atender a fila title*/
4. $worker->addFunction("title", "title_function");
5. while ($worker->work()); //fica em loop trabalhando
6.    
7. //função que vai executar o trabalho
8. function title_function($job)
9. {
10.        return ucwords(strtolower($job->workload()));
11.}
12.?>
PHP - Exemplo: Cliente Assíncrono
<?php
1. $client= new GearmanClient();
2. $client->addServer();
3. for($i=0;$i<10;$i++) {
4.         /*adiciona um job asíncrono, para a fila
chamada title, enviando um array como parâmetro. O
cliente não fica esperando o final do processamento */
5.         $log['data'] = date('l jS of F Y h:i:s A');
6.         $log['msg'] = "Teste de log $i";
7.         $client->doBackground("log_queue", serialize
($log));
8. }
9. ?>
PHP - Exemplo: Worker Assíncrono
<?php
1. $worker= new GearmanWorker();
2. $worker->addServer();
3. //registra a função log_function como responsável por
atender a fila log_queue
4. $worker->addFunction("log_queue", "log_function");
5. while ($worker->work()); //fica em loop trabalhando
6.    
7. function log_function($job){
8.         $log = unserialize($job->workload());
9.         sleep(1); //sleep só para demonstrar executando
10.        echo $log['data'], ' - ', $log['msg'], "n";
11.}
12.?>
Python - Exemplo: Worker Assíncrono
from gearman import libgearman
1.  
2. def worker_func(job):
3.   workload= job.get_workload()
4.   print workload
5.   return workload
6.  
7. worker = libgearman.Worker()
8. worker.set_timeout(5000)
9. worker.add_server('localhost')
10.worker.add_function("log_queue", worker_func)
11.ret= libgearman.GEARMAN_SUCCESS
12.while 1:
13.  ret= worker.work()
PHP - Job API
• GearmanJob::sendStatus(int $numerator, int $denominator)
• GearmanJob::sendWarning(string $warning)
• GearmanJob::sendComplete(string $result)
• GearmanJob::sendFail(void)
• GearmanJob::sendException(string $exception)
PHP - Job API - Client
<?php
1. $client= new GearmanClient();
2. $client->addServer();
3. $handle = $client->doBackground("title", "o solisc");
4. if($client->returnCode() != GEARMAN_SUCCESS) {
5. echo "Job com problemas";exit;
6. }
7. $done = false;
8. do {
9. sleep(2);
10. $stat = $client->jobStatus($handle);
11. if(!$stat[0]) { $done = true; }//job terminou
12. if($stat[1] == true)
13. echo "Executando:", ' passo ' , $stat[2], ' de ',
$stat[3], "n";
14.}while(!$done);
15.?>
PHP - Job API - Worker
<?php
1. $worker= new GearmanWorker();
2. $worker->addServer();
3. $worker->addFunction("title", "title_function");
4. while ($worker->work());
5.    
6. function title_function($job){
7. $job->sendStatus(0, 2);
8. sleep(3);
9. $job->sendStatus(1, 2);
10. sleep(3);
11. $job->sendStatus(2, 2);
12. return ucwords(strtolower($job->workload()));
13.}
14.?>
PHP - Client API - Prioridades
//sincrono
1. echo $client->do("title", "o solisc é muito leGal");
2. echo $client->doHigh("title", "o solisc é muito
leGal");
3. echo $client->doLow("title", "o solisc é muito leGal");
4.        
5. //assíncrono
6. $handle1 = $client->doBackground("title", "o solisc é
muito leGal");
7. $handle1 = $client->doHighBackground("title", "o solisc
é muito leGal");
8. $handle1 = $client->doLowBackground("title", "o solisc
é muito leGal");
PHP - Callbacks
• É possível configurar funções para serem executadas
em determinados eventos:
• GearmanClient::setDataCallback
• GearmanClient::setCompleteCallback
• GearmanClient::setCreatedCallback
• GearmanClient::setExceptionCallback
• GearmanClient::setFailCallBack
• GearmanClient::setStatusCallback
• GearmanClient::setWorkloadCallback
Tasks, Jobs e Callbacks
<?php
1. $client= new GearmanClient();
2. $client->addServer();
3. //adicionando tarefas. Tmb podem ter prioridades
4. $client->addTask("title", "o solisc é muito leGal",
null, '1');
5. $client->addTask("title", "tesTanDO", null, '2');
6. //configura o callback a ser executando
7. $client->setCompleteCallback("completo");
8. $client->runTasks(); //execute!!
9. function completo($task) {
10. echo "Completo:", $task->unique(), ' ', $task->data
(), "n";
11.}
12.?>
Filas Persistentes
• Internamente todas as filas de jobs são armazenadas
em memória. Se o servidor reinicia ou acontece algum
erro todos os jobs pendentes são perdidos
• Pode-se usar filas persistentes para armazenar os jobs
pendentes. Mas somente jobs em "background" ou
assíncronos podem ser armazenados, pois os jobs
síncronos são monitorados pelo cliente que o criou
• É possível armazenar a fila em:
• MySQL (libdrizzle)
• Memcached (libmemcached)
• SQLite3 (libsqlite3)
Monitorando - Telnet
telnet localhost 4730
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
status
jobLog	 0	 0	 1
jobTwitter	0	 0	 1
jobTwitterUser	 0	 0	 1
jobFacebookPostSearch	 0	 0	 1
jobFeed	 0	 0	 1
jobBlogsearch	 0	 0	 1
jobFacebookUser	 2	 1	 1
jobSlideshareUser	0	 0	 1
Monitorando - Monit
Áreas de Aplicação
• Análise de logs
• Redimensionamento de imagens
• Processamento de URLs
• Atualização de cache
• Jobs de banco de dados
• etc
Case Drimio
• Processamento de Logs
• Monitoramento de redes sociais (Twitter, Youtube,
Flickr, Yahoo, Facebook, Feeds, Blogsearch, Slideshare,
etc)
• Envio de e-mails
• Captura de snapshots de URLS
• Envio de tweets/posts Facebook
• Redimensionamento de imagens
Case Drimio - Buscapé
1. Faz pesquisa 2. Chamada de API
3. Resultado
4. Jobs para processar imagens e para Log de acesso
Imagens processadas e salvas em Memcached e Logs em
MySQL
5. Página de resultados
Referências
• http://www.phpclasses.org/blog/post/108-Distributing-PHP-
processing-with-Gearman.html
• http://www.ibm.com/developerworks/br/opensource/library/os-
php-gearman/?ca=drs-
• http://gearman.org/index.php?
id=manual:job_server#persistent_queues
• http://www.slideshare.net/felixdv/high-gear-php-with-gearman
• http://toys.lerdorf.com/archives/51-Playing-with-Gearman.html
• http://www.oreillynet.com/pub/e/1564
• http://weierophinney.net/matthew/archives/240-Writing-
Gearman-Workers-in-PHP.html#extended
• http://datacharmer.blogspot.com/2009/11/gearman-for-
mysql.html
• http://www.daviddemartini.com/archives/1405
• http://mmonit.com/monit/
Perguntas
Contato
<?php
$card = array(
	 ‘nome’ => ‘Elton Luís Minetto’,
	 ‘site’ => ‘http://www.eltonminetto.net’,
	 ‘e-mail’ => ‘eminetto@coderockr.com’,
‘twitter’ => ‘@eminetto’
);
var_dump($card);
?>

Weitere ähnliche Inhalte

Was ist angesagt?

Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
Fabrízio Mello
 

Was ist angesagt? (20)

Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com Nginx
 
QCon 2019 - Kubernetes Deepdive
QCon 2019 -  Kubernetes DeepdiveQCon 2019 -  Kubernetes Deepdive
QCon 2019 - Kubernetes Deepdive
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
Alta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - NginxAlta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - Nginx
 
Temperatura Zabbix Procedimento Temper Usb
Temperatura Zabbix Procedimento Temper UsbTemperatura Zabbix Procedimento Temper Usb
Temperatura Zabbix Procedimento Temper Usb
 
Node JS - Parte 3
Node JS - Parte 3Node JS - Parte 3
Node JS - Parte 3
 
Plack
PlackPlack
Plack
 
Iniciando com Yeoman, Grunt e Bower
Iniciando com Yeoman, Grunt e BowerIniciando com Yeoman, Grunt e Bower
Iniciando com Yeoman, Grunt e Bower
 
I educar-manual-de-instalaao
I educar-manual-de-instalaaoI educar-manual-de-instalaao
I educar-manual-de-instalaao
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Git 101
Git 101Git 101
Git 101
 
A busca pelo deploy continuo
A busca pelo deploy continuoA busca pelo deploy continuo
A busca pelo deploy continuo
 
Gerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetGerenciamento de Configurações - Puppet
Gerenciamento de Configurações - Puppet
 
Vagrant + Puppet
Vagrant + PuppetVagrant + Puppet
Vagrant + Puppet
 
Datacenter na nuvem
Datacenter na nuvemDatacenter na nuvem
Datacenter na nuvem
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
 
Yet Another Ruby Framework - Como o Rails funciona por dentro
Yet Another Ruby Framework - Como o Rails funciona por dentroYet Another Ruby Framework - Como o Rails funciona por dentro
Yet Another Ruby Framework - Como o Rails funciona por dentro
 
Docker Swarm - Sua aplicação pronta para escalar
Docker Swarm - Sua aplicação pronta para escalarDocker Swarm - Sua aplicação pronta para escalar
Docker Swarm - Sua aplicação pronta para escalar
 
Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e Varnish
Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e VarnishEscalabilidade e performance da infraestrutura Plone/Zope com CacheFU e Varnish
Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e Varnish
 

Ähnlich wie Entre na fila. Processamento distribuído usando Gearman

Ferramentas para Automação de Datacenter - GTER 37
Ferramentas para Automação de Datacenter - GTER 37Ferramentas para Automação de Datacenter - GTER 37
Ferramentas para Automação de Datacenter - GTER 37
Wilson Lopes
 
Ferramentas para Automação de Datacenter
Ferramentas para Automação de DatacenterFerramentas para Automação de Datacenter
Ferramentas para Automação de Datacenter
Wilson Lopes
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 

Ähnlich wie Entre na fila. Processamento distribuído usando Gearman (20)

Zabbix monitorando o zimbra collaboration 8.8 (1)
Zabbix   monitorando o zimbra collaboration 8.8 (1)Zabbix   monitorando o zimbra collaboration 8.8 (1)
Zabbix monitorando o zimbra collaboration 8.8 (1)
 
Python 08
Python 08Python 08
Python 08
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2
 
Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
 
Project HA
Project HAProject HA
Project HA
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Aula PIT 3 - Ambientes
Aula PIT 3 - AmbientesAula PIT 3 - Ambientes
Aula PIT 3 - Ambientes
 
Ferramentas para Automação de Datacenter - GTER 37
Ferramentas para Automação de Datacenter - GTER 37Ferramentas para Automação de Datacenter - GTER 37
Ferramentas para Automação de Datacenter - GTER 37
 
Ferramentas para Automação de Datacenter
Ferramentas para Automação de DatacenterFerramentas para Automação de Datacenter
Ferramentas para Automação de Datacenter
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLI
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresasDockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas
 
Docker - Tutorial for beginners
Docker - Tutorial for beginnersDocker - Tutorial for beginners
Docker - Tutorial for beginners
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
Monitoramento de serviços com Zabbix + Grafana + Python - Marcelo Santoto - D...
 
Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016
 
Docker do básico a orquestração (PHPeste2016)
Docker do básico a orquestração (PHPeste2016)Docker do básico a orquestração (PHPeste2016)
Docker do básico a orquestração (PHPeste2016)
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 

Mehr von Elton Minetto

Mehr von Elton Minetto (20)

Go e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroGo e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outro
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em Go
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github Projects
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Serverless em Go
Serverless em GoServerless em Go
Serverless em Go
 
JAMstack
JAMstackJAMstack
JAMstack
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver software
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHP
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in Golang
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedor
 
Product and Technology
Product and TechnologyProduct and Technology
Product and Technology
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech Stack
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIs
 
12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP world
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using Go
 
Start you
Start youStart you
Start you
 
O case da Compufácil e AWS
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWS
 
Introdução a Go
Introdução a GoIntrodução a Go
Introdução a Go
 

Kürzlich hochgeladen

Kürzlich hochgeladen (6)

ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

Entre na fila. Processamento distribuído usando Gearman

  • 1. Entre na fila. Processamento distribuído usando Gearman Elton Luís Minetto
  • 2. Quem sou eu? • Graduado e pós-graduado em Ciência da Computação. • Trabalha com PHP/MySQL desde 2000. • Trabalha com Linux desde 1998 • Autor do livro Frameworks para Desenvolvimento em PHP - Editora Novatec e co-autor do livro Grid Computing in Research and Education - IBM Redbooks • Membro do PHPSC • Diretor de Desenvolvimento do Drimio e professor na Unochapecó(Chapecó/SC) • Sócio da Coderockr
  • 5. O que é • É um framework genérico para distribuir jobs a serem executados por uma ou mais máquinas • Permite uma aplicação executar tarefas em paralelo, com balanceamento da carga de processos, e até invocar códigos escritos em outras linguagens • Pode ser usado em uma variedade enorme de aplicações. Desde sites de alto tráfego até manipulação de imagens e grande bancos de dados
  • 6. Quem criou • A primeira implementação foi criada pela Danga Interactive,desenvolvedores do Memcached e MogileFS, para suportar sites de grande tráfego como LiveJournal • O nome é um anagrama para "Manager"
  • 7. Vantagens • Open Source - comunidade de desenvolvimento muito ativa • Multi-language - Existem interfaces para desenvolver em várias linguagens (C, PHP, Perl, MySQL UDF, Python, etc). Clients podem ser em uma linguagem, workers em outra • Rápido - possui protocolo e interfaces simples, com um servidor desenvolvido em C • Sem "single point of failure" - é escalável e tolerante a falhas • Digg: +45 servers, 400mil jobs/dia • Yahoo: +60 servers, 6milhões jobs/dia • Síncrono ou assíncrono - as tarefas podem ser executadas das duas formas
  • 8. Terminologia • Client- Cria um job a ser executado e o envia a um servidor de jobs • Worker - Registra-se em um servidor de jobs e pega jobs para executar • Job Server - Recebe os jobs e coordena a entrega de um job para um worker executar
  • 11. Instalando wget http://launchpad.net/gearmand/trunk/0.13/+download/ gearmand-0.13.tar.gz tar xfvz gearmand-0.13.tar.gz cd gearmand-0.13 ./configure make sudo make install
  • 12. Iniciando o server • Simples: /usr/local/sbin/gearmand -d • Completo: /usr/local/sbin/gearmand -d -u <user> -L <host> -p 70 • Sendo -d Inicia como um daemon em background -u <user> Executa como o usuário específico -L <host> Fica ouvindo neste ip -p <port> Ouve na porta específica (defaul 4730)
  • 13. PHP • Instalando a extensão do PHP: wget http://pecl.php.net/get/gearman-0.7.0.tgz tar xfvz gearman-0.7.0.tgz cd gearman-0.7.0 phpize ./configure make sudo make install • Adicionar no php.ini: extension = gearman.so
  • 14. Síncrono X Assíncrono • Síncrono, ou “em primeiro plano”(“foreground”). O cliente fica parado esperando o fim da execução da tarefa • Assíncrono, ou “em segundo plano”(“background”). O cliente continua sua execução e o trabalho vai ser realizado por algum Worker. O cliente pode ser avisado do status por métodos e callbacks
  • 15. PHP - Exemplo: Cliente Síncrono <?php 1. $client= new GearmanClient(); 2. /*indica em quais servidores o cliente pode enviar jobs. No caso somente o localhost, pois não é passado nada*/ 3. $client->addServer(); 4. /*adiciona um job síncrono, para a fila chamada title, enviando uma string como parâmetro*/ 5. print $client->do("title", "o solisc é muito leGal"); 6. print "n"; 7. ?>
  • 16. PHP - Exemplo: Worker Síncrono <?php 1. $worker= new GearmanWorker(); 2. $worker->addServer();//servidores q vai atender 3. /*registra a função title_function como responsável por atender a fila title*/ 4. $worker->addFunction("title", "title_function"); 5. while ($worker->work()); //fica em loop trabalhando 6.     7. //função que vai executar o trabalho 8. function title_function($job) 9. { 10.        return ucwords(strtolower($job->workload())); 11.} 12.?>
  • 17. PHP - Exemplo: Cliente Assíncrono <?php 1. $client= new GearmanClient(); 2. $client->addServer(); 3. for($i=0;$i<10;$i++) { 4.         /*adiciona um job asíncrono, para a fila chamada title, enviando um array como parâmetro. O cliente não fica esperando o final do processamento */ 5.         $log['data'] = date('l jS of F Y h:i:s A'); 6.         $log['msg'] = "Teste de log $i"; 7.         $client->doBackground("log_queue", serialize ($log)); 8. } 9. ?>
  • 18. PHP - Exemplo: Worker Assíncrono <?php 1. $worker= new GearmanWorker(); 2. $worker->addServer(); 3. //registra a função log_function como responsável por atender a fila log_queue 4. $worker->addFunction("log_queue", "log_function"); 5. while ($worker->work()); //fica em loop trabalhando 6.     7. function log_function($job){ 8.         $log = unserialize($job->workload()); 9.         sleep(1); //sleep só para demonstrar executando 10.        echo $log['data'], ' - ', $log['msg'], "n"; 11.} 12.?>
  • 19. Python - Exemplo: Worker Assíncrono from gearman import libgearman 1.   2. def worker_func(job): 3.   workload= job.get_workload() 4.   print workload 5.   return workload 6.   7. worker = libgearman.Worker() 8. worker.set_timeout(5000) 9. worker.add_server('localhost') 10.worker.add_function("log_queue", worker_func) 11.ret= libgearman.GEARMAN_SUCCESS 12.while 1: 13.  ret= worker.work()
  • 20. PHP - Job API • GearmanJob::sendStatus(int $numerator, int $denominator) • GearmanJob::sendWarning(string $warning) • GearmanJob::sendComplete(string $result) • GearmanJob::sendFail(void) • GearmanJob::sendException(string $exception)
  • 21. PHP - Job API - Client <?php 1. $client= new GearmanClient(); 2. $client->addServer(); 3. $handle = $client->doBackground("title", "o solisc"); 4. if($client->returnCode() != GEARMAN_SUCCESS) { 5. echo "Job com problemas";exit; 6. } 7. $done = false; 8. do { 9. sleep(2); 10. $stat = $client->jobStatus($handle); 11. if(!$stat[0]) { $done = true; }//job terminou 12. if($stat[1] == true) 13. echo "Executando:", ' passo ' , $stat[2], ' de ', $stat[3], "n"; 14.}while(!$done); 15.?>
  • 22. PHP - Job API - Worker <?php 1. $worker= new GearmanWorker(); 2. $worker->addServer(); 3. $worker->addFunction("title", "title_function"); 4. while ($worker->work()); 5.     6. function title_function($job){ 7. $job->sendStatus(0, 2); 8. sleep(3); 9. $job->sendStatus(1, 2); 10. sleep(3); 11. $job->sendStatus(2, 2); 12. return ucwords(strtolower($job->workload())); 13.} 14.?>
  • 23. PHP - Client API - Prioridades //sincrono 1. echo $client->do("title", "o solisc é muito leGal"); 2. echo $client->doHigh("title", "o solisc é muito leGal"); 3. echo $client->doLow("title", "o solisc é muito leGal"); 4.         5. //assíncrono 6. $handle1 = $client->doBackground("title", "o solisc é muito leGal"); 7. $handle1 = $client->doHighBackground("title", "o solisc é muito leGal"); 8. $handle1 = $client->doLowBackground("title", "o solisc é muito leGal");
  • 24. PHP - Callbacks • É possível configurar funções para serem executadas em determinados eventos: • GearmanClient::setDataCallback • GearmanClient::setCompleteCallback • GearmanClient::setCreatedCallback • GearmanClient::setExceptionCallback • GearmanClient::setFailCallBack • GearmanClient::setStatusCallback • GearmanClient::setWorkloadCallback
  • 25. Tasks, Jobs e Callbacks <?php 1. $client= new GearmanClient(); 2. $client->addServer(); 3. //adicionando tarefas. Tmb podem ter prioridades 4. $client->addTask("title", "o solisc é muito leGal", null, '1'); 5. $client->addTask("title", "tesTanDO", null, '2'); 6. //configura o callback a ser executando 7. $client->setCompleteCallback("completo"); 8. $client->runTasks(); //execute!! 9. function completo($task) { 10. echo "Completo:", $task->unique(), ' ', $task->data (), "n"; 11.} 12.?>
  • 26. Filas Persistentes • Internamente todas as filas de jobs são armazenadas em memória. Se o servidor reinicia ou acontece algum erro todos os jobs pendentes são perdidos • Pode-se usar filas persistentes para armazenar os jobs pendentes. Mas somente jobs em "background" ou assíncronos podem ser armazenados, pois os jobs síncronos são monitorados pelo cliente que o criou • É possível armazenar a fila em: • MySQL (libdrizzle) • Memcached (libmemcached) • SQLite3 (libsqlite3)
  • 27. Monitorando - Telnet telnet localhost 4730 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. status jobLog 0 0 1 jobTwitter 0 0 1 jobTwitterUser 0 0 1 jobFacebookPostSearch 0 0 1 jobFeed 0 0 1 jobBlogsearch 0 0 1 jobFacebookUser 2 1 1 jobSlideshareUser 0 0 1
  • 29. Áreas de Aplicação • Análise de logs • Redimensionamento de imagens • Processamento de URLs • Atualização de cache • Jobs de banco de dados • etc
  • 30. Case Drimio • Processamento de Logs • Monitoramento de redes sociais (Twitter, Youtube, Flickr, Yahoo, Facebook, Feeds, Blogsearch, Slideshare, etc) • Envio de e-mails • Captura de snapshots de URLS • Envio de tweets/posts Facebook • Redimensionamento de imagens
  • 31. Case Drimio - Buscapé 1. Faz pesquisa 2. Chamada de API 3. Resultado 4. Jobs para processar imagens e para Log de acesso Imagens processadas e salvas em Memcached e Logs em MySQL 5. Página de resultados
  • 32. Referências • http://www.phpclasses.org/blog/post/108-Distributing-PHP- processing-with-Gearman.html • http://www.ibm.com/developerworks/br/opensource/library/os- php-gearman/?ca=drs- • http://gearman.org/index.php? id=manual:job_server#persistent_queues • http://www.slideshare.net/felixdv/high-gear-php-with-gearman • http://toys.lerdorf.com/archives/51-Playing-with-Gearman.html • http://www.oreillynet.com/pub/e/1564 • http://weierophinney.net/matthew/archives/240-Writing- Gearman-Workers-in-PHP.html#extended • http://datacharmer.blogspot.com/2009/11/gearman-for- mysql.html • http://www.daviddemartini.com/archives/1405 • http://mmonit.com/monit/
  • 34. Contato <?php $card = array( ‘nome’ => ‘Elton Luís Minetto’, ‘site’ => ‘http://www.eltonminetto.net’, ‘e-mail’ => ‘eminetto@coderockr.com’, ‘twitter’ => ‘@eminetto’ ); var_dump($card); ?>