Как реализовать уведомления и сообщения как в ВК?

Всем, привет!
Решил я сделать реал-тайм уведомления на сайте и обновление сообщений в диалоге.

Сам сайт на php, запущен также nodejs сервер.
В ноде: express, socket.io, redis и т.д.

Как у меня было ?
Допустим, как было реализованы уведомления ?
Просто тупо ajax запросы n кол-во раз в минуту, из-за большого онлайна и юзеров могло быть куча вкладок, плюс они ходят по вкладкам, вообщем чуть ли не постоянно БД получала too many connections.

Я решил все переделать на ноду с соединением через вебсокет.

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

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

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

Как это реализовать ?
  • Вопрос задан
  • 1274 просмотра
Пригласить эксперта
Ответы на вопрос 3
@marataziat
Джангист-тракторист
Чтобы понимать находится ли юзер в вкладке: https://stackoverflow.com/a/20922020/7415288

В браузерах есть фича чтобы вкладки одного и того же сайта говорили между собой: https://developer.mozilla.org/en-US/docs/Web/API/B...
Ответ написан
2ord
@2ord
продвинутый чайник
чуть ли не постоянно БД получала too many connections

Возможно, время между открытием соединения и закрытием проходит достаточно много времени и поэтому СУБД вынуждена держать много открытых соединений одновременно, что плохо.
Скорее всего, код нужно исправлять.
Ответ написан
@p1rat495
Не знаю как там сейчас, а раньше было реализовано через iframe и postMesaage().
посмотри тут

P.S. Открывается одно соединение только на первой зашедшей вкладке пользователя, дальше все уведомления рассылаются на остальные вкладки
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы