redis pub / sub模型用于选择性推送的通知系统

时间:2014-07-03 20:19:46

标签: node.js redis socket.io

我正在构建像facebook这样的通知系统,我的应用程序逻辑(发布者)会将所有用户生成的通知推送到redis系统。

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

如上所示,用户1,2,3生成的所有活动都会发送到相同的频道通知。

我有一个node.js /socket.io服务器监听redis作为这些通知的订阅者。 (已订阅频道通知

现在,如何有选择地仅将某些通知推送给某些订阅者?像Facebook通知一样,我只会收到发送给我的私信的通知,而不会发送给发送给他人的短信。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

为每个用户创建个人频道,例如notifications.User1,notifications.User2,..., 并让每个用户订阅他/她的频道。 (您不必担心频道和尺寸。)

如果用户共享一个redis连接, 每当连接收到任何订阅消息时,您可能需要从频道名称中识别接收者用户。

<强>更新

我假设这种情况:

当用户登录您的应用时,您的nodejs应用可能会知道该用户的ID 然后,您的应用仅为用户订阅频道,例如,如下所示:
(这是一种伪代码,我不确定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连接只需发送命令&#39; subscribe&#39;即可订阅任何redis频道 我假设您的用户会将自定义可识别用户信息(至少是用户的ID)发送到nodejs服务器,以便您的nodejs应用程序可以使频道名称动态化。
(如果您的用户不会发送用户的ID,您如何识别每个用户?)