sldo_ru
@sldo_ru
Frontend Dev. in Birppl

Как организовать хранение сообщений в Redis?

Есть чат, написанный на Socket.io+Node.js+Redis.

Сделано все следующим образом: при заходе на страницу создается новое сокет-соединение и emit события (auth), после этого на сервере создается sub redis с идентификатором по ID пользователя и создается новая socket комната. При отправке сообщения передается в channel - id пользователя и сообщение. Sub.on выступает в качестве приема сообщений и отправляет в сокет канал. В связи с тем, что pub/sub не умеет хранить историю сообщение, появился вопрос: как сделать хранение сообщений на redis, но использовать pub/sub (поскольку позволяет легко масштабироваться).

sub.on('message', (channel, message) => {
    io.to(channel).emit('message', message)
})

io.on('connection', socket => {
    let uID = null;
    socket.on('auth', userID => {
        uID = userID
        sub.subscribe(userID)
        socket.join(userID)
    })

    socket.on('message', data => {
        pub.publish(data.userID, data.msg)
    })
});
  • Вопрос задан
  • 276 просмотров
Решения вопроса 1
2ord
@2ord
При помощи RPOPLPUSH
https://big-elephants.com/2013-09/building-a-messa...
https://stackoverflow.com/questions/6192177/redis-...
Но если нужна надежная доставка, то нужно подумать о замене на другую MQ.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Решение - не хранить историю в Redis. Этилен база данных, а прокачаный кэш. Как очередь я бы его тоже не советовал - он имеет свойство проглатывать сообщения
Ответ написан
Ваш ответ на вопрос

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

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