在node.js中的TCP聊天服务器架构…将数据库或内存中的套接字保存?

我正在计划在node.js + mongo数据库的TCP聊天服务器..这是我正在考虑的架构 –

  • 在mongo数据库中创build一个集合“online_users”这个集合将拥有所有的在线用户,一旦用户下线,我将从这个集合中删除这些用户。
  • 创build一个集合“房间”..在这个集合我打算存储房间名称(包括在房间里的用户名csv)和参与者在这个房间..
  • 用于存储用户的聊天历史的历史集合。

现在我正在考虑在“房间”集合中的数据库存储套接字连接,但我不知道如果我应该这样做,或在arrays中存储套接字连接?

这里是我正在思考的数据库的stream程 –

如果用户A开始与B和C聊天,那么我将创build一个新的房间“A,B,C”。 我将发送这个房间名称给客户端,聊天客户端在发送新的聊天消息时必须通过这个房间名称。 当用户在聊天中发送消息时,我将检查他们在哪个房间,并从数据库获取每个人的套接字连接,并将该消息广播给B和C.

请注意,我是node.js和聊天服务器的新手,所以我对这个体系结构有任何build议。 另外,如果你有TCP聊天服务器架构/聊天服务器数据库架构的任何链接..那么请分享您的意见/答案。

任何帮助,我非常感谢!

更新1:另外我不知道如果我可以在数据库中存储套接字对象:( ..序列化可能工作吗?让我知道这个想法。

来自Node.JS,可以说PHP,必须引入重新思考事情的方式,特别是networking。

单个进程中 ,节点上的巨大优势,以及共享内存在一个进程中发生的一切。 它不是限制/closures连接/请求在PHP中的每个请求。 但只是来自它们的事件和数据,无论它们来自数据库,http还是tcp套接字以及其他IO。

考虑到这一点,不需要额外的数据交换应用/层,因为它可以在node.js中直接交换。

由于聊天是实时的应用程序时间(而不是像游戏一样),所以将所有内容都存储在数据库中不必要的 ,事实上大部分事情都不应该在数据库中,因为这会成为瓶颈
你可以很容易地创build一个房间的数组(或者是具有key == id,value == room的对象),每个房间都有自己的用户列表,并且会覆盖里面的所有逻辑。

这一切都可以在node.js中完成,根本不需要数据库。 这使得效率更高,但是可扩展性稍差,但是可伸缩性无论如何都是完全不同的主题,必须有不同的讨论。

将逻辑拆分成对象,认为抽象。 房间 – 是独立的东西,以及用户,以及消息,但他们都是相关的。
在javascript中使用OOP – 这将有很大的帮助。

你的客户端应用程序是什么? 我build议使用浏览器作为客户端,而socket.io作为通信层。 这是制作这种应用程序的高效,可扩展和简单的方法。
特别是对于学习节点及其权力。

套接字 – 与操作系统相关的进程,节点只有指向它们的指针和额外的层,以方便开发人员的使用。 你对他们的想法是好的,完全是“错误的”,考虑到在数据库中“存储”套接字显示了你提到的巨大的缺乏经验。 事实上,没有办法将OS IO的东西存储在数据库中,或者根本不需要。 只要尝试从简单的东西,如socket.io开始,并随着时间的推移。 不要用PHP(比如说)比较一下,因为它会让你的速度变慢。