我正在构建像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通知一样,我只会收到发送给我的私信的通知,而不会发送给发送给他人的短信。
提前感谢您的帮助。
答案 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,您如何识别每个用户?)