redis pub / вспомогательная модель для системы уведомлений с выборочным нажатием

#node.js #redis #socket.io

#node.js #redis #socket.io

Вопрос:

Я собираюсь создать систему уведомлений, подобную facebook, где моя логика приложения (publisher) будет отправлять уведомления, сгенерированные всеми пользователями, в систему redis.

 User 1 --------------> Redis (Channel : notifications)
User 2 --------------> Redis (Channel : notifications)
User 3 --------------> Redis (Channel : notifications)
  

Как вы можете видеть выше, все действия, генерируемые пользователями 1,2,3, отправляются в один и тот же канал уведомлений.

У меня есть node.js /сокет.сервер ввода-вывода прослушивает redis в качестве подписчика на эти уведомления. (подписался на уведомления канала)

Теперь, как мне выборочно отправлять только определенные уведомления определенным подписчикам?Как и facebook notifications, я буду получать уведомления только о личных сообщениях, отправленных мне, а не о сообщениях, отправленных другим.

Заранее спасибо за вашу помощь.

Ответ №1:

Создайте персональный канал для каждого пользователя, например, для уведомлений.Пользователь1, уведомления.Пользователь2, …, и заставьте каждого пользователя подписаться на его / ее канал. (Вам не нужно беспокоиться о размере каналов.)

Если пользователи совместно используют одно соединение redis, вам может потребоваться идентифицировать пользователя-получателя по названию канала всякий раз, когда соединение получает какое-либо сообщение о подписке.

Обновить:

Я предполагаю, что этот сценарий:

Ваше приложение nodejs может знать идентификатор пользователя, когда пользователь входит в ваше приложение.
Затем ваше приложение подписывается на канал только для пользователя, например, вот так:
(это своего рода псевдокод, я не уверен в nodejs.)

 onUserLoggedIn(string userId) {
...
string userChannel = "notifications.user."   userId;

// If userId == "yash",
// then userChannel == "notifications.user.yash"

redisConnection.command("subscribe", userChannel);
...
}
  

И когда ваше соединение получено, опубликованное сообщение с вашего сервера redis:

 onMessagePublished(string channel, string message) {
    ...
    // You can get userId from channel id.
    vector<string> tokens = parseTokensFromChannel(channel);

    // If channel == "notifications.user.yash",
    // tokens == {"notifications", "user", "yash"};

    if (tokens[0] == "notifications") {
        if (tokens[1] == "user") {
            ...
            string userId = tokens[2];
            onMessagePublishedForUser(userId, message);
            ...
        } else {
            ...
        }
        ...
    } else {
        ...
    }
    ...
}

onMessagePublishedForUser(string userId, string message) {
// You can handle the message for each user.
// I don't think your user may need it's own handling code per user.

...
}
  

В этом сценарии вам вообще не нужно никакого жесткого кодирования.
Ваше соединение redis может подписаться на любые каналы redis, просто отправив команду «подписаться».
Я предполагаю, что ваш пользователь отправит пользовательскую идентифицируемую пользовательскую информацию (по крайней мере, идентификатор пользователя) на сервер nodejs, чтобы ваше приложение nodejs могло сделать название канала динамическим.
(Если ваш пользователь не отправляет идентификатор пользователя, как вы идентифицируете каждого пользователя?)

Комментарии:

1. Я немного новичок в node.js итак, я не уверен, правильно ли это, но канал, на который подписано приложение nodejs, жестко задан в коде, верно? Итак, как один и тот же скрипт nodejs будет подписываться на разные каналы? Может ли пользователь отправлять пользовательскую идентифицируемую пользовательскую информацию на сервер nodejs, чтобы я мог сделать название канала динамическим?

2. @YashDesai: Я обновил свой ответ на ваши дополнительные вопросы. (*)