Нагруженный сайт: обновление статистики в отдельном потоке?
От: dimgel Россия https://github.com/dimgel
Дата: 01.01.11 00:02
Оценка:
Всем привет и с праздничком.

Допустим есть высоконагруженный форум, на Java (многопоточность) / PostgreSQL (версионник). Допустим в его базе есть такая таблица:

create table message (
   id serial primary key,
   author_id int not null references "user"(id),
   text text not null,
   hits int,    -- статистика "сколько раз прочитано"
   rating int,  -- пусть будет упрощённо, в одно поле
);


Вопрос такой: а не загнётся ли такая схема под нагрузкой? Не лучше ли вынести статистику (hits, rating) в отдельную таблицу и обновлять эту таблицу в отдельном потоке, с некоторой буферизацией (pending writes)?

Мне видятся Scala actors — команды на обновление статистики от потоков, обрабатывающих HTTP-запросы, кидаются в очередь, которую вычитывает поток, обновляющий статистику. У потока есть кеш Map[messageId, (deltaHits, deltaRating)] с ограничением на максимальное количество записей, при достижении которого собственно выполняется batch update. Аргумент такой, что читают/оценивают обычно свежие посты, и количество хитов кеша должно получиться нормальным.

Кроме того, исключаются дедлоки, да и просто локи.

Покритикуйте, пожалуйста. Чего я не учёл?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.