2

我正在 node.js+mongo db 中计划一个 TCP 聊天服务器。这是我对架构的想法 -

  • 在 mongo db "online_users" 中创建一个集合,该集合将包含所有在线用户,一旦用户下线,我将从该集合中删除这些用户。
  • 创建一个集合“房间”..在这个集合中我打算存储房间名称(由房间中的用户名 csv 组成)和这个房间的参与者..
  • 用于存储用户聊天记录的历史记录集合。

现在我正在考虑在“房间”集合中的数据库中存储套接字连接,但我不确定是否应该这样做或将套接字连接存储在数组中?

这是我在想的数据库流程-

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

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

任何帮助我都会非常感激!

更新 1:我也不确定我是否可以将套接字对象存储在数据库中 :( .. 序列化可能有效?也让我知道这方面的想法。

4

1 回答 1

1

从 PHP 到 Node.JS,必须重新思考做事的方式,尤其是网络。

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

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

由于聊天是实时应用时间(虽然不是游戏),所以没有必要将所有内容都存储在数据库中,实际上大多数东西都不应该在数据库中,因为它会成为瓶颈
您可以轻松地创建房间数组(或带有 key==id、value==room 的对象),每个房间都有自己的用户列表,并将涵盖里面的所有逻辑。

这一切都可以在 node.js 中完成,根本不需要数据库。这使它更高效,但可扩展性稍差,但可扩展性是完全不同的主题,必须以不同的方式讨论。

将逻辑拆分为对象,抽象思考。Room - 是独立的事物,与用户以及消息一样,但它们都是相关的。
在 javascript 中使用OOP - 这将有很大帮助。

你的客户端应用程序是什么?我建议使用浏览器作为客户端,使用socket.io作为通信层。这是制作此类应用程序的非常有效、可扩展且简单的方法。
特别是对于学习节点及其权力。

套接字 - 是与操作系统相关的进程,节点只有指向它们的指针和额外的层,以便开发人员使用。您对它们的想法很好,完全是“错误的”,并且考虑在数据库中“存储”套接字表明您非常缺乏您提到的经验。事实上,没有办法将 OS IO 的东西存储在数据库或类似的东西中,而且根本不需要。试着从简单的事情开始,比如 socket.io,随着时间的推移而进步。不要将事物与 PHP(例如)进行比较,因为它会大大降低您的速度。

于 2013-09-17T13:58:34.543 回答