我正在尝试用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暴露给客户。
你们对如何为这个问题创建一个好的架构有什么建议吗?提前谢谢!