Back-End

18 jul, 2011

Processamento distribuido em PHP utilizando Gearman – Parte 1

Publicidade

Este artigo, em duas partes, vai tratar do Gearman, um framework genérico para distribuir o processamento de diferentes tarefas na
mesma máquina ou em outras máquinas de um cluster.

http://gearman.org/

Ele
permite ao seu aplicativo executar tarefas em paralelo, balancear a carga do
processamento e até mesmo chamar
códigos escritos em outras linguagens.

A palavra “Gearman” é um anagrama de “manager”. Seu propósito é unicamente
realizar trabalhos que precisam ser executados, mas o Gearman por si só não tem
utilidade.

A arquitetura Gearman

Uma arquitetura baseada no Gearman tem três tipos
de elementos:

  • Servidores

Servidores são instâncias do
programa gerenciador. Comportam-se como proxies, encaminhando solicitações de
serviço a workers que estejam disponíveis.

  • Clients

Os clients conversam com os
servidores para solicitar a execução de funções de trabalho.

  • Workers

Workers são processos que encaminham solicitações de
trabalho através da execução de funções codificadas. Cada worker disponibiliza
um conjunto de funções codificadas registrando-as em um servidor.

Essa arquitetura pode ser tolerante a falhas através da execução de mais de uma
tarefa de trabalho do servidor por máquina gerenciando muitos workers.

Outra característica interessante do Gearman é que suas funções worker podem
ser escritas em muitas linguagens de programação diferentes, tais como C, PHP
e outras bastante conhecidas. Dessa forma, você pode escolher a melhor
linguagem de programação para o trabalho.

Você pode por exemplo escrever um programa em C ou em C++ para executar uma tarefa
pesada, e fazer com que ela se auto-registre como daemon worker. Dessa forma, bibliotecas C/C++ podem ser chamadas do
PHP, sem a necessidade de transformá-las em extensões PHP, evitando lidar com
problemas de segurança.


Tarefas
sincronizadas

Há um tipo de tarefa que algumas aplicações web
precisam executar, que demandam muita RAM e CPU, mas por pouco tempo. Esse é
o caso, por exemplo, do processamento de imagens e do download de páginas ou
de arquivos.

Se essas tarefas forem executadas diretamente no servidor web, elas vão ocupar memória do servidor. Caso a memória do servidor web acabe, a máquina pode parar, impedindo-a de atender a requisições web.

Por outro lado, se você delegar a execução de tarefas pesadas a workers
rodando em uma máquina diferente, os recursos da máquina do servidor da Web são
economizados e poderão lidar com mais solicitações simultâneas da Web.

Enquanto os workers estiverem lidando simultaneamente com essas solicitações
de trabalho pesadas, os clientes esperarão até que os trabalhos terminem, sem
“gastar” CPU.

Adicionalmente, um worker pode lidar com muitas solicitações
síncronas, uma depois da outra. Uma execução subsequente de trabalho de um
worker pode reusar recursos computados durante a execução prévia do mesmo
trabalho. Isso pode economizar tempo precioso quando da execução de
solicitações repetidas que precisam dos mesmos recursos.

Essa possibilidade pode ser usada para criar pools de conexão de bancos de
dados. A primeira execução de um processo worker pode abrir uma conexão com o
banco de dados e executar algumas queries.

Uma segunda execução do mesmo trabalho worker não precisa lidar com a
sobrecarga da abertura da conexão do banco de dados, uma vez que ela já foi
aberta no primeiro processamento.

Tarefas assíncronas

O Gearman também é capaz de enviar tarefas para workers assincronamente. Isso significa que o processo do cliente não espera que o
trabalho do work termine.

O Gearman mantém uma fila interna de jobs e delega trabalhos pendentes para workers
assim que sejam liberados.

Isso pode ser útil em tarefas de longa duração, como o envio de notificações de
e-mail, postagem de mensagens no Twitter etc.

Pode também ser útil na implementação de uma abordagem map/reduce, dividindo
grandes tarefas e muitas pequenas sub-tarefas. Um bom exemplo dessa abordagem é
um sistema de log descentralizado.


Distribuindo
trabalho entre servidores múltiplos

Você pode implantar múltiplos servidores de trabalho em
diferentes máquinas, de forma a fazer a arquitetura mais tolerante a falhas.
Isso evita um importante ponto de falha da arquitetura Gearman.

Um aplicativo client pode usar uma lista de servidores de job, e a API do cliente Gearman vai escolher um. Se o servidor de trabalho
estiver indisponível ao ser chamado, o client escolherá outro automaticamente.


Filas de job
persistentes

Por padrão, o
Gearman mantém todas as filas de job armazenadas na memória. Isso significa que se um
servidor de trabalho enguiça ou reinicia sem terminar todas as filas de jobs,
esses trabalhos nunca serão executados.

Por outro lado, o Gearman pode usar filas persistentes para gerenciar
solicitações de trabalho assíncronas para resolver o problema.

Isso é importante porque um trabalho assíncrono não é ligado a nenhum client.
Assim, não seria possível para o client que iniciou o processo detectar uma
falha e solicitar o trabalho novamente.

O módulo de fila persistente do Gearman salva os detalhes da solicitação de
trabalho em um armazenador persistente, usualmente um banco de dados.

O servidor de trabalho espera por workers livres que possam executar os
trabalhos requisitados na fila. Quando
o trabalho é finalizado, ele é removido da fila.

Se um servidor de job falha, quando ele reinicia, a fila persistente é usada para recarregar a fila interna com os jobs pendentes, para serem executados.

Usando o Gearman com sua extensão PHP

Já existe uma extensão para usar o
Gearman diretamente de scripts PHP. Ela está disponível no repositório de extensões PECL PHP.

Ao usar uma instalação PHP comum, você pode usar o comando pecl conforme
abaixo para instalar essa extensão:

pecl install gearman

Se você não tiver o comando pecl disponível em sua
instalação PHP, você pode instalar a extensão Gearman PHP manualmente.
Primeiramente, faça o download da última versão aqui:

http://pecl.php.net/package/gearman

Em seguida, extraia o arquivo usando os comandos abaixo do shell do Linux/Unix.
Pode ser necessário executar o comando
make install pelo usuário raiz.

tar xfvz gearman*
cd gearman*
phpize
./configure --with-gearman
make
make install

Também há alguns clients PHP Gearman puros. Contudo,
recomendo que você use a extensão PECL, não somente por ser mais rápida, já que
é escrita em C, mas também porque é um wrapper direto da biblioteca libgearman,
fornecida pelos desenvolvedores Gearman.

?

Texto original disponível em http://www.phpclasses.org/blog/post/108-Distributing-PHP-processing-with-Gearman.html