another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Как реализовать получение новых сообщений при подключении к WebSocket?

Имеется проект:
- Laravel 5.2
- Node JS
- Socket.IO 1.4.5

Сокет-сервер:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();

redis.psubscribe('*', function(err, count) {
});
redis.on('pmessage', function(pattern, channel, message) {
    message = JSON.parse(message);
    io.emit(channel + ':' + message.event, message.data);
});
http.listen(9543, function(){
    console.log('Listening on Port 9543');
});


Все это в связке с Events(Laravel).

При создании сообщения вызывается event и клиент, подключившийся к сокету, получает контент, тут все работает как нужно.

Вопрос - как реализовать своеобразную "очередь" сообщений, чтобы при подключении к сокету клиент получал все предыдущие сообщения, которые должны были прийти через сокет?

Или хотя бы как при подключении к сокету вызвать событие(Laravel Event) или любым другим способом обратиться к бэкенду(Laravel) и получить от него определенные данные?

Важно получить сообщения именно при подключении/переподключении к сокету.

Спасибо.
  • Вопрос задан
  • 711 просмотров
Решения вопроса 1
miraage
@miraage
Старый прогер
Насколько я помню, из коробки такого нет.
В таком случае, я бы сделал так:
- дублировать событие в том же редисе, помечать как "непрочитанное"
- при получении сообщения на клиенте отправлять обратный запрос через сокет с пометкой "прочитано", и там же через nodejs убивать тот ключ в редисе
- при переподключении забирать все "непрочитанные" сообщения

Посмотрите, возможно существуют другие реализации message queue, которые из коробки поддерживают данный механизм.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@deadmemoras
P.s: совсем не по теме (практически).
В общем, тоже пишу свой проект, там будут диалоги(на отдельный странице, просто роуты).
Как лучше:
ajax или почитать про Node и на нем?
p.s: весь проект на php + jquery
Ответ написан
Ваш ответ на вопрос

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

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