Использование memcached в качестве буфера базы данных для сообщений чата - PullRequest
6 голосов
/ 15 июня 2011

Я играю с созданием приложения чата с использованием PHP и CodeIgniter.

Для этого я реализую кеш-буфер с memcached для хранения самых последних сообщений чата в памяти, уменьшая нагрузку набаза данных.Я хочу сделать следующее:

  1. Когда приходит сообщение, я сохраняю его в memcached, используя в качестве ключа текущую минуту (YYYY-MM-DD-HH-MM).Нет ввода-вывода базы данных.Идея заключается в том, что все сообщения с одной и той же минуты собираются под одним и тем же ключом.
  2. Пользователи получают новые сообщения чата, также извлеченные из memcached (сейчас я использую длинный опрос, но это переместится в WebSockets подNode.js по очевидным причинам производительности).Опять же, никаких операций ввода-вывода базы данных не происходит.
  3. Автоматический серверный скрипт (cronjob) будет запускаться раз в 5 минут, собирая данные из кэша за последние 5 минут и вставляя сообщения в базу данных.
  4. Объекты memcached устаревают через 6 минут, поэтому нам никогда не нужно хранить в памяти данные сообщений более 6 минут

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

Это звучит выполнимо?Есть ли лучший (возможно, даже встроенный?) Способ использования memcached для этой цели?


Обновление : я немного экспериментировал сейчас, и у меня есть идеядля ярлыка (читай: взломать ).Я могу временно «буферизовать» сообщения в серверном скрипте Node.js, пока не буду готов их сохранить.Объект Javascript / массив сообщений на сервере Node.js - это, по сути, кэш-память.

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

Тем не менее, я беспокоюсь, что это может нанести ущерб процессу сервера Node.js, так как он, вероятно, не будет наслаждаться переносомвокруг этого массива 200 КБ.

Есть какие-нибудь мысли по поводу этой стратегии?Это совершенно безумно?

Ответы [ 2 ]

3 голосов
/ 15 июня 2011

Вы смотрели на сокетные соединения HTML5?С сокет-сервером вам не нужно ничего хранить.Сервер получает сообщение от одного подписчика и немедленно отправляет его нужным подписчикам.Я не делал этого сам, используя HTML5, но я знаю, что функциональность теперь существуетЯ сделал это перед использованием Flash, который также поддерживает соединения с сокетом.

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

Почему бы не использовать INSERT DELAYED? Он предлагает вам практически ту же функциональность, которую вы пытаетесь достичь без необходимости использования memcached.

В любом случае, ваше решение тоже выглядит хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...