Ответы пользователя по тегу Socket.io
  • Чат и не прочитанные сообщения пользователя, как правильно спроектировать БД?

    undassa
    @undassa
    Last.Backend
    Для хранения недоставленный сообщений целесообразнее использовать redis и сделать это следующим образом:

    Если пользователь в данный момент не онлайн, записывать сообщения в редис через rabbtimq (ZeroMQ) специальными воркерами. Тогда удастся размазать нагрузку и не будет пиков.

    Так же желательно все сообщения для конкретного пользователя хранить в его "личном" списке, а не списке комнаты, тогда есть возможность (при необходимости) при успешном получении - очищать кеш и redis не будет раздуваться.

    Если же необходимо хранить историю сообщений - желательно написать воркер, который раз в n секунд будет забирать данные из кеша и записывать в БД в отдельную коллекцию или таблицу, и так же очищать кеш.

    При подключении пользователя просто делать запрос на получение недоставленных сообщений из кеша, если кеш пуст - загрузить из БД из специальной таблицы недоставленных.

    Зачем нужна отдельная таблица (коллекция) - так как непрочитанные сообщения - данные, находящиеся постоянно в работе - данная таблица не будет постоянно увеличиваться в размерах (будет, но существенно медленнее, ведь её так же надо очищать), соответственно выборка по данной таблице с учетом индексации будет гораздо быстрее.

    Успехов :)
    Ответ написан
    Комментировать
  • Как масштабировать чат написанный на socket.io/nodejs?

    undassa
    @undassa
    Last.Backend
    io.on('connection', function (socket) {
    //
    });


    Данное событие сработает при успешном создании постоянного соединения между клиентом и сервером.
    Так как сокет соединение - это соединение в единственном экземпляре, то оно попадёт либо на 1й инстанс либо на 2й инстанс. И данное событие сработает либо тут либо там.

    Если уж вам по какой то причине необходимо увидеть в консоли событие подключения в обоих инстансах,
    я бы попробовал следующее:

    1. Использовал бы в качестве канала между инстансами нативный модуль redis.
    2. При успешном подключении послал бы в канал redis.publish уведомление по новом подключении

    НО! Необходимо вручную определять события которые надо прикидывать на второй инстанс, иначе от такого масштабирования нет толку, потому что оба инстанса будут обрабатывать одни и теже команды.

    Резюмируя: В этом нет смысла. Если есть необходимость - надо просто через редис уведомить второй сервис.
    Ответ написан
    2 комментария