Если вы разрабатываете приложение для такого массового притока, вам необходимо сократить его основные компоненты до абсолютного минимума.
Использование полного стека 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.