Задать вопрос

Как правильно отправлять уведомления во множество вкладок посредством socket.io?

Друзья, добрый день.

Столкнулся с весьма интересной задачей (возможно только для меня). Реализую уведомления посредством socket.io, redis. Все это крутится на yii2.

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

Клиентская часть. Здесь создаем комнату для пользователя и подписываемся на уведомления.

var socket = io();
socket.emit("join", {"room": userRoom});
socket.on("notify", function (data) {
     $( "#notifications" ).prepend(data.message);
});


Серверная часть.

io.on('connection', function (socket) {
        var redisClient = redis.createClient(6379, 'redis');
        redisClient.subscribe('notify');
        redisClient.on("message", function(channel, message) {
            var res = JSON.parse(message);
            io.sockets.in(res.room).emit(channel, {msg: res.message});
        });
        socket.on('disconnect', function() {
            redisClient.quit();
        });
    });


Как отправляется уведомление.
Yii::$app->redis->executeCommand('PUBLISH', [
    'channel' => 'notify',
    'message' => \yii\helpers\Json::encode(['room' => 'room', 'message' => 'hello'])
]);


Собственно работает хорошо. Но чем больше я открою влкадок браузера те больше я получу дублированных сообщений в одной вкладке. К примеру, у меня открыто 5 вкладок. Я инициирую один раз executeCommand и передаю сообщение hello. Таким образом в каждой из 5 вкладок появляется по 5 слов "Hello". При этом я смотрю через redis-cli monitor и вижу что только одно уведомление создается.

Заранее благодарен за подсказку.

Спасибо
  • Вопрос задан
  • 462 просмотра
Подписаться 8 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы