讨论:使用node.js / socket.io实现聊天室的最佳方法是什么?

5
我并不是在谈论一般的聊天应用程序,而是具体地谈论聊天室实现。
因此,在node.js/socket.io中,我想到了两种方法:
1. 为每个聊天室创建一个数组,向该数组中的所有用户广播消息。 2. 向所有用户广播所有消息,在客户端计算机上判断是否属于聊天室,如果是,则接受消息。
第一种方法的缺点在于,随着你的扩展,你会用数组对象淹没服务器内存,我在我的主机上只使用了大约80mb。
第二种方法的缺点在于,向所有人广播消息最终会造成成本,并且淹没客户机将使他们不满意。
我相信有更好的方法来实现聊天室,所以我想请你们帮助我。我寻求首先在服务器端的性能,然后在客户端,它必须是可伸缩的。

有了80MB,你可以创建很多聊天室。你的数组只需要保存用户的ID。你进行过任何内存消耗测试吗? - user123444555621
我们制作了一个功能齐全的多房间聊天室。它是开源的,随意查看。 - Raynos
1
@Raynos,我看了你的实现,每个房间仍然存储在服务器的内存中,对吧?这与将用户放入内存中的数组没有什么不同。 - Derek
1
@Derek 并不是每个房间都存储在数据库中。但是使用 socket.io,我有一组套接字,可以按房间进行广播,因此我使用方法1。我没有在内存中存储额外的对象,只是存储了指向打开套接字的指针列表。 - Raynos
1
如果每个房间都存储在数据库中,每次广播都需要查询数据库以查看谁在房间里,那么数据库的瓶颈不会非常严重吗?这对于扩展性来说并不是很好,对吗? - Derek
显示剩余3条评论
3个回答

5

Socket.IO 0.7+引入了房间概念。这可能是您正在寻找的东西。

io.sockets.on('connection', function (socket) {
  socket.join('room name');

  // broadcast the message to everybody in the room
  socket.on('chat message', function (data) {
    socket.broadcast.to('room name').emit('chat message', data);
  });

  socket.on('leave room', function (room) {
    socket.leave(room);
  });
});

因此,您不需要管理自己的用户数组以针对特定房间进行操作,socket.io已经内置了这个功能。

不知道,我会查一下他们如何实现socket.join()函数。但首先,socket.io文档在哪里可以找到? - Derek
自述文件: https://github.com/learnboost/socket.io https://github.com/learnboost/socket.io-client该网站: http://socket.io/以及在维基中: https://github.com/learnboost/socket.io/wiki - 3rdEden
我已经准备好了一个使用Socket.IO的房间实现的多房间聊天简单演示,它还带有一个基准测试,可以让您检查其速度有多快。 - Juliusz Gonera

1

我在这里做过类似的事情:

http://davidgranado.com/demos/chat_shuffle/

你可以通过打开多个窗口并与自己聊天来测试它,因为每个实例都被视为一个人(这是我的第一个节点应用程序)。

它的工作原理是每个人都与另一个人配对进行对话。 实际上,每个人都在一个两人房间里。

为了传递消息,我将用户注册为彼此关联,并仅将其发送给一个伙伴聊天者。 这个想法可以轻松地扩展到任意数量的人以关联聊天者。 这样,您就不必向所有人进行浪费广播。


1
假设你有person1、person2和person3,服务器如何知道将消息发送给他们三个人/知道他们在聊天室中而不需要像我的第一种方法那样声明一个数组来将他们分组? - Derek
我觉得此时我的大脑并不像我想象的那样敏锐。本质上是一样的。目前,我没有使用数组,因为只有两个。但是为了扩展这个想法,一个数组对于聊天室来说是知道要广播给谁的完美选择。 - Just a guy

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接