Как вы масштабируете систему голосования на сайте с высоким трафиком? - PullRequest
5 голосов
/ 22 августа 2011

View

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

vote up reddit

База данных

Для поддержки этого требования схема базы данных должна быть как минимум следующей:

Страница

  • int pageId

Комментарии

  • int commentId
  • int pageId

Голоса

  • int userId
  • int commentId
  • enum (вверх, вниз), направление

Контроллер

Если бы идентификатор страницы был 123, а идентификатор пользователя - 456, это была бы наивная реализация контроллера:

1) Запрос всех голосов, сделанных пользователем 456 в комментариях на странице 123:

SELECT c.commentId, v.direction 
FROM comments AS c, votes AS v 
WHERE c.pageId = 123 
AND c.commentId = v.commentId
AND v.userId = 456

2) Построить представление с результатами этого запроса.

Проблема масштабируемости

Запрос к базе данных для поддержки этой системы голосования очень дорогой. Таблица комментариев и голосов будет огромной. На сайте с высоким трафиком тысячи пользователей будут выполнять этот запрос каждую секунду, чтобы получить персонализированный просмотр голосования с комментариями. Как вы масштабируете эту систему голосования, чтобы база данных не перегружалась слишком большим количеством запросов? Вы бы кешировали это в памяти? Разве не стоит практиковать кеширование вещей, общих для большой аудитории? В этом случае эти запросы относятся только к отдельным пользователям. Память будет быстро заполняться на сайте миллионами пользователей. Произойдет промах кэша, и база данных будет уничтожена.

1 Ответ

2 голосов
/ 22 августа 2011

I думаю Reddit будет кэшировать / хранить (для каждого комментария) список пользователей, которые проголосовали за него (и еще одного за отрицательные голоса), и обновлять этот кэш только каждые X секунд / минут / часов в зависимости отдеятельность.Список будет организован так, что возможен бинарный поиск.

Затем при создании страницы сервер должен только сказать, проверять, находится ли текущий идентификатор пользователя в списке «вверх / вниз» для каждого комментария.Reddit также ограничивает количество изначально видимых комментариев, что сокращает количество необходимых тестов.

Reddit также не обновляет голоса сразу (они добавляют голос в очередь).Они могут связывать воедино обработку очереди и кэширование голосов.

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

Возможно, точность не на 100%. Он основан на ограниченном чтении об архитектуре Reddit и о том, что я буду делать.

...