5

Ситуация:Внедрение фида событий - будет ли оно масштабироваться?

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

События от всех пользователей собраны в одной таблице центральной базы данных, event_log. Пользователи находятся в паре в качестве друзей в таблице friends. СУБД, которые мы используем, - это MySQL.

Стандартный метод: Когда пользователь запрашивает страницу их подачи, система формирует канал путем присоединения внутренней event_log с friends. Результат затем кэшируется и устанавливается на таймаут через 5 минут. Масштабирование достигается путем изменения этого таймаута. Метод

предполагаемыми: Задача выполняется в фоновом режиме и для каждого нового необработанного элемента в event_log, он создает записи в таблице базы данных user_feed спаривания это событие со всеми пользователями, которые являются друзьями с пользователем, который инициировал событие. Одна строка таблицы объединяет одно событие с одним пользователем.

Проблемы со стандартным методом хорошо известны - что, если многие тайники людей истекают одновременно? Решение также не очень хорошо масштабируется - краткое сообщение о том, что каналы могут обновляться как можно ближе к реальному времени

Предполагаемое решение в моих глазах кажется намного лучше; вся обработка выполняется в автономном режиме, поэтому пользователь не ожидает создания страницы, и нет объединений, поэтому таблицы базы данных могут быть распределены по физическим машинам. Однако, если пользователь имеет 100 000 друзей и создает 20 событий за один сеанс, это приводит к вставке в базу данных 2 000 000 строк.

Вопрос:

вопрос сводится к двум пунктам:

  • Является ли это наихудший сценарий упоминалось выше проблематична, то есть ли размер таблицы имеют влияние на производительность MySQL и есть ли проблемы с этой массовой вставкой данных для каждого события?
  • Есть ли что-нибудь еще, что я пропустил?
+2

будет ли это смешать !!! –

ответ

1

Я думаю, что ваша гипотетическая система генерирует слишком много данных; во-первых, в глобальном масштабе требования к хранению и индексированию на user_feed, по-видимому, эскалируют экспоненциально, поскольку ваша пользовательская база становится все более и более взаимосвязанной (как предположительно желательной для социальной сети); во-вторых, подумайте, если в течение минуты 1000 пользователей каждый ввели новое сообщение, и у каждого было 100 друзей - тогда ваш фоновый поток имеет 100 000 вставок и может быстро отстать.

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

Тогда, хотя для обновления фида потребуется полное соединение и запрос, быстрый запрос к таблице last_user_feed будет определять, требуется ли обновление или нет.Это, по-видимому, смягчает самые большие проблемы с вашим стандартным методом, а также предотвращает трудности с размером хранилища, но этот фоновый поток по-прежнему требует много работы.

+0

Но, с другой стороны, таблица 'user_feed' содержит только два столбца:' event_log_id' и 'user_id', а первичный ключ - в обоих этих столбцах. Таким образом, каждая строка имеет 8 байтов, так что это всего 800 КБ для описываемого вами сценария. Если это проблема, эта таблица может быть сохранена на полностью отдельном сервере или даже разбивать таблицу на разные серверы для нечетных/четных пользователей. Извините, просто являюсь Защитником Дьявола, но я все еще не убежден. – SlappyTheFish

+0

Кроме того, отставание не является проблемой, страницы все равно будут обслуживаться, и если данные будут старыми во время пикового времени (которые происходят один раз в день), то он может догнать позже. Хорошо, хватит говорить - я собираюсь сделать некоторые тесты. – SlappyTheFish

+0

Поймите свои комментарии; Я тоже бы попробовал некоторое тестирование и увидел, что он работает на практике. – Elemental

0

Метод гипотезы работает лучше, когда вы ограничиваете максимальное количество друзей .. многие сайты устанавливают безопасную верхнюю границу, включая Facebook iirc. Он ограничивает «икоты», когда ваш пользователь 100K друзей генерирует активность.

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

Я много раз думал об этой проблеме - это не проблема. MySQL будет хорошо решать. Я подумал о том, как использовать memcached, и каждый пользователь нажимает на то, что их последние несколько статусных элементов имеют «их ключ» (и в упражнении чтения фида, который вы извлекаете и объединяете все ключи вашего друга) ... но у меня нет испытал это. Я еще не уверен обо всех плюсах и минусах.

Смежные вопросы