/hlbattle

My code for the Scalaxy Highload Battle

Primary LanguagePython

About this project

This is a very simple blog engine made for the Scalaxy's Highload Battle.

Результат

Во второй круг нагрузки не вышел, так как на один единственный запрос отдал код 500. Судя по логам nginx-а, развалился канал между веб-севером и моим приложением, либо приложение не влезло в таймаут, за который nginx хочет данные.

Что я использовал и почему

Вместо постмортема попробую рассказать, что и почему я сделал.

Для начала, после долгих раздумий и экспериментов, я решил обойтись одной виртуальной машиной размером в две ноды. И, кажется, именно из-за этого и напоролся. Нужно проверять, конечно.

Nginx

На машинке мне удалось натюнить nginx на отдачу примерно 16000 запросов в секунду из веб-приложения, выдающего банальный "Hello world", но через шаблонизатор.

Когда принимал решение оставить nginx ещё расчитывал на вариант с несколькими машинами в качестве апстримов. Перед самым запуском отказался от многомашинной конфигурации, так как, если бы бомбили мегабайтными запросами, то в 100-мегабитный линк из много бы не влезло. В коненчом итоге, понял, что бомбы вряд ли будут толстыми, но переделывать уже не стал. Это и был фейл, как я думаю.

Python & Tornado Web Server

Я не имею предбеждения против интерпретируемых языков, а питон ещё и люблю (мне приятно и удобно выражать на нём свои мысли).

Tornado Web Server очень годный и по скорости отдачи практически равносилен nginx-у (rps: 15,5k против 16k).

Redis

Ничего не знал про Редис и было интересно. Решил попробовать, соблазнившись активной работой в памяти и асинхронным сбросом данных на диск. По условиям конкурса, целостность данных должны быть только во время тестирования.

В процессе написания движка понял, что благодаря поиску ключей по маске могу сделать поисковый индекс с очень быстрой отдачей. В итоге, каждое слово становилось ключом со списком значений, указывающих на пост, в котором это слово есть.

Вообще, я решил сыграть на том, что пост может попадать в индекс в течение 3-х секунд после поста и хотел поставить несколько отдельных машинок, которые редьюсили бы тексты и забивали в редис, но, как я уже писал выше, машинка была одна и я вставил этот процесс прямо в обработчики post-операций. Вероятно, это всё же стоило разнести.

Как-то так.

Мне можно написать по адресу gregor@gregor.ru или в твиттер @gregor_ru