设计消息处理系统

时间:2015-04-16 10:20:38

标签: node.js architecture redis message-queue

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

问题

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

这是我在图表中的解决方案

Architecture

我的解决方案包括一个Web服务器(http或socket),一个消息队列以及两个或多个文件服务器和指令服务器实例。

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

关注:

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

我的解决方案

我正在考虑将node.js用于socket / web服务器。并且可以是文件服务器的NoSQL数据库和诸如rabbitMQ或Node_Redis和Redis的队列服务器。

问题:

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

1 个答案:

答案 0 :(得分:1)

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

我不知道"指令"要执行,但保存1000 500字节的消息是微不足道的。许多NoSQL解决方案拥有每秒百万+写入容量。特别是如果你让磁盘延迟使用。

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

这将您的体系结构简化为一个或多个Web服务器,客户端轮询该服务器以进行文件更新,一个队列用于提交"消息"到"指令服务器" (也称为Web开发人员术语中的应用程序服务器),以及用于将文件写入的指令服务器的无sql数据库。

这使得扩展变得容易,您可以随时添加更多Web服务器,并且对于您的no-sql服务器具有适当的簇大小,您也应该在那里水平扩展。你唯一真正的瓶颈是你的指令服务器队列,你可以随时抛出更多的指令服务器。