Каково количество подходов, из-за которых мой подход к новостной ленте неверен? - PullRequest
0 голосов
/ 26 июня 2011

Этот вопрос задавался ТЫСЯЧУ раз ... так что это несправедливо, если вы решите пропустить чтение / ответ на него, но я все же думал, что люди хотели бы увидеть и прокомментировать мой подход ...

Я создаю сайт, для которого требуется канал активности, например FourSquare.

Но на моем сайте есть эта функция, и мне не нужны вещи, которые нужно сохранять вечно.

Итак, я записываю event_type и user_id в таблицу MySQL.Перед записью новых событий в таблицу я удаляю все старые ненужные строки (подсчитывая общее количество строк, получая event_id меньше, чем все, что является избыточным, и удаляя эти строки).Я сокращаю таблицу и пишу новую строку каждый раз, когда происходит событие.Есть еще один user_text столбец, который равен NULL , если нет сгенерированного пользователем текста ...

Во внешнем интерфейсе у меня есть jQuery, который проверяет с помощью PHPфайл через GET каждые x секунд, когда пользователь открывает сайт.JQuery отправляет запрос с последним полученным обновлением «id».Теги

, сгенерированные моим бэкэндом, имеют атрибут id, установленный как идентификатор строки MySQL.Таким образом, мне не нужно сохранять last_received_id в памяти, хотя я предполагаю, что нет абсолютно никакого влияния на производительность при хранении одной переменной с очень маленьким значением int в памяти ...

У меня есть функция, которая генерирует «текст обновления» в зависимости от event_type и user_id. Я передаю его из jQuery, и является ли столбец user_text пустым.Текст обновления передается обратно в jQuery, который добавляет недавно полученное событие

в фид с некоторыми эффектами, одновременно избавляясь от события "tail end"
с эффектом.

ЕслиЯ (что более важно, клиент) хочу, чтобы в моей базе данных (или другой) была таблица «Архив событий», которая сохраняет все лишние строки перед удалением.Таким образом, информация о событии будет сохранена навсегда, не влияя на производительность живого сайта ...

Я использую CodeIgniter, поэтому нигде не будет повторений кода.Все соответствующие функции входят в класс LiveUpdates в библиотеке и модели соответственно.

Я довольно доволен тем, как я это делаю, потому что он решает проблему под рукой, придерживаясь идеологии KISS ..Но все же, кто-нибудь может указать мне на некоторые ресурсы, которые показывают лучший способ сделать это?Поиск Google по этой теме выявляет слишком много статей / ТАК вопросов, и я хотел бы воспользоваться опытом любого другого разработчика, который уже просмотрел их и нашел лучший подход ...

1 Ответ

2 голосов
/ 26 июня 2011

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

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

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

Об индексах: индекс является "правильным", когда наиболее распространенный запрос к таблице может быть выполнен с поиском и минимальным числом чтений (например, 1-5). В вашем случае это может быть инкрементный идентификатор или дата (если она имеет достаточную точность). Если вы спроектируете это правильно, операция по поиску самого последнего update_id должна быть однократным чтением. Затем, когда ваш клиент отправляет свой ajax-запрос, чтобы увидеть, есть ли обновленное содержимое, сначала выполните запрос, чтобы определить, меньше ли переданное значение (идентификатор или время), чем текущее значение. Если это так, немедленно ответьте новым контентом с помощью второго запроса. Ваша цель - максимально упростить действие «ping», даже если это связано с немного большими затратами при появлении нового контента.

Использование толчка было бы намного лучше, поэтому, пожалуйста, изучите Comet .

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

Обновление : предложение клиентам получить ответ «да, есть новый контент», а затем запросить контент, возможно, не самый лучший. Пожалуйста, смотрите Почему Жиры Пин выигрывают для некоторых очень интересных связанных материалов.

...