发布/订阅在线好友的列表架构

时间:2015-02-19 18:01:50

标签: node.js publish-subscribe faye

我正在尝试用NodeJs和Faye实现用户的朋友在线列表,但我不太清楚如何做到这一点。

我的第一个想法是:每个用户都会向自己的user_id频道发布心跳。然后他的所有朋友都会动态订阅他的频道,以便知道他是否在线。问题是:用户可能拥有无限数量的朋友。我不认为循环通过用户的朋友列表,然后为他的每个朋友生成单个client.subscribe(friend_id)是最好的架构。

我所描述的实现方式如下:

用户1

function heartbeat() { 
    client.publish('user_1', {"heart" : "beat" }); 
    setTimeout(heartbeat, 10000);
}

用户1的朋友

for(var i = 0; i < arrayWithFriendsIds.length; i++){
 client.subscribe('user_' + arrayWithFriendsIds[i], function(message){
     //Update user friends list here
  });
}

我的第二个想法是:每当用户连接时,它会将心跳中的user_id发布到全局“onlineUsers”频道。网站中的每个人都订阅了该频道。每当有新的user_id到达时,我们都可以验证该ID是否在记录的用户朋友的ID列表中(在PHP服务器端)。

代码如下: 用户1

function heartbeat() { 
    client.publish('onlineUsers', {"user_id" : 1 }); 
    setTimeout(heartbeat, 10000);
}

其他人

client.subscribe('onlineUsers', function(message){
     //userFriends.php has a session/array with the list of all the logged user's friends ids
     $.post('/userFriends.php', {userId : message.user_id}, function(data, success) { 
           if(data === 'ok'){
                //update user friend's list here
           }
     });
  });

这种方法的坏处是,每次有人向'onlineUsers'频道发布内容时,我们都需要发出HTTP请求(这是使用pub / sub的全部要点)。

基于第二个想法的第三个想法是在客户端中存储朋友的id列表(在隐藏的输入中或其他内容中)。这样,我们可以跳过ajax调用并处理客户端中的所有内容。我不认为这第三个想法非常“安全”,因为我们会将用户的朋友ID暴露给客户。

你们对如何为这个问题创建一个好的架构有什么建议吗?提前谢谢!

0 个答案:

没有答案