2. Ce criterii descriu serverul de job-uri Gearman
Open Source Wow, asta e un news bun!
Multi-language C, PHP, Perl, MySql UDF, Python, Java, Ruby, Go
Flexible Nu esti legat de nici un design pattern specific
Fast Are un protocol simplu si este realizat in C
Embeddable Introducerea intr-o aplicatie este triviala
No single point of failure Actioneaza intr-un mod tolerant la erori
3. Ce trebuie de luat in considerare inainte sa
incepem
1. Gearman transmite datele de la client la worker in forma de
string.
SOLUTIE: folositi serializarea datelor
BEST PRACTICE: MsgPack- serializare binary foarte rapida(la
fel realizata pentru multiple limbaje)
2. Gearman necesita workeri porniti, insa ei pot “muri” din mai
multe cauze.
SOLUTIE: supravegheati workerii cu alti daemoni
BEST PRACTICE: folositi Supervisor pentru supraveghere
4. Kick Ass Start...
# puteti descarca sursa http://gearman.org/index.php?id=download
sudo apt-get install gearman libgearman-dev
# compilati si instalati biblioteca p-tru PHP
pecl download gearman-0.8.0
tar -xvf gearman-0.8.0.tgz
cd gearman-0.8.0
phpize
./configure
make
make install
# porniti serverul (inserati -vvv pentru debugging)
sudo gearmand -d -u root
5. Ce trebuie sa stim despre modul de lucru
1. Lucrul consta din 2 parti(+ Gearman ca mediator): Client si Worker
2. Internal, Gearman se poate compara cu Priority Queue(Coada, FIFO)
3. Se imparte in 3 tiputi dupa prioritate:
I- Low
II- Normal
III- High
4. Se imparte in 2 tipuri dupa modul de rulare:
I- Normal
II- Background(nu interactioneaza cu clientul)
5. Se imparte in 2 tipuri dupa modul de executie:
I- Sync (sincronizate)
II- Async (paralele)
6. Din ce este constituita partea PHP
GearmanClient- este cel ce adauga taskuri in gearman p-tru workeri
GearmanTask- obiectul taskului care contine metodele necesare p-tru lucru
GearmanWorker- workerul(daemon) care primeste job-uri de la clienti
GearmanJob- este obiectul job-ului transmis de la client si este emis ca
argument in callback-ul inregistrat de worker p-tru o functie
+ GearmanException ca exceptie folosita de aceasta biblioteca
7. Exemple de taskuri p-tru Gearman
Task sincronizat:
$rev = $client->do(
"reverse",
msgpck_pack(['v1', 'v2' /* ... much more */])
);
Task Paralel:
for($i = 0; $i < 10; $i++) {
$client->addTask("reverse", "Hello World!");
}
P.S
Setarea clientului din php:
$client = new GearmanClient();
$client->addServer(); // localhost by default
8. Exemplu de worker p-tru Gearman
// setam workerul
$worker = new GearmanWorker();
$worker->addServer(); // localhost by default
// adaugam o functie
$worker->addFunction("reverse", "reverse_fn");
// ciclu in care workerul asteapta joburi si controleaza starea conexiunii
// cu serverul Gearman
while ($worker->work()) {
if ($worker->returnCode() != GEARMAN_SUCCESS) beak;
}
// definim functia
function reverse_fn($job)
{
$result= strrev($job->workload(););
return $result;
}