Themes

Celery, rozproszona kolejka zadań

Celery, rozproszona kolejka zadań

GDR!
Massive Scale

powolne i słabo napisane w szybkie i dobrze napisane. Albo przynajmniej troche szybsze i troche lepiej.

Czym jest Celery?

Celery jest asynchroniczną kolejką zadań opierającą się o rozproszone przesyłanie wiadomości. Skupia się na działaniu w czasie rzeczywistym, ale wspiera również planowanie operacji.

Jednostki wykonawcze, nazywane zadaniami, są równolegle wykonywane na jednym lub więcej serwerze roboczym z użyciem pakietów multiprocessing, Eventlet bądź gevent. Zadania mogą być wykonywane asynchronicznie bądź synchronicznie.

http://celeryproject.org/

E&Y, budynek w Warszawie

Czym zajmuje się E&Y?

Ernst & Young to światowy lider w zakresie audytu, doradztwa podatkowego, doradztwa biznesowego oraz doradztwa transakcyjnego. Chcemy wywierać pozytywny wpływ na funkcjonowanie przedsiębiorstw i rynków, a także całego społeczeństwa.

Ernst & Young, "O nas"

Nastepny slajd!

Czym jest Celery?

Celery jest asynchroniczną kolejką zadań opierającą się o rozproszone przesyłanie wiadomości. Skupia się na działaniu w czasie rzeczywistym, ale wspiera również planowanie operacji.

Jednostki wykonawcze, nazywane zadaniami, są równolegle wykonywane na jednym lub więcej serwerze roboczym z użyciem pakietów multiprocessing, Eventlet bądź gevent. Zadania mogą być wykonywane asynchronicznie bądź synchronicznie.

http://celeryproject.org/

Na sali na pewno ktos wie

Tworzenie archiwów

Raportowanie

mysql> select count(pad) from large;
+------------+
| count(pad) |
+------------+
|   31457280 |
+------------+
1 row in set (4 min 58.63 sec)

Konwersja plików video

Konwersja video

<?php
// "/tmp/sbr334rf" 
$video = $_FILES['vid']['tmp_name']; 					 

// "pr0n.avi.flv" 
$new_name = 'videos/' . $_FILES['vid']['name'] . '.flv'; 

system("ffmpeg -i $video -f flv -b 200000 $new_name");

echo '<a href="player.php?video=';
echo urlescape($new_name));
echo '">Twoj film</a>';

[konsola]

time ffmpeg -i ~/Videos/out-1.ogv -f flv -b 200000 /tmp/out.flv

Wnioski?

Full HD

[demo]

link

Możliwe problemy

Sposoby rozwiazania kazdego z problemow; czas wykonania moze byc zmienny

Pseudo-rozwiązania

Więcej pseudo-rozwiązań

StackOverflow.com, #858883

Więcej pseudo-rozwiązań

StackOverflow.com, #858883

Rozwiązanie takie sobie: cron

  1. Zlecenie zadania: INSERT INTO `tasks`
  2. Wykonanie zadanie: UPDATE `tasks` SET `completed`=1
  3. Sprawdzenie zadania: SELECT `completed` FROM `tasks`

Cron (1)

Cron (2)

Cron (3)

Cron (4)

Cron (5)

Cron - problemy

Cron + MySQL = Ghetto Queue

http://jemblankz-monstervikings.blogspot.com/

Połączymy slangi: amerykański (ghetto) i niektórych użytkowników Mac OS (bieda-*)

AMQP

Advanced
Message
Queuing
Protocol

AMQP - Message

{
	'task': 'encode',
	'infile': '1.avi',
	'outfile': '1.flv'
}
<?xml version="1.0" encoding="UTF-8" ?>
<task name="encode">
	<infile>1.avi</infile>
	<outfile>1.flv</outfile>
</task>

AMQP - Queue

{
  'task': 'encode',
  'infile': '1.avi',
  'outfile': '1.flv'
}
{
  'task': 'encode',
  'infile': '2.avi',
  'outfile': '2.flv'
}
{
  'task': 'encode',
  'infile': '3.avi',
  'outfile': '3.flv'
}
{
  'task': 'encode',
  'infile': '4.avi',
  'outfile': '4.flv'
}


...



konsument
(konwerter)

producent
(strona WWW)

AMQP

http://www.h-online.com/

AMQP jest otwarte

Brokery (serwery)

JMS - Java Messaging Service

Jak wykorzystać AMQP?

Zadania

{
  'task': 'encode',
  'infile': '1.avi',
  'outfile': '1.flv'
}
{
  'task': 'encode',
  'infile': '2.avi',
  'outfile': '2.flv'
}
{
  'task': 'encode',
  'infile': '3.avi',
  'outfile': '3.flv'
}
{
  'task': 'encode',
  'infile': '4.avi',
  'outfile': '4.flv'
}


...



konwerter

strona WWW

Wyniki

{
  status: 'OK',
  file: '1.flv',
  id: 12345
}
{
  status: 'Error',
  id: 12346,
  Error: {
    ExcType: ...
  }
}

strona WWW

konwerter

AMQP - problemy do rozwiązania

AMQP jest bardzo ogólne, jak baza

Celery

Celery - kod

@task
def convert_video(infile, outfile):
	return os.system("ffmpeg -i %s -f flv -b 200000 %s", 
		infile, 
		outfile)

Shell escaping, subprocess

Bardziej poprawny kod

from subprocess import Popen, PIPE, STDOUT

@task
def convert_video(infile, outfile):
	ffmpeg = Popen(("ffmpeg", "-i", infile, "-f", "flv", 
		"-b", "200000", outfile),
		stdout=PIPE,
		stderr=STDOUT)
	ffmpeg.communicate()
	if ffmpeg.returncode == 0:
		return outfile
	else:
		raise StandardError(ffmpeg.stdout)

pyffmpeg?

Wywoływanie funkcji Celery

>>> import tasks
>>> task = tasks.convert_video.delay("1.avi", "1.flv")
>>> task.ready()
False
>>> # minutę później
>>> task.ready()
True
>>> task.successful()
True
>>> task.result
'1.flv'

Celery + PHP

$c = new Celery('localhost', 'myuser', 'mypass', 'myvhost');
$result = $c->PostTask('tasks.convert_video', array("1.avi", "1.flv"));

$result->ready(); // FALSE
sleep(60);
$result->ready(); // TRUE
$result->successful();

celery-php @ github

Zalety użycia Celery

Zalety użycia Celery

opowiedziec o: rozproszonym (laptop babci), integracji - nie ma slajdu

Sposoby serializacji

Kolejki zadań

Zaawansowane Celery

taskset: pasek postępu

Zarządzanie serwerami Celery

Python API: eventy, snapshots

Django-Celery

celeryev

Alternatywy

Pytania?

/

#