gpt4 book ai didi

node.js - 消息处理系统的设计

转载 作者:可可西里 更新时间:2023-11-01 11:21:24 25 4
gpt4 key购买 nike

有人要求我创建一个消息处理系统,如下所示。由于我不确定这里是否适合发帖,请随时将其移至任何其他合适的 SC 组。

问题

服务器每时每刻大约有 100 到 500 个客户端连接。当客户端连接到服务器时,服务器加载部分数据并将其缓存在内存中以便更快地访问。服务器每秒将为所有客户端接收 200~1000 条消息。这些消息相对较小(大约 500 字节)。缓存中数据的任何更改都应尽快保存到磁盘。当客户端断开连接时,他们的所有数据都会保存到磁盘并从缓存中删除。每条消息都包含一些说明和一条将保存为文件的文本消息。指令应该尽可能快地执行(接近即时)并且所有使用该文件的客户端都应该得到更新。只能延迟将修改后的消息写入磁盘。

这是我的解决方案的图表

Architecture

我的解决方案包括一个网络服务器(http 或套接字)、一个消息队列以及两个或多个文件服务器和指令服务器实例。

  • Web 服务器抓取客户端消息,如果消息队列中有客户端可用的消息,则将其推送回客户端。
  • 指令处理器从队列中获取指令并创建必要的消息以供文件服务器处理(获取/设置文件)并等待文件在队列中可用,更多进程为客户端创建另一条消息。
  • 文件服务器仅提供来自缓存或物理文件的文件,具体取决于文件类型。

疑虑:

  • 在高峰时段,连接的客户端总数可能会立即超过 10000 个,并且从客户端收到的消息总数会增加到 10~15K。我应该能够尽快清除队列并返回正常状态(显然是处理请求)。
  • 我应该能够即时添加额外的指令处理器和文件服务器,而无需关闭其他实例。
  • 万一文件服务器崩溃,它不应该丢失文件,因此它必须在有任何更改且处理时间可用时立即将文件写入磁盘。
  • 文件系统应采用 b+ 树格式,以便某些应用程序(本地报告应用程序)无需通过队列服务器即可轻松访问文件

我的解决方案

我正在考虑将 node.js 用于套接字/网络服务器。并且可能是用于文件服务器和队列服务器的 NoSQL 数据库,例如 rabbitMQ 或 Node_Redis 和 Redis。

问题:

  • 有没有更好的方法来构建这个系统?
  • 我对该系统的组件有哪些其他选择?
  • 是否可以在同一台服务器机器或什至在同一应用程序(在不同线程)中运行所有实例?

最佳答案

这里有几个漏洞,主要是围绕 Web 服务器将消息“推送”回客户端。这在基于网络的世界中并没有真正起作用。您可以尝试使用 websockets,但通常,这最终会基于轮询。

我不知道要执行的“指令”是什么,但是保存 1000 条 500 字节的消息是微不足道的。许多 NoSQL 解决方案都拥有每秒百万以上的写入能力。特别是如果你让提交到磁盘滞后。

不必为返回文件而排队。一个好的 NoSQL 解决方案会更好地扩展。构建一个 Cassandra 集群,对其进行负载测试,直到它可以处理您的峰值负载。

这将您的架构简化为 1 个或多个网络服务器,客户端轮询该服务器以获取文件更新,用于将“消息”提交到“指令服务器”(在网络开发人员术语中也称为应用程序服务器)的队列,以及用于指令服务器写入文件的非 SQL 数据库。

这使得扩展变得容易,你总是可以添加更多的网络服务器,并且你的 no-sql 服务器有一个合适的集群大小,你也应该在那里水平扩展。您唯一真正的瓶颈是您的指令服务器队列,您总是可以向其转换更多指令服务器。

关于node.js - 消息处理系统的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29671810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com