Обработка сотен одновременных запросов в рельсах - PullRequest
5 голосов
/ 01 июля 2011

Я пишу приложение ruby ​​on rails, и одна из самых важных функций сайта - это голосование в реальном времени. Мы полностью ожидаем, что получим 10 000 запросов на голосование всего за 1 минуту. Наряду с другими запросами это означает, что мы могли бы получить тонну запросов.

Моя первоначальная идея - настроить сервер на использование apache + phusion, однако, для голосования, в частности, я думаю о написании php-скрипта на стороне и записи / чтении информации в memcached. Данные должны сохраняться только около 15 минут, поэтому запись в базу данных 10 000 раз за 1 минуту кажется бессмысленной. Нам также нужно пометить ip пользователя, чтобы он не голосовал дважды, что усложняет работу в memcached.

Если у кого-нибудь есть какие-либо предложения или идеи, чтобы сделать эту работу как можно лучше, пожалуйста, помогите.

1 Ответ

7 голосов
/ 01 июля 2011

Если вы разрабатываете приложение для такого массового притока, вам необходимо сократить его основные компоненты до абсолютного минимума.

Использование полного стека Rails для такой интенсивности не очень практично и не необходимо. Было бы намного лучше создать очень тонкий слой Rack, который будет обрабатывать голосование, делая прямые вызовы БД, пропуская даже ORM, по сути являясь оболочкой для оператора INSERT. В этом может помочь Синатра и Сиквел, которые служат эффективным генератором запросов.

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

Выполнение 10 000 вызовов БД за минуту - это не проблема, каждый вызов займет всего лишь долю миллисекунды в правильно настроенном стеке. Memcached может предложить более высокую производительность, особенно если результаты не предназначены для постоянного использования. Memcached имеет атомарный оператор приращения, который именно то, что вы ищете, просто подсчитывая голоса. Redis также очень способный временный магазин.

Другая идея состоит в том, чтобы полностью очистить БД и написать постоянный серверный процесс, который говорит на простом протоколе на основе JSON. Eventmachine отлично подходит для объединения этих вещей, если вы привержены Ruby, как и NodeJS, если вы хотите создать специализированный подсчетный сервер в JavaScript.

10 000 операций в минуту легко достижимо даже на скромном оборудовании, использующем специализированные серверные процессы без затрат на полный стек БД.

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

Поскольку то, что вы описываете, по сути является чем-то эквивалентным поиску по хешу, основной код просто:

contest = @contest[contest_id]

unless (contest[:voted][ip])
  contest[:voted][ip] = true
  contest[:votes][entry_id] += 1
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...