Какие технологии использовать для частого обновления большого количества строк в БД?

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

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

Какие технологии (БД, механизм синхронизации) для этого лучше использовать?

В качестве БД пробовал postgres, обновление - update таблицы комментариев по cron.
В итоге получается, что нужно после каждого обновления пересчитывать общий рейтинг. Так как таблица комментариев насчитывает более 10 миллионов записей, запрос выполняется около минуты, при том что изменения происходят только в очень маленьком проценте записей.

Сейчас смотрю в сторону mongodb и redis.

Подскажите, пожалуйста, грамотный способ поддержания в актуальном состоянии такой БД.
Хотелось бы, чтобы пользователи не замечали задержек при получении своего места в рейтинге из-за блокировок в момент обновления рейтинга.
  • Вопрос задан
  • 2834 просмотра
Пригласить эксперта
Ответы на вопрос 2
@AlekseyKuzmin
SPB
вариант 1. изменить структур хранения. Рейтинг хранить в другой таблице. Разнести комментарии не несколько шардов.
вариант 2. апдейтить рейтинг конкретного пользователя когда он оставит комментарий, а не всех пользователей подряд.
вариант 3. - вариант 1 + 2 и задания на обновления рейтинга ставить в очередь в том же редисе с замещением старых заданий. Так рейтинг будет обновляться, но не чаще чем раз в 5 мин (например). Если юзер за 5 мин оставить 10 комментариев - рейтинг обновиться только 1 раз. Система будет устойчивее. будут задержки в обновлении рейтинга, но главное все остальное будет работать.
Ответ написан
Комментировать
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
У Вас выбрана плохая схема обновления рейтингов. При такой схеме, чем больше комментариев, тем с каждым разом будет труднее их обновлять, ведь придется каждый раз пробегать все записи.
Зачем пересчитывать рейтинг каждый раз для ВСЕХ записей? Попробуйте сделать рейтинг счетчиками, а уж счетчики пересчитывать в проценты или что там у Вас на лету.
К примеру, изначально:
запись 1 - счетчик 1
запись 2 - счетчик 1
запись 3 - счетчик 1

Далее, на запись 2 было сделано последовательно 10 комментариев (при каждом комментарии обновляем счетчик записи), стало
запись 1 - счетчик 1
запись 2 - счетчик 11
запись 3 - счетчик 1
комментарий 1, для записи 2, счетчик, 1
...
комментарий 10, для записи 2, счетчик, 1

Теперь для составления рейтинга нам достаточно найти только максимум по счетчику, приняв его за 100 процентов, в текущем случае будет 11. И ничего не нужно обновлять по крону, никакого перебора записей нам не нужно.
Например на 5 записей:
запись 1 - счетчик 33
запись 2 - счетчик 78
запись 3 - счетчик 3
запись 4 - счетчик 22
запись 5 - счетчик 15
Максимум у нас MAX = 78, рейтинг считаем по формуле счетчик зиписи * ( 100 / MAX )
Итого при выборе максимума и любой из записей будет
запись 1 - счетчик 33 - рейтинг 42
запись 2 - счетчик 78 - рейтинг 100
запись 3 - счетчик 3 - рейтинг 4
запись 4 - счетчик 22 - рейтинг 28
запись 5 - счетчик 15 - рейтинг 19

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

PS. Уф, вот запилил-то... Задавайте вопросы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы