Gearman - 2o PHP Day

Processamento em fila, assíncrono e/ou paralelo com Gearman e PHP »
Diego Sana

Processamento em fila, assíncrono e/ou paralelo com Gearman e PHP
II PHP DAY
Diego Sana?
[http://sanainside.com] [@sanainside]
Desenvolvedor e empreendedor web há 10 anos
Graduado em CC pela UFES
1999/00: freemp3.com.br
2001/03: centraldamusica.com.br
2004/07: Flogao.com.br
2009/10: Filtrie.com


Conteúdo
O que é?
O que faz
Como faz
Quando usar
Como instalar
Como usar com PHP
Gearman?
Framework de aplicação genérico
para
distribuir trabalho
Gearman
Manager
Distribui as tarefas, mas não faz
nada de útil
Framework?
Provê e gerencia comunicação entre clientes e workers
Genérico?
É multi-linguagem (Php, C, Python, Java, Perl, Ruby, .NET)
Trabalho?
Rápido, Tolerante a falhas, flexível
Algo mais?
Open Source
Protocolo simples e parecido com o do memcached
Versão atual (0.12) ainda em beta, porém bastante estável e já em uso em grandes sites (Yahoo, Digg, Xing.com)
Lembra das aulas de padrões de projeto de sistemas distribuídos?
Gearman Stack
Em bom português...
Cliente (sua app): solicita ao servidor que processe dados XYZ utilizando a função W
Servidor: Escolhe um worker livre que provê a função W e envia XYZ para ele
Worker: processa os dados  e diz ao servidor quando terminou (pode retornar ou não o resultado do processamento)
Cliente
Pode requisitar ao servidor que job seja executado de forma síncrona ou assíncrona (background)
Pode enviar uma tarefa, que por sua vez é composta de jobs individuais a serem executados em paralelo
Determina prioridade do job: baixa, normal ou alta
Worker
Ao ser iniciado, se conecta ao Gearman Server e registra quais funções sabe executar
Dorme enquanto não há trabalho a fazer
Pode enviar sinais ao servidor indicando status, exceções, falhas ou término de trabalho.


Servidor
Mantém os jobs em memória (opcional: persistência via memcache, sqlite, drizzle ou mysql)
RoundRobin entre filas de diferentes funções
FIFO em filas de mesma função/mesma prioridade
Reenvia job para outro worker se não receber resposta
Aplicações
Popular cache / warm-up
Limitar acesso concorrente a recursos
Processamento de imagens
Crawling / Parsing
Análise e agregação de logs
Gerenciamento de filas
Use sua imaginação, jovem Padawan!
Vantagens
Processamento em paralelo acelera execução de tarefas
Permite fazer com que usuário não espere desnecessariamente pelo resultado de processos que não lhe interessam
Use a melhor linguagem para cada tarefa!
Escala facilmente
Instalando Gearman (http://gearman.org)
Baixar job server (gearmand C) em http://gearman.org/index.php?id=download
Dep: e2fsprogs-devel (Centos/RedHat)
./configure && make && make install
Suporte a Mysql, Drizzle ou Memcached se já estiverem instalados


Como executar
gearmand -d -u nobody -q libmemcached --libmemcached-servers=localhost

Outros parâmetros:
-t 2, -t 3, -t 4 (número de threads)
-job-retries 3
-l path/to/logfile.log
-L 4730 (porta padrão)

Instalação do cliente PHP
Extensão Gearman (wrapper para extensão libgearman em C)
http://pecl.php.net/package/gearman
Manual: http://php.net/gearman
pecl install gearman
Adicionar "extension=gearman.so" ao php.ini
Instalando SupervisorD 
(gerencia workers)
http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg
sh setuptools-0.6c11-py2.4.egg
easy_install supervisor
Config file: /etc/supervisor.conf
Executar: /usr/bin/supervisord



Worker no supervisord.conf
[program:gearmanworker]
command = php meuscript.php
autostart = true
numprocs = 50
numprocs_start = 1
startsecs = 5
startretries = 3

Implementando cliente e worker em PHP
worker.php - 1
worker.php - 2
worker.php - 3
worker.php - 4
worker.php - 5
worker.php - 6
client.php - 1
client.php - 2
client.php - 3
client.php - 4
client.php - 5
client.php - 6
Slides e scripts disponíveis em www.sanainside.com

Loading comments...

Please log in to add your comment.

Report abuse

More presentations by Diego Sana