SlideShare a Scribd company logo
АсинхронныезадачивiFunny:)
СергеевАнтон
@hackPNZ
Прочтовсеэто?
Когдаидлячегомогутпонадобитьсяасинхронныезадачи;
Существующиеготовыерешения;
Чтовыбралимы,нашаархитектура,нашопыт.
iFunny:)
Юмористическийсервис;
Суточнаяаудитория:
4000000пользователей;
Около250000работ
публикуетсяежедневно;
Около1000000000
просмпросмотровконтентакаждыйдень.
Разработка
iFunny:)
iFunny2.4
ВозможностьдобавлятьGIF
Тяжелыйконтент(до10Mb);
Конвертацияввидеопридобавлении
(форматwebm);
Нарезкатумбов,форматыjpeg
иwebp.
Q22013
iFunny3.0
Подписки,возможность
републикацииработ
Подписки,добавлениеработ
влентыпользователей;
РепуРепубликации,добавление
републикацийвленты
пользователей.
Q42013
Asynchronous
taskqueue
Поддержкамножестваязыковдляреализацииворкеров
(втомчисле,PHP);
Оченьбольшойлимитразмерасообщения(4GB);
Большоеколичествомануаловвсети.
www.gearman.org
Pythonвкачествеосновногоподдерживаемогоязыка;
Проектбыстроразвивается,активноесообщество;
Легкоразвертывается,минимумконфиговилишнегокода;
ИнтеграциясDjango.
www.celeryproject.orgCelery
МывыбралиCelery
Python:)
Гибкий,поддержкамножестваразличныхброкеров;
Отказоустойчивый,легкомасштабируется;
Высокопроизводительный;
ВдохновляющийопытInstagram.
Celery
brokers
RabbitMQ
Стабильный;
Рекомендуютпо-умолчанию.
Cложностьтонкойнастройки;
Плюсещеодинкомпонентинфраструктуры.
Redis
Давноиуспешноиспользуемвпродакшне;
Быстрыезапись/чтение(задачихранятсявпамяти);
Легкоподнятьснуля.
Дорогодлябольшихданных;
Failover:можно,носложно.
Experimentalbrokers
MongoDB; |ограничениеразмерадокумента16Mb
Beanstalk;
AmazonSQS;
CouchDB;
SQLAlchemy;
...другие.
Сельдерей+редис!
Архитектура
APIInstances
Celerygates
Celery
workers
Redisstorage
2xuWSGIgateinstances
2xAWSEC2c3.xlarge
(4vCPU,7.5GbRAM,2x40GbSSD)
8xWorkerinstances
8xAWSEC2c3.2xlarge
(8vCPU,15GbRAM,2x80GbSSD)
rpm
ЗадачивiFunny:)
Публикацияконтента;
Fanout;
Revokefanout;
Рассылкаemail-уведомлений.
КонфигурацияCelery
celery=Celery('celerytasks')
celery.config_from_object(‘celeryconfig')
@celery.task()
deftest_task(foo):
result=tasks.test.execute(foo)
returnresult
Brokerconfig
BROKER_URL="redis://:12345@localhost:6379/0"
CELERY_RESULT_BACKEND="redis://:12345@localhost:6379/0"
APIentrypoint
fromflaskimportg
...
@app.route(“/test/task",methods=[‘GET'])
deftest_task():
foo=g.params.get('foo')
async_result=celerytasks.test_task.delay(foo)
returnasync_result
Разделениеочередей
CELERY_ROUTES={
'celerytasks.test_task':{'queue':'test_foo'},
'celerytasks.foo_task':{'queue':'test_foo'},
'celerytasks.bar_task':{'queue':'test_bar'},
}
Taskcalling
features
Linking
test_task.apply_async((foo),link=test_task.s(bar))
Customerrorhandler
test_task.apply_async((foo),link_error=error_handler.s())
Countdown
result=test_task.apply_async((foo),countdown=3)
rresult.get()#вернетрезультаткакминимумчерез3секунды
Expiration
test_task.apply_async((foo),expires=60)#задачаистечетчерез
60секундоттекущеговремени(получаетстатусREVOKED)
Retry
test_task.apply_async((foo),retry=True,retry_policy={
'max_retries':3,
'interval_start':0,
'interval_step':0.2,
'interval_max':0.2,
})
Serializers
test_task.apply_async((foo),serializer=‘json')#pickle,JSON,YAML,
msgpacketc
Compression
test_task.apply_async((foo),compression=‘zlib')#gzip,bzip2
Routingtoqueue
test_task.apply_async(queue=‘test_queue')test_task.apply_async(queue=‘test_queue')
Логирование
Graylog2
Opensourceсистемааналитикиданных;
СобственныйформатсообщенийGELF;
Дополнительноберемсообщенияизsyslog.
ИногдападаетприиспользованииGELF.
Мониторинг
Celeryevents;
Flower;
Datadog;
NewRelic;
...другие.
Flower
Real-timetasksmonitoring;
Workerspoolrestart;
Web-interface;
Основаннаceleryevents.
Постояннопадалвпикенагрузки;
МалосМалостатистики.
Datadog
fromstatsdimportstatsd
...
@app.route("/foo",methods=['POST'])
deffoo():
statsd.increment('ifunny.tasks.received',1,tags=[“task:foo”])
NewRelic
Среднеевремявыполнениязадачи;
Детальнаястатистикапотипамзадач;
Реалтайммониторингошибок;
Количествозапросоввминуту;
Футболкавподарок:)
ССтоитнедешево.
Среднеевремявыполнениязадач
Мониторингошибок
Чтодальше?
Celery3.1— течетпамять;
FailoverгейтовпришлосьсделалирукамивкодеAPI;
Гейтысамипосебе— тяжелыеиизбыточные;
ДобавлятьзадачинапрямуюизRedis;
ДумаемнасчетRabbitMQ.
Спасибозавнимание!
Вопросы?
СергеевАнтон
@hackPNZ
github.com/hackpnz

More Related Content

More from Конференция разработчиков программного обеспечения SECON'2014

SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...
SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...
SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Максим Цепков - DDD: от требований до кода
SECON'2014 - Максим Цепков - DDD: от требований до кодаSECON'2014 - Максим Цепков - DDD: от требований до кода
SECON'2014 - Максим Цепков - DDD: от требований до кода
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Кирилл Мокевнин - Формирование инженерной культуры
SECON'2014 - Кирилл Мокевнин - Формирование инженерной культурыSECON'2014 - Кирилл Мокевнин - Формирование инженерной культуры
SECON'2014 - Кирилл Мокевнин - Формирование инженерной культуры
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Юрий Бушмелев - Эволюция системного администратора
SECON'2014 - Юрий Бушмелев - Эволюция системного администратораSECON'2014 - Юрий Бушмелев - Эволюция системного администратора
SECON'2014 - Юрий Бушмелев - Эволюция системного администратора
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения Agile
SECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения AgileSECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения Agile
SECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения Agile
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...
SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...
SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Сергей Цивин - Производительность веб-приложений
SECON'2014 - Сергей Цивин - Производительность веб-приложенийSECON'2014 - Сергей Цивин - Производительность веб-приложений
SECON'2014 - Сергей Цивин - Производительность веб-приложений
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформSECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям
SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиямSECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям
SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Сергей Шпадырев - Разработка 3D-игры на Flash: едем с костылями...
SECON'2014 - Сергей Шпадырев -  Разработка 3D-игры на Flash: едем с костылями...SECON'2014 - Сергей Шпадырев -  Разработка 3D-игры на Flash: едем с костылями...
SECON'2014 - Сергей Шпадырев - Разработка 3D-игры на Flash: едем с костылями...
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Андрей Устюжанин - Маленькие секреты больших данных
SECON'2014 - Андрей Устюжанин - Маленькие секреты больших данныхSECON'2014 - Андрей Устюжанин - Маленькие секреты больших данных
SECON'2014 - Андрей Устюжанин - Маленькие секреты больших данных
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кодаSECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...
SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...
SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
Конференция разработчиков программного обеспечения SECON'2014
 
SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как ...
SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как ...SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как ...
SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как ...
Конференция разработчиков программного обеспечения SECON'2014
 

More from Конференция разработчиков программного обеспечения SECON'2014 (16)

SECON.Посиделки #16: Cassandra (презентация)
SECON.Посиделки #16: Cassandra (презентация) SECON.Посиделки #16: Cassandra (презентация)
SECON.Посиделки #16: Cassandra (презентация)
 
SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...
SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...
SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...
 
SECON'2014 - Максим Цепков - DDD: от требований до кода
SECON'2014 - Максим Цепков - DDD: от требований до кодаSECON'2014 - Максим Цепков - DDD: от требований до кода
SECON'2014 - Максим Цепков - DDD: от требований до кода
 
SECON'2014 - Кирилл Мокевнин - Формирование инженерной культуры
SECON'2014 - Кирилл Мокевнин - Формирование инженерной культурыSECON'2014 - Кирилл Мокевнин - Формирование инженерной культуры
SECON'2014 - Кирилл Мокевнин - Формирование инженерной культуры
 
SECON'2014 - Юрий Бушмелев - Эволюция системного администратора
SECON'2014 - Юрий Бушмелев - Эволюция системного администратораSECON'2014 - Юрий Бушмелев - Эволюция системного администратора
SECON'2014 - Юрий Бушмелев - Эволюция системного администратора
 
SECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения Agile
SECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения AgileSECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения Agile
SECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения Agile
 
SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...
SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...
SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...
 
SECON'2014 - Сергей Цивин - Производительность веб-приложений
SECON'2014 - Сергей Цивин - Производительность веб-приложенийSECON'2014 - Сергей Цивин - Производительность веб-приложений
SECON'2014 - Сергей Цивин - Производительность веб-приложений
 
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформSECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
 
SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям
SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиямSECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям
SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям
 
SECON'2014 - Сергей Шпадырев - Разработка 3D-игры на Flash: едем с костылями...
SECON'2014 - Сергей Шпадырев -  Разработка 3D-игры на Flash: едем с костылями...SECON'2014 - Сергей Шпадырев -  Разработка 3D-игры на Flash: едем с костылями...
SECON'2014 - Сергей Шпадырев - Разработка 3D-игры на Flash: едем с костылями...
 
SECON'2014 - Андрей Устюжанин - Маленькие секреты больших данных
SECON'2014 - Андрей Устюжанин - Маленькие секреты больших данныхSECON'2014 - Андрей Устюжанин - Маленькие секреты больших данных
SECON'2014 - Андрей Устюжанин - Маленькие секреты больших данных
 
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кодаSECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
 
SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...
SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...
SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...
 
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
 
SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как ...
SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как ...SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как ...
SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как ...
 

SECON'2014 - Сергеев Антон - Асинхронные задачи в iFunny