SlideShare uma empresa Scribd logo
Ao infinito e além com PHP, Memcached e Gearman
Elton Luís Minetto
segunda-feira, 29 de novembro de 2010
Quem sou eu?
• Graduado e pós-graduado em Ciência da Computação.
• Trabalha com PHP/MySQL/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
• Professor na Unochapecó(Chapecó/SC)
• Sócio da Coderockr
segunda-feira, 29 de novembro de 2010
O problema
segunda-feira, 29 de novembro de 2010
O problema
segunda-feira, 29 de novembro de 2010
O problema
segunda-feira, 29 de novembro de 2010
O problema
segunda-feira, 29 de novembro de 2010
O problema
• Performance: a habilidade que uma aplicação tem de
atingir um objetivo, como por exemplo responder no
menor tempo possível
• Capacidade: a carga total que uma aplicação pode
suportar
• Escalabilidade: a habilidade de uma aplicação manter a
performance quando a carga de trabalho aumenta. É a
junção da capacidade e da performance
• “Performance is a problem. Scaling your performance is a
bigger problem”
segunda-feira, 29 de novembro de 2010
A solução
Distribua!
segunda-feira, 29 de novembro de 2010
Distribua!
Memória
segunda-feira, 29 de novembro de 2010
Distribua!
Trabalho
segunda-feira, 29 de novembro de 2010
Distribua!
segunda-feira, 29 de novembro de 2010
GLAMMP
• Gearman
• Linux
• Apache
• MySQL
• Memcached
• Php (ou Perl ou Python)
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
• Sistema distribuído e de alta performance para fazer
cache de objetos em memória RAM.
• Genérico por natureza mas muito usado para acelerar
aplicações web dinâmicas, reduzindo a carga de bases
de dados, sessões de usuários, arquivos CSS.
• Criado pela
O que é?
segunda-feira, 29 de novembro de 2010
Por que usar?
• Escalável: fácil adicionar máquinas e instâncias
• RAM é muito mais rápido que I/O em disco
• Alivia a carga do banco de dados
• Muito flexível: pode armazenar qualquer dado, desde
que não ultrapasse 1 MB
• Bibliotecas client disponíveis em diversas linguagens
(PHP, C, Java, Ruby, Python)
• Open Source
segunda-feira, 29 de novembro de 2010
Como funciona?
• Armazena qualquer coisa que pode ser serializado
• Armazena com uma chave única (255 caracteres) e
tempo de validade
• O programador usa da seguinte forma :
• Encontrou no cache? Retorna os dados
• Não encontrou no cache? Processa, armazena no cache e
retorna o dado
segunda-feira, 29 de novembro de 2010
Como funciona?
segunda-feira, 29 de novembro de 2010
O que armazenar?
• Resultados de consultas SQL
• Páginas inteiras
• Sessões de usuários
• Fragmentos de HTML gerados
• Imagens (thumbnails)
• Arquivos css
• Arquivos js
• “Qualquer coisa que demore um pouco para ser gerada”
segunda-feira, 29 de novembro de 2010
Quem usa?
• Facebook
• 805 servidores 8-core. 28TB de RAM. 300K req/seg (Set. 2008)
• Desenvolveu fork com suporte a UDP
• http://github.com/fbmarc/facebook-memcached/tree/
master
• Flickr
• 38K req/seg. 12 milhões de objetos (Set. 2008)
• Digg
• Drimio
• Sessões de usuários, imagens, arquivos CSS, arquivos JS,
resultados de consultas SQL
segunda-feira, 29 de novembro de 2010
Como usar?
Baixar código em http://www.danga.com/memcached/
e...
tar -xvzf memcached-X.Y.Z.tar.gz
cd memcached-X.Y.Z
./configure
make
sudo make install
Santíssima Trindade
segunda-feira, 29 de novembro de 2010
Como usar?
• No exemplo abaixo iniciamos o daemon com 128MB
RAM, ouvindo na porta 11211 no ip 127.0.0.1
/usr/local/bin/memcached -d -m 128 -l 127.0.0.1 -p 11211
• Pode-se criar quantas instâncias forem necessárias,
mudando a porta. Assim aumenta-se o espaço total do
cache
segunda-feira, 29 de novembro de 2010
Como usar com PHP?
• Download do módulo em http://pecl.php.net/package/
memcache.
• e..
tar -xvzf memcache-2.2.5.tgz
cd memcache-2.2.5
phpize
./configure
make
sudo make install (executar como root)
• Adicionar a linha abaixo no php.ini e reiniciar o Apache
extension=memcache.so
segunda-feira, 29 de novembro de 2010
Como usar com PHP?
<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$memcache->connect('localhost', 11212);
$memcache->connect(’192.168.0.10', 11212);
$conteudo = $memcache->get('estados');
if($conteudo === false) {
	 $uf = array('SC','RS','SP');
	 $memcache->set('estados', $uf, false, 100) ;
	 $conteudo = $uf;
}
var_dump($conteudo);
?>
segunda-feira, 29 de novembro de 2010
API
• Comandos de armazenamento:
• set, add, replace, append
• Comandos de recuperação:
• get
• Comandos de exclusão:
• delete
• Outros comandos:
• stats, flush_all, version, verbosity, quit
segunda-feira, 29 de novembro de 2010
Monitorando
• Plugin para o Nagios
• memcache.php
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
• 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
• O nome é um anagrama para "Manager"
• Criado pela
O que é?
segunda-feira, 29 de novembro de 2010
Áreas de Aplicação
• Análise de logs
• Redimensionamento de imagens
• Processamento de URLs
• Atualização de cache
• Jobs de banco de dados
• etc
segunda-feira, 29 de novembro de 2010
Por que usar?
• Open Source com 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
• Escalável e tolerante a falhas
• Digg: +45 servers, 400mil jobs/dia (em 2009)
• Yahoo: +60 servers, 6milhões jobs/dia
• Síncrono ou assíncrono
segunda-feira, 29 de novembro de 2010
Como funciona?
• 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
segunda-feira, 29 de novembro de 2010
Como funciona?
Fonte: http://www.gearman.org
segunda-feira, 29 de novembro de 2010
Como funciona?
Fonte: http://www.gearman.org
segunda-feira, 29 de novembro de 2010
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
segunda-feira, 29 de novembro de 2010
Instalando
wget http://launchpad.net/gearmand/trunk/0.13/+download/
gearmand-X.Y.tar.gz
tar xfvz gearmand-X.Y.tar.gz
cd gearmand-X.Y
./configure
make
sudo make install
Lembra?
Santíssima Trindade
segunda-feira, 29 de novembro de 2010
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)
segunda-feira, 29 de novembro de 2010
PHP
• Instalando a extensão do PHP:
wget http://pecl.php.net/get/gearman-X.Y.Z.tgz
tar xfvz gearman-X.Y.Z.tgz
cd gearman-X.Y.Z
phpize
./configure
make
sudo make install
• Adicionar no php.ini:
extension = gearman.so
Acabou a
criativade :(
Mas você
entendeu né?
segunda-feira, 29 de novembro de 2010
PHP - Exemplo: Cliente Síncrono
<?php
$client= new GearmanClient();
/*indica em quais servidores o cliente pode enviar jobs.
No caso somente o localhost, pois não é passado nada*/
$client->addServer();
/*adiciona um job síncrono, para a fila chamada title,
enviando uma string como parâmetro*/
print $client->do("title", "o Ivo andava de PATINS!!!");
print "n";
?>
segunda-feira, 29 de novembro de 2010
PHP - Exemplo: Worker Síncrono
<?php
$worker= new GearmanWorker();
$worker->addServer();//servidores q vai atender
/*registra a função title_function como responsável por
atender a fila title*/
$worker->addFunction("title", "title_function");
while ($worker->work()); //fica em loop trabalhando
   
//função que vai executar o trabalho
function title_function($job)
{
        return ucwords(strtolower($job->workload()));
}
?>
segunda-feira, 29 de novembro de 2010
PHP - Exemplo: Cliente Assíncrono
<?php
$client= new GearmanClient();
$client->addServer();
for($i=0;$i<10;$i++) {
        /*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 */
        $log['data'] = date('l jS of F Y h:i:s A');
        $log['msg'] = "O Ivo andou de patins $i vez(es)";
        $client->doBackground("log_queue", serialize
($log));
}
?>
segunda-feira, 29 de novembro de 2010
PHP - Exemplo: Worker Assíncrono
<?php
$worker= new GearmanWorker();
$worker->addServer();
/*registra a função log_function como responsável por
atender a fila log_queue*/
$worker->addFunction("log_queue", "log_function");
while ($worker->work()); //fica em loop trabalhando
   
function log_function($job){
        $log = unserialize($job->workload());
        sleep(1); //sleep só para demonstrar executando
        echo $log['data'], ' - ', $log['msg'], "n";
}
?>
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
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()
segunda-feira, 29 de novembro de 2010
PHP - Job API
• GearmanJob::sendStatus(int $numerator, int
$denominator)
• GearmanJob::sendWarning(string $warning)
• GearmanJob::sendComplete(string $result)
• GearmanJob::sendFail(void)
• GearmanJob::sendException(string $exception)
segunda-feira, 29 de novembro de 2010
PHP - Job API - Client
<?php
1. $client= new GearmanClient();
2. $client->addServer();
3. $handle = $client->doBackground("title", "o PHp");
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.?>
segunda-feira, 29 de novembro de 2010
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.?>
segunda-feira, 29 de novembro de 2010
PHP - Client API - Prioridades
• Síncrono
echo $client->do("title", "uma frasE quAlquer");
echo $client->doHigh("title", "uma frasE quAlquer");
echo $client->doLow("title", "uma frasE quAlquer"); 
• Assíncrono
$handle1 = $client->doBackground("title", "uma frasE quAlquer");
$handle1 = $client->doHighBackground("title", "uma frasE
quAlquer");
$handle1 = $client->doLowBackground("title", "uma frasE
quAlquer");
segunda-feira, 29 de novembro de 2010
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 (somente jobs assíncronos)
• É possível armazenar a fila em:
• MySQL (libdrizzle)
• Memcached (libmemcached)
• SQLite3 (libsqlite3)
segunda-feira, 29 de novembro de 2010
Monitorando
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
segunda-feira, 29 de novembro de 2010
Gearman no 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
• Média de 55 mil jobs/dia
segunda-feira, 29 de novembro de 2010
Tudo junto reunido!
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
segunda-feira, 29 de novembro de 2010
Perguntas?
segunda-feira, 29 de novembro de 2010
Contato
<?php
$card = array(
‘nome’ => ‘Elton Luís Minetto’,
‘site’ => ‘http://www.eltonminetto.net’,
‘e-mail’ => ‘eminetto@coderockr.com’,
‘twitter’ => ‘@eminetto’,
‘all’ => ‘http://about.me/eminetto'
);
var_dump($card);
?>
segunda-feira, 29 de novembro de 2010
Referências
• http://www.danga.com
• http://www.slideshare.net/andreizm/all-the-little-
pieces-1573862
• http://www.slideshare.net/acme/scaling-with-
memcached
• http://www.slideshare.net/oemebamo/introduction-to-
memcached
• http://www.slideshare.net/felixdv/high-gear-php-with-
gearman-3404242
• http://www.eltonminetto.net/material-da-palestra-no-
phpsc-conf-2009.htm
• http://www.eltonminetto.net/material-de-minha-
palestra-sobre-gearman.htm
segunda-feira, 29 de novembro de 2010

Mais conteúdo relacionado

Mais procurados

Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento Android
José Alexandre Macedo
 
Gestion des dossiers et fichiers
Gestion des dossiers et fichiersGestion des dossiers et fichiers
Gestion des dossiers et fichiers
s12ber
 
Linguagem C 10 Arquivos
Linguagem C 10 ArquivosLinguagem C 10 Arquivos
Linguagem C 10 Arquivos
Regis Magalhães
 
Aula 9 - Estruturas Condicionais
Aula 9 - Estruturas CondicionaisAula 9 - Estruturas Condicionais
Aula 9 - Estruturas Condicionais
Luiz Augusto Macêdo Morais
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
Elmano Cavalcanti
 
Dead Lock Analysis of spin_lock() in Linux Kernel (english)
Dead Lock Analysis of spin_lock() in Linux Kernel (english)Dead Lock Analysis of spin_lock() in Linux Kernel (english)
Dead Lock Analysis of spin_lock() in Linux Kernel (english)
Sneeker Yeh
 
LUP IRT 2021_2022 - Cours - Programmation Python (Partie I).pdf
LUP IRT 2021_2022 - Cours - Programmation Python (Partie I).pdfLUP IRT 2021_2022 - Cours - Programmation Python (Partie I).pdf
LUP IRT 2021_2022 - Cours - Programmation Python (Partie I).pdf
RedaBelattar
 
MySQL Sandbox 3
MySQL Sandbox 3MySQL Sandbox 3
MySQL Sandbox 3
Giuseppe Maxia
 
Estruturas em C++ (struct)
Estruturas em C++ (struct)Estruturas em C++ (struct)
Estruturas em C++ (struct)
Márcio Rizzatto
 
W2 vec001
W2 vec001W2 vec001
W2 vec001
Jaouad Dabounou
 
JAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de donnéesJAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de données
Jean David Olekhnovitch
 
Why zsh is Cooler than Your Shell
Why zsh is Cooler than Your ShellWhy zsh is Cooler than Your Shell
Why zsh is Cooler than Your Shell
brendon_jag
 
Spreadsheets: Functional Programming for the Masses
Spreadsheets: Functional Programming for the MassesSpreadsheets: Functional Programming for the Masses
Spreadsheets: Functional Programming for the Masses
kfrdbs
 
SSAS 2012 : Multidimensionnel et tabulaire au banc d'essai
SSAS 2012 : Multidimensionnel et tabulaire au banc d'essaiSSAS 2012 : Multidimensionnel et tabulaire au banc d'essai
SSAS 2012 : Multidimensionnel et tabulaire au banc d'essai
Microsoft Technet France
 
Systèmes de recommandation: applications en bibliothèque, archives et documen...
Systèmes de recommandation: applications en bibliothèque, archives et documen...Systèmes de recommandation: applications en bibliothèque, archives et documen...
Systèmes de recommandation: applications en bibliothèque, archives et documen...Ecole hôtelière de Lausanne - EHL
 
La bureautique finale.pptx
La  bureautique finale.pptxLa  bureautique finale.pptx
La bureautique finale.pptx
ssuser9372cc
 
Linguagem Dart (Google)
Linguagem Dart (Google)Linguagem Dart (Google)
Linguagem Dart (Google)
Prof. Luciano Borges
 
Épistemologie de l'informatique
Épistemologie de l'informatiqueÉpistemologie de l'informatique
Épistemologie de l'informatique
RichardTerrat1
 
Quick Steps to Install NS2 on Ubuntu 16.04
Quick Steps to Install NS2 on Ubuntu 16.04Quick Steps to Install NS2 on Ubuntu 16.04
Quick Steps to Install NS2 on Ubuntu 16.04
DIGITAL PADM
 

Mais procurados (20)

Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento Android
 
Gestion des dossiers et fichiers
Gestion des dossiers et fichiersGestion des dossiers et fichiers
Gestion des dossiers et fichiers
 
Linguagem C 10 Arquivos
Linguagem C 10 ArquivosLinguagem C 10 Arquivos
Linguagem C 10 Arquivos
 
Aula 9 - Estruturas Condicionais
Aula 9 - Estruturas CondicionaisAula 9 - Estruturas Condicionais
Aula 9 - Estruturas Condicionais
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Dead Lock Analysis of spin_lock() in Linux Kernel (english)
Dead Lock Analysis of spin_lock() in Linux Kernel (english)Dead Lock Analysis of spin_lock() in Linux Kernel (english)
Dead Lock Analysis of spin_lock() in Linux Kernel (english)
 
LUP IRT 2021_2022 - Cours - Programmation Python (Partie I).pdf
LUP IRT 2021_2022 - Cours - Programmation Python (Partie I).pdfLUP IRT 2021_2022 - Cours - Programmation Python (Partie I).pdf
LUP IRT 2021_2022 - Cours - Programmation Python (Partie I).pdf
 
MySQL Sandbox 3
MySQL Sandbox 3MySQL Sandbox 3
MySQL Sandbox 3
 
Estruturas em C++ (struct)
Estruturas em C++ (struct)Estruturas em C++ (struct)
Estruturas em C++ (struct)
 
W2 vec001
W2 vec001W2 vec001
W2 vec001
 
JAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de donnéesJAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de données
 
Why zsh is Cooler than Your Shell
Why zsh is Cooler than Your ShellWhy zsh is Cooler than Your Shell
Why zsh is Cooler than Your Shell
 
Spreadsheets: Functional Programming for the Masses
Spreadsheets: Functional Programming for the MassesSpreadsheets: Functional Programming for the Masses
Spreadsheets: Functional Programming for the Masses
 
SSAS 2012 : Multidimensionnel et tabulaire au banc d'essai
SSAS 2012 : Multidimensionnel et tabulaire au banc d'essaiSSAS 2012 : Multidimensionnel et tabulaire au banc d'essai
SSAS 2012 : Multidimensionnel et tabulaire au banc d'essai
 
Systèmes de recommandation: applications en bibliothèque, archives et documen...
Systèmes de recommandation: applications en bibliothèque, archives et documen...Systèmes de recommandation: applications en bibliothèque, archives et documen...
Systèmes de recommandation: applications en bibliothèque, archives et documen...
 
La bureautique finale.pptx
La  bureautique finale.pptxLa  bureautique finale.pptx
La bureautique finale.pptx
 
Linguagem Dart (Google)
Linguagem Dart (Google)Linguagem Dart (Google)
Linguagem Dart (Google)
 
Épistemologie de l'informatique
Épistemologie de l'informatiqueÉpistemologie de l'informatique
Épistemologie de l'informatique
 
Cours Android
Cours AndroidCours Android
Cours Android
 
Quick Steps to Install NS2 on Ubuntu 16.04
Quick Steps to Install NS2 on Ubuntu 16.04Quick Steps to Install NS2 on Ubuntu 16.04
Quick Steps to Install NS2 on Ubuntu 16.04
 

Destaque

DevOps e PHP
DevOps e PHPDevOps e PHP
DevOps e PHP
Elton Minetto
 
DevOps für PHP (und andere)
DevOps für PHP (und andere)DevOps für PHP (und andere)
DevOps für PHP (und andere)
Mayflower GmbH
 
DevOps for PHP
DevOps for PHPDevOps for PHP
DevOps for PHP
Mayflower GmbH
 
11 tools for your PHP devops stack
11 tools for your PHP devops stack11 tools for your PHP devops stack
11 tools for your PHP devops stack
Kris Buytaert
 
E-commerce e o novo consumidor
E-commerce e o novo consumidorE-commerce e o novo consumidor
E-commerce e o novo consumidor
Elton Minetto
 
Code Squad
Code SquadCode Squad
Code Squad
Elton Minetto
 
Inovação e tecnologia
Inovação  e tecnologiaInovação  e tecnologia
Inovação e tecnologia
Elton Minetto
 
De Padawan a Jedi - Versão 2016
De Padawan a Jedi - Versão 2016De Padawan a Jedi - Versão 2016
De Padawan a Jedi - Versão 2016
Elton Minetto
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
Elton Minetto
 
Desenvolvendo APIs em Go usando Middlewares
Desenvolvendo APIs em Go usando MiddlewaresDesenvolvendo APIs em Go usando Middlewares
Desenvolvendo APIs em Go usando Middlewares
Elton Minetto
 
Metodologias ágeis interativas
Metodologias ágeis interativasMetodologias ágeis interativas
Metodologias ágeis interativas
Elton Minetto
 
PSR-7, middlewares e o futuro dos frameworks
PSR-7, middlewares e o futuro dos frameworksPSR-7, middlewares e o futuro dos frameworks
PSR-7, middlewares e o futuro dos frameworks
Elton Minetto
 
Devops is not about Tooling
Devops is not about ToolingDevops is not about Tooling
Devops is not about Tooling
Kris Buytaert
 
Otimização MySQL
Otimização MySQLOtimização MySQL
Otimização MySQL
Elton Minetto
 

Destaque (14)

DevOps e PHP
DevOps e PHPDevOps e PHP
DevOps e PHP
 
DevOps für PHP (und andere)
DevOps für PHP (und andere)DevOps für PHP (und andere)
DevOps für PHP (und andere)
 
DevOps for PHP
DevOps for PHPDevOps for PHP
DevOps for PHP
 
11 tools for your PHP devops stack
11 tools for your PHP devops stack11 tools for your PHP devops stack
11 tools for your PHP devops stack
 
E-commerce e o novo consumidor
E-commerce e o novo consumidorE-commerce e o novo consumidor
E-commerce e o novo consumidor
 
Code Squad
Code SquadCode Squad
Code Squad
 
Inovação e tecnologia
Inovação  e tecnologiaInovação  e tecnologia
Inovação e tecnologia
 
De Padawan a Jedi - Versão 2016
De Padawan a Jedi - Versão 2016De Padawan a Jedi - Versão 2016
De Padawan a Jedi - Versão 2016
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Desenvolvendo APIs em Go usando Middlewares
Desenvolvendo APIs em Go usando MiddlewaresDesenvolvendo APIs em Go usando Middlewares
Desenvolvendo APIs em Go usando Middlewares
 
Metodologias ágeis interativas
Metodologias ágeis interativasMetodologias ágeis interativas
Metodologias ágeis interativas
 
PSR-7, middlewares e o futuro dos frameworks
PSR-7, middlewares e o futuro dos frameworksPSR-7, middlewares e o futuro dos frameworks
PSR-7, middlewares e o futuro dos frameworks
 
Devops is not about Tooling
Devops is not about ToolingDevops is not about Tooling
Devops is not about Tooling
 
Otimização MySQL
Otimização MySQLOtimização MySQL
Otimização MySQL
 

Semelhante a Ao infinito e além com PHP memcached e Gearman

PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e Memcache
Andre Golvea
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
Elton Minetto
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
Elton Minetto
 
Despertando para o PHP
Despertando para o PHPDespertando para o PHP
Despertando para o PHP
Rafael Dohms
 
Node JS - Parte 2
Node JS - Parte 2Node JS - Parte 2
Node JS - Parte 2
Bruno Catão
 
Instalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutosInstalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutos
Alexandre Almeida
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
Felipe Ribeiro
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Arlindo Santos
 
Oficina de infraestrutura como código (apresentando o Puppet)
Oficina de infraestrutura como código (apresentando o Puppet)Oficina de infraestrutura como código (apresentando o Puppet)
Oficina de infraestrutura como código (apresentando o Puppet)
Jose Augusto Carvalho
 
PHP 5.3 - What's new?
PHP 5.3 - What's new?PHP 5.3 - What's new?
PHP 5.3 - What's new?
Felipe Ribeiro
 
Administracao de sistemas_com_puppet
Administracao de sistemas_com_puppetAdministracao de sistemas_com_puppet
Administracao de sistemas_com_puppet
Ramon Mota
 
Aula05-ProgramacaoparaWeb123456878915151
Aula05-ProgramacaoparaWeb123456878915151Aula05-ProgramacaoparaWeb123456878915151
Aula05-ProgramacaoparaWeb123456878915151
alderleysousa444
 
Puppet webcast 4linux
Puppet webcast 4linuxPuppet webcast 4linux
Puppet webcast 4linux
Jose Augusto Carvalho
 
Ferramentas para infraestrutura ágil
Ferramentas para infraestrutura ágilFerramentas para infraestrutura ágil
Ferramentas para infraestrutura ágil
Jose Augusto Carvalho
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
Caio Cutrim
 
Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???
Fabiano Weimar
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 
Aula PIT 3 - Ambientes
Aula PIT 3 - AmbientesAula PIT 3 - Ambientes
Aula PIT 3 - Ambientes
Dirceu Belém
 
Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
Jose Augusto Carvalho
 
App Web Escalaveis Fisl
App Web Escalaveis FislApp Web Escalaveis Fisl
App Web Escalaveis Fisl
Elton Minetto
 

Semelhante a Ao infinito e além com PHP memcached e Gearman (20)

PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e Memcache
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
Despertando para o PHP
Despertando para o PHPDespertando para o PHP
Despertando para o PHP
 
Node JS - Parte 2
Node JS - Parte 2Node JS - Parte 2
Node JS - Parte 2
 
Instalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutosInstalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutos
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Oficina de infraestrutura como código (apresentando o Puppet)
Oficina de infraestrutura como código (apresentando o Puppet)Oficina de infraestrutura como código (apresentando o Puppet)
Oficina de infraestrutura como código (apresentando o Puppet)
 
PHP 5.3 - What's new?
PHP 5.3 - What's new?PHP 5.3 - What's new?
PHP 5.3 - What's new?
 
Administracao de sistemas_com_puppet
Administracao de sistemas_com_puppetAdministracao de sistemas_com_puppet
Administracao de sistemas_com_puppet
 
Aula05-ProgramacaoparaWeb123456878915151
Aula05-ProgramacaoparaWeb123456878915151Aula05-ProgramacaoparaWeb123456878915151
Aula05-ProgramacaoparaWeb123456878915151
 
Puppet webcast 4linux
Puppet webcast 4linuxPuppet webcast 4linux
Puppet webcast 4linux
 
Ferramentas para infraestrutura ágil
Ferramentas para infraestrutura ágilFerramentas para infraestrutura ágil
Ferramentas para infraestrutura ágil
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
 
Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Aula PIT 3 - Ambientes
Aula PIT 3 - AmbientesAula PIT 3 - Ambientes
Aula PIT 3 - Ambientes
 
Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
 
App Web Escalaveis Fisl
App Web Escalaveis FislApp Web Escalaveis Fisl
App Web Escalaveis Fisl
 

Mais de Elton Minetto

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
Elton Minetto
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em Go
Elton Minetto
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)
Elton Minetto
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github Projects
Elton Minetto
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
Elton Minetto
 
Serverless em Go
Serverless em GoServerless em Go
Serverless em Go
Elton Minetto
 
JAMstack
JAMstackJAMstack
JAMstack
Elton Minetto
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2
Elton Minetto
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver software
Elton Minetto
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHP
Elton Minetto
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in Golang
Elton Minetto
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedor
Elton Minetto
 
Product and Technology
Product and TechnologyProduct and Technology
Product and Technology
Elton Minetto
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech Stack
Elton Minetto
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIs
Elton Minetto
 
12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP world
Elton Minetto
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using Go
Elton Minetto
 
Start you
Start youStart you
Start you
Elton Minetto
 
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
Elton Minetto
 
Introdução a Go
Introdução a GoIntrodução a Go
Introdução a Go
Elton Minetto
 

Mais de 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
 

Ao infinito e além com PHP memcached e Gearman

  • 1. Ao infinito e além com PHP, Memcached e Gearman Elton Luís Minetto segunda-feira, 29 de novembro de 2010
  • 2. Quem sou eu? • Graduado e pós-graduado em Ciência da Computação. • Trabalha com PHP/MySQL/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 • Professor na Unochapecó(Chapecó/SC) • Sócio da Coderockr segunda-feira, 29 de novembro de 2010
  • 3. O problema segunda-feira, 29 de novembro de 2010
  • 4. O problema segunda-feira, 29 de novembro de 2010
  • 5. O problema segunda-feira, 29 de novembro de 2010
  • 6. O problema segunda-feira, 29 de novembro de 2010
  • 7. O problema • Performance: a habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível • Capacidade: a carga total que uma aplicação pode suportar • Escalabilidade: a habilidade de uma aplicação manter a performance quando a carga de trabalho aumenta. É a junção da capacidade e da performance • “Performance is a problem. Scaling your performance is a bigger problem” segunda-feira, 29 de novembro de 2010
  • 12. GLAMMP • Gearman • Linux • Apache • MySQL • Memcached • Php (ou Perl ou Python) segunda-feira, 29 de novembro de 2010
  • 13. segunda-feira, 29 de novembro de 2010
  • 14. • Sistema distribuído e de alta performance para fazer cache de objetos em memória RAM. • Genérico por natureza mas muito usado para acelerar aplicações web dinâmicas, reduzindo a carga de bases de dados, sessões de usuários, arquivos CSS. • Criado pela O que é? segunda-feira, 29 de novembro de 2010
  • 15. Por que usar? • Escalável: fácil adicionar máquinas e instâncias • RAM é muito mais rápido que I/O em disco • Alivia a carga do banco de dados • Muito flexível: pode armazenar qualquer dado, desde que não ultrapasse 1 MB • Bibliotecas client disponíveis em diversas linguagens (PHP, C, Java, Ruby, Python) • Open Source segunda-feira, 29 de novembro de 2010
  • 16. Como funciona? • Armazena qualquer coisa que pode ser serializado • Armazena com uma chave única (255 caracteres) e tempo de validade • O programador usa da seguinte forma : • Encontrou no cache? Retorna os dados • Não encontrou no cache? Processa, armazena no cache e retorna o dado segunda-feira, 29 de novembro de 2010
  • 17. Como funciona? segunda-feira, 29 de novembro de 2010
  • 18. O que armazenar? • Resultados de consultas SQL • Páginas inteiras • Sessões de usuários • Fragmentos de HTML gerados • Imagens (thumbnails) • Arquivos css • Arquivos js • “Qualquer coisa que demore um pouco para ser gerada” segunda-feira, 29 de novembro de 2010
  • 19. Quem usa? • Facebook • 805 servidores 8-core. 28TB de RAM. 300K req/seg (Set. 2008) • Desenvolveu fork com suporte a UDP • http://github.com/fbmarc/facebook-memcached/tree/ master • Flickr • 38K req/seg. 12 milhões de objetos (Set. 2008) • Digg • Drimio • Sessões de usuários, imagens, arquivos CSS, arquivos JS, resultados de consultas SQL segunda-feira, 29 de novembro de 2010
  • 20. Como usar? Baixar código em http://www.danga.com/memcached/ e... tar -xvzf memcached-X.Y.Z.tar.gz cd memcached-X.Y.Z ./configure make sudo make install Santíssima Trindade segunda-feira, 29 de novembro de 2010
  • 21. Como usar? • No exemplo abaixo iniciamos o daemon com 128MB RAM, ouvindo na porta 11211 no ip 127.0.0.1 /usr/local/bin/memcached -d -m 128 -l 127.0.0.1 -p 11211 • Pode-se criar quantas instâncias forem necessárias, mudando a porta. Assim aumenta-se o espaço total do cache segunda-feira, 29 de novembro de 2010
  • 22. Como usar com PHP? • Download do módulo em http://pecl.php.net/package/ memcache. • e.. tar -xvzf memcache-2.2.5.tgz cd memcache-2.2.5 phpize ./configure make sudo make install (executar como root) • Adicionar a linha abaixo no php.ini e reiniciar o Apache extension=memcache.so segunda-feira, 29 de novembro de 2010
  • 23. Como usar com PHP? <?php $memcache = new Memcache; $memcache->connect('localhost', 11211); $memcache->connect('localhost', 11212); $memcache->connect(’192.168.0.10', 11212); $conteudo = $memcache->get('estados'); if($conteudo === false) { $uf = array('SC','RS','SP'); $memcache->set('estados', $uf, false, 100) ; $conteudo = $uf; } var_dump($conteudo); ?> segunda-feira, 29 de novembro de 2010
  • 24. API • Comandos de armazenamento: • set, add, replace, append • Comandos de recuperação: • get • Comandos de exclusão: • delete • Outros comandos: • stats, flush_all, version, verbosity, quit segunda-feira, 29 de novembro de 2010
  • 25. Monitorando • Plugin para o Nagios • memcache.php segunda-feira, 29 de novembro de 2010
  • 26. segunda-feira, 29 de novembro de 2010
  • 27. segunda-feira, 29 de novembro de 2010
  • 28. segunda-feira, 29 de novembro de 2010
  • 29. • 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 • O nome é um anagrama para "Manager" • Criado pela O que é? segunda-feira, 29 de novembro de 2010
  • 30. Áreas de Aplicação • Análise de logs • Redimensionamento de imagens • Processamento de URLs • Atualização de cache • Jobs de banco de dados • etc segunda-feira, 29 de novembro de 2010
  • 31. Por que usar? • Open Source com 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 • Escalável e tolerante a falhas • Digg: +45 servers, 400mil jobs/dia (em 2009) • Yahoo: +60 servers, 6milhões jobs/dia • Síncrono ou assíncrono segunda-feira, 29 de novembro de 2010
  • 32. Como funciona? • 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 segunda-feira, 29 de novembro de 2010
  • 35. 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 segunda-feira, 29 de novembro de 2010
  • 36. Instalando wget http://launchpad.net/gearmand/trunk/0.13/+download/ gearmand-X.Y.tar.gz tar xfvz gearmand-X.Y.tar.gz cd gearmand-X.Y ./configure make sudo make install Lembra? Santíssima Trindade segunda-feira, 29 de novembro de 2010
  • 37. 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) segunda-feira, 29 de novembro de 2010
  • 38. PHP • Instalando a extensão do PHP: wget http://pecl.php.net/get/gearman-X.Y.Z.tgz tar xfvz gearman-X.Y.Z.tgz cd gearman-X.Y.Z phpize ./configure make sudo make install • Adicionar no php.ini: extension = gearman.so Acabou a criativade :( Mas você entendeu né? segunda-feira, 29 de novembro de 2010
  • 39. PHP - Exemplo: Cliente Síncrono <?php $client= new GearmanClient(); /*indica em quais servidores o cliente pode enviar jobs. No caso somente o localhost, pois não é passado nada*/ $client->addServer(); /*adiciona um job síncrono, para a fila chamada title, enviando uma string como parâmetro*/ print $client->do("title", "o Ivo andava de PATINS!!!"); print "n"; ?> segunda-feira, 29 de novembro de 2010
  • 40. PHP - Exemplo: Worker Síncrono <?php $worker= new GearmanWorker(); $worker->addServer();//servidores q vai atender /*registra a função title_function como responsável por atender a fila title*/ $worker->addFunction("title", "title_function"); while ($worker->work()); //fica em loop trabalhando     //função que vai executar o trabalho function title_function($job) {         return ucwords(strtolower($job->workload())); } ?> segunda-feira, 29 de novembro de 2010
  • 41. PHP - Exemplo: Cliente Assíncrono <?php $client= new GearmanClient(); $client->addServer(); for($i=0;$i<10;$i++) {         /*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 */         $log['data'] = date('l jS of F Y h:i:s A');         $log['msg'] = "O Ivo andou de patins $i vez(es)";         $client->doBackground("log_queue", serialize ($log)); } ?> segunda-feira, 29 de novembro de 2010
  • 42. PHP - Exemplo: Worker Assíncrono <?php $worker= new GearmanWorker(); $worker->addServer(); /*registra a função log_function como responsável por atender a fila log_queue*/ $worker->addFunction("log_queue", "log_function"); while ($worker->work()); //fica em loop trabalhando     function log_function($job){         $log = unserialize($job->workload());         sleep(1); //sleep só para demonstrar executando         echo $log['data'], ' - ', $log['msg'], "n"; } ?> segunda-feira, 29 de novembro de 2010
  • 43. segunda-feira, 29 de novembro de 2010
  • 44. 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() segunda-feira, 29 de novembro de 2010
  • 45. PHP - Job API • GearmanJob::sendStatus(int $numerator, int $denominator) • GearmanJob::sendWarning(string $warning) • GearmanJob::sendComplete(string $result) • GearmanJob::sendFail(void) • GearmanJob::sendException(string $exception) segunda-feira, 29 de novembro de 2010
  • 46. PHP - Job API - Client <?php 1. $client= new GearmanClient(); 2. $client->addServer(); 3. $handle = $client->doBackground("title", "o PHp"); 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.?> segunda-feira, 29 de novembro de 2010
  • 47. 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.?> segunda-feira, 29 de novembro de 2010
  • 48. PHP - Client API - Prioridades • Síncrono echo $client->do("title", "uma frasE quAlquer"); echo $client->doHigh("title", "uma frasE quAlquer"); echo $client->doLow("title", "uma frasE quAlquer");  • Assíncrono $handle1 = $client->doBackground("title", "uma frasE quAlquer"); $handle1 = $client->doHighBackground("title", "uma frasE quAlquer"); $handle1 = $client->doLowBackground("title", "uma frasE quAlquer"); segunda-feira, 29 de novembro de 2010
  • 49. 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 (somente jobs assíncronos) • É possível armazenar a fila em: • MySQL (libdrizzle) • Memcached (libmemcached) • SQLite3 (libsqlite3) segunda-feira, 29 de novembro de 2010
  • 50. Monitorando 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 segunda-feira, 29 de novembro de 2010
  • 51. Gearman no 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 • Média de 55 mil jobs/dia segunda-feira, 29 de novembro de 2010
  • 52. Tudo junto reunido! 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 segunda-feira, 29 de novembro de 2010
  • 54. Contato <?php $card = array( ‘nome’ => ‘Elton Luís Minetto’, ‘site’ => ‘http://www.eltonminetto.net’, ‘e-mail’ => ‘eminetto@coderockr.com’, ‘twitter’ => ‘@eminetto’, ‘all’ => ‘http://about.me/eminetto' ); var_dump($card); ?> segunda-feira, 29 de novembro de 2010
  • 55. Referências • http://www.danga.com • http://www.slideshare.net/andreizm/all-the-little- pieces-1573862 • http://www.slideshare.net/acme/scaling-with- memcached • http://www.slideshare.net/oemebamo/introduction-to- memcached • http://www.slideshare.net/felixdv/high-gear-php-with- gearman-3404242 • http://www.eltonminetto.net/material-da-palestra-no- phpsc-conf-2009.htm • http://www.eltonminetto.net/material-de-minha- palestra-sobre-gearman.htm segunda-feira, 29 de novembro de 2010