vanilich
@vanilich

Comet (php + js + mysql). Как реализовать мгновенные сообщения?

Доброго времени суток.
Разрабатываю web-приложение и столкнулся с небольшой проблемой. А именно с реализацией сервиса мгновенных сообщений. В интернете прочитал про Comet, появилась идея поднять отдельный сервер для сообщений.
Все вроде бы понятно, да и реализовать не проблема, т.к. много велосипедов на просторах интернета можно найти.
Но меня волнует вопрос. Как сервер будет проверять наличие новых (не прочитанных) сообщений? Неужели каждые 5 секунд он должен обращаться к бд (в данном случае mysql) и забирать новые сообщения, а затем отдавать их пользователю. Получается задержка и немаленькая нагрузка на бд. Как быть? Что можете посоветовать? Как сервер может в реалтайме отследить появления нового сообщения и сразу отдавать его клиенту?
Заранее благодарен.
  • Вопрос задан
  • 1549 просмотров
Решения вопроса 1
vanilich
@vanilich Автор вопроса
Всем спасибо за ответы. Прочитал про node.js и socket.io. Заинтересовало. Скачал, установил, поигрался - понравилось. Думаю для моей задачи в самый раз.
Если говорить ближе к реализации, то сделаю вот так:
  • id - первичный ключ пользователя из бд
  • socket.id - id клиента, который выдает node.js

1. При подключении клиента к серверу, буду проверять его сессию и забирать его id из таблицы. Id и socket.id буду запоминать в массиве вида:
clients[id] = socket.id
2. Создам обработчик, аля "onClientSendMessage", где буду проверять кому отправляется сообщение.
3. Если человек, которому принадлежит отправленное сообщение, в данные момент подключен к серверу node.js, то заберу его socket.id из массива clients по ключу "id", и соответственно отправлю ему сообщение.
io.sockets.socket(socket.id).emit('newMessage', message_data);

4. Если человек не подключен к серверу, то просто сохраняю сообщение в базе.
5. Если клиент разорвал соединение, то удалю его из массива clients.
Вроде так... Всем спасибо.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Cesavel
Советую посмотреть в сторону веб сокетов
Ответ написан
Комментировать
goodwin74
@goodwin74
Думаю отлично может подойти модуль Nginx - nginx_push_stream.
Вот статья на хабре: habrahabr.ru/company/cackle/blog/167895
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
24 июл. 2024, в 11:35
10000 руб./за проект
24 июл. 2024, в 11:14
2000 руб./за проект
24 июл. 2024, в 10:48
10000 руб./за проект