Gearman — Um breve resumo

Gearman fornece um framework/aplicação genérica para explorar o trabalho de outras máquinas ou processos de forma mais adequada para um determinado cenário.

Permite que você trabalhe em paralelo, equilibrar processamento e chamar funções entre linguagens distintas.

Ele pode ser utilizado em uma variedades de aplicações, desde sites de alta disponibilidade até o transporte de eventos de replicação de banco de dados.

Em outras palavras, é o sistema nervoso de como o processamento distribuído se comunica.

Alguns pontos fortes sobre Gearman:

  • Open Source

  • Multi-linguagem

  • Flexível

  • Rápido

  • Incorporável

  • Nenhum ponto de falha

  • Sem limites no tamanho dos dados

  • Escalável

Instalação

Esta instalação tem como foco a possibilidade de executar scripts com PHP. Caso não seja necessário o uso do PHP, seguir somente até o segundo passo e retirar referências ao PHP.

1. Instalar e atualizar o Gearman PPA

apt-get install software-properties-common
add-apt-repository ppa:gearman-developers/ppa
apt-get update

2. Instalar Gearman e outros componentes e ferramentas

apt-get install gearman gearman-tools gearman-job-server libgearman-dev php7.0-dev php-pear wget unzip re2c
apt-get upgrade

3. Baixar, compilar o gearman pecl module e adicionar ao php.ini

cd /tmp/
wget https://github.com/wcgallego/pecl-gearman/archive/master.zip
unzip master.zip
cd pecl-gearman-master
phpize
./configure
make
make install
echo "extension=gearman.so" > /etc/php/7.0/mods-available/gearman.ini
phpenmod -v ALL -s ALL gearman

4. Reiniciar o Apache2 ou PHP FPM

service php7.0-fpm restart
service apache2 restart

Execução

Executar o servidor Gearman com o seguindo comando:

gearmand -d

Verificar o status do servidor:

gearadmin --status

Resultado esperado: worker 0 1 2

Na linha de resposta do status, respectivamente, temos o nome da função (worker), o número de tasks na fila (0), o número de jobs rodando (1) e o número de workers capazes (2).

Ferramentas de linha de comando

Gearman

Com o Gearman, você pode executar funções de clients e workers por linha de comando.

$ gearman -H
Common options
-f
Function name to use for jobs (can give many)

-h
Job server host

-H
Print this help menu

-p
Gearman server port

-t
Timeout in milliseconds

-i
Create a pidfile for the process

-n
In client mode run one job per line, in worker mode send data packet for each line

-N
Same as -n, but strip off the newline

Client options
-b
Run jobs in the background

-I
Run jobs as high priority

-L
Run jobs as low priority

-P
Prefix all output lines with functions names

-s
Send job without reading from standard input

-u
Unique key to use for job

Worker options*
-c
Number of jobs for worker to run before exiting

-w
Run in worker mode

Gearmand

Gearmand é utilizado para iniciar e parametrizar o servidor via linha de comando.

$ gearmand -h
General options
-b [ --backlog ] arg (=32)
Number of backlog connections for listen.

--check-args
Check command line and configuration file argments and then exit.

-d [ --daemon ]
Daemon, detach and run in the background.

-f [ --file-descriptors ] arg
Number of file descriptors to allow for the process (total connections will be slightly less). Default is max allowed for user.

-h [ --help ]
Print this help menu.

-j [ --job-retries ] arg (=0)
Number of attempts to run the job before the job server removes it. This is helpful to ensure a bad job does not crash all available workers. Default is no limit.

-l [ --log-file ] arg
Log file to write errors and information to. Turning this option on also forces the first verbose level to be enabled.

-L [ --listen ] arg
Address the server should listen on. Default is INADDR_ANY.

-p [ --port ] arg (=4730)
Port the server should listen on.

-P [ --pid-file ] arg
File to write process ID out to.

-r [ --protocol ] arg
Load protocol module.

-R [ --round-robin ]
Assign work in round-robin order per worker connection. The default is to assign work in the order of functions added by the worker.

-q [ --queue-type ] arg
Persistent queue type to use.

-t [ --threads ] arg (=4)
Number of I/O threads to use. Default=4.

-u [ --user ] arg
Switch to given user after startup.

-v [ --verbose ] arg (=v)
Increase verbosity level by one.

-V [ --version ]
Display the version of gearmand and exit.

-w [ --worker-wakeup ] arg (=0)
Number of workers to wakeup for each job received. The default is to wakeup all available workers.

HTTP:
--http-port arg (=8080)
Port to listen on.

sqlite
--libsqlite3-db arg
Database file to use.

--libsqlite3-table arg (=gearman_queue)
Table to use.

Memcached(libmemcached)
--libmemcached-servers arg
List of Memcached servers to use.

Drizzle/MySQL(libdrizzle)
-host arg
Host of server.

-port arg
Port of server. (by default Drizzle)

-uds arg
Unix domain socket for server.

-user arg
User name for authentication.

-password arg
Password for authentication.

-db arg
Schema/Database to use.

-table arg
Table to use.

-mysql arg
Use MySQL protocol.

Postgres
--libpq-conninfo arg
PostgreSQL connection information string.

--libpq-table arg (=queue)
Table to use.

Gearadmin

Gearadmin é uma ferramenta de linha de comando para manipular os servidores do Gearman.

$ gearadmin --help
--help
Provice help about the program.

--create-function
Create a function from the server.

-h [ --host ] arg (=localhost)i
Connect to the host

-p [ --port ] arg (=4730)
Port number or service to use for connection

--drop-function
Drop a function from the server.

--server-version
Fetch the version number for the server.

--server-verbose
Fetch the verbose setting for the server.

--status
Status for the server.

--workers
Workers for the server.

--shutdown
Shutdown server.

Exemplo

Vamos criar dois scripts PHP, um será para o client e o outro para o worker.

Client:

<?php
$client = new GearmanClient();
$client->addServer();
print $client->do("reverse_string", "Hello World!");

Worker:

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse_string", function ($job) {
  return strrev($job->workload()) . "\n";
});
while ($worker->work());

Execução do Worker:

Foi executado o script worker.php em segundo plano.

Ao verificar o status do servidor, pode-se notar que foi registrado a função reverse_string com um worker registrado como capaz.

Caso seja executado uma segunda vez o mesmo worker, a quantidade de workers capazes irá mudar.

Execução do Client

Ao executar o client.php, já obtivemos o retorno programado no worker. Com isso, validamos que o mesmo está funcionando.

Conclusão

Esta aplicação é ótima para diversas situações onde se encontra a necessidade de controlar processos específicos, aliviando o uso acumulado dos recursos do servidor.

Referências


Obrigado e até mais!

Se você gostou do texto, me acompanhe e terá mais informações em breve.

Quer saber mais sobre o assunto ou tem alguma dúvida? Deixe um comentário. Ah, estou aberto a críticas também.