node.js…;在数据库或内存中保存套接字?

node.js…;在数据库或内存中保存套接字?,node.js,mongodb,sockets,tcp,chat,Node.js,Mongodb,Sockets,Tcp,Chat,我正在node.js+mongodb中计划一个TCP聊天服务器。。以下是我对建筑的想法- 在mongo db“online_users”中创建一个集合此集合将包含所有联机用户,一旦用户脱机,我将从此集合中删除这些用户 创建一个“房间”集合。。在本系列中,我计划存储房间名称(包括房间中用户名的csv)和房间中的参与者 用于存储用户聊天历史记录的历史记录集合 现在我正在考虑在“rooms”集合中的数据库中存储套接字连接,但我不确定是应该这样做,还是应该在阵列中存储套接字连接 以下是我所想的数据库

我正在node.js+mongodb中计划一个TCP聊天服务器。。以下是我对建筑的想法-

  • 在mongo db“online_users”中创建一个集合此集合将包含所有联机用户,一旦用户脱机,我将从此集合中删除这些用户
  • 创建一个“房间”集合。。在本系列中,我计划存储房间名称(包括房间中用户名的csv)和房间中的参与者
  • 用于存储用户聊天历史记录的历史记录集合
现在我正在考虑在“rooms”集合中的数据库中存储套接字连接,但我不确定是应该这样做,还是应该在阵列中存储套接字连接

以下是我所想的数据库流程-

如果用户A开始与B和C聊天,那么我将创建一个新的房间“A,B,C”。我会将此房间名发送给客户端,聊天客户端在发送新的聊天MSG时必须传递此房间名。当用户a在聊天中发送消息时,我将检查他们在哪个房间,并从数据库获取每个人的套接字连接,然后将消息广播给B和C

请注意,我是node.js和聊天服务器的新手,因此我愿意接受任何有关架构的建议。另外,如果您有TCP聊天服务器体系结构/聊天服务器数据库体系结构的链接。。那么请在你的评论/答案中分享

任何帮助我都将不胜感激


更新1:另外,我不确定是否可以在数据库中存储套接字对象:(…序列化可能会起作用?让我知道这方面的想法。

从(比如说PHP)进入Node.JS时,必须对事情的处理方式进行反思,这尤其包括网络

节点的巨大优势在于,它是一个进程,所有事情都发生在一个进程中,并具有共享内存。对于每个请求,它不像PHP那样受到限制/关闭连接/请求。而只是来自它们的事件和数据,无论它们来自数据库、http或tcp套接字以及其他IOs

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

由于聊天是实时的(而不是游戏),所以不必将所有内容都存储在数据库中,事实上大部分内容都不应该存储在数据库中,因为这会成为瓶颈 您可以轻松地创建房间数组(或key==id,value==room的对象),每个房间都有自己的用户列表,并覆盖其中的所有逻辑

这一切都可以在node.js中完成,而不需要任何数据库。这使其效率更高,但可伸缩性稍差,但无论如何,可伸缩性是完全不同的主题,必须以不同的方式进行讨论

将逻辑拆分为对象,想想抽象。房间是独立的东西,用户和消息也是独立的,但它们都是相关的。
在javascript中使用OOP——这将非常有帮助

什么是客户端应用程序?我建议使用浏览器作为客户端和通信层。这是制作此类应用程序的非常有效、可扩展且简单的方法。
特别是学习节点和它的力量


Sockets是与操作系统相关的进程,node只有指向它们的指针和额外的层,以便于开发人员使用。您对它们的想法是完全“错误”的,考虑在数据库中“存储”Sockets显示出您所提到的巨大的经验不足。事实上,没有办法在数据库中存储操作系统IO内容,或者某种程度上,一个一点也不需要。只要试着从简单的事情开始,比如socket.io,并随着时间的推移而进步。不要将事情与PHP进行比较(例如)因为这会让你慢很多。

谢谢你的回答!有两件事-首先-如果我将所有东西都放在node.js中,没有数据库,如果它重新启动或服务器重新启动会发生什么?我会失去所有套接字连接,对吗?第二-我不认为我可以用socket.io创建TCP服务器,或者我们可以吗?我的客户端应用程序将在iPhone上,一个droid、BB和WP8。我不认为我可以在这些平台上使用WebSocket。另外,如果你知道关于使用node.js构建多房间聊天服务器的任何链接或学习资料,请分享。我将不胜感激。我没有看到任何特别的内容。事实上,这很容易做到,你只需要了解node.js和sock的概念我建议不要在socket.io中使用默认的文件室,而是制作自己的文件。加入、离开、发布和其他方法到文件室。文件室-只是其中的用户/套接字列表。