我被要求创建一个消息处理系统,如下所示。由于我不确定这是否适合发布,请随意将其移至任何其他适当的SC组。
问题
服务器每时每刻都有大约100到500个客户端连接。当客户端连接到服务器时,服务器会加载部分数据并将其缓存在内存中以便更快地访问。对于所有客户端,服务器将每秒接收200到1000条消息。这些消息相对较小(约500字节)。对缓存中数据的任何更改都应尽快保存到磁盘。当客户端断开连接时,所有数据都会保存到磁盘并从缓存中删除。每条消息都包含一些指令和一条文本消息,将其保存为文件。应尽快执行指令(即时),并且使用该文件的所有客户端都应获得更新。仅将修改后的消息写入磁盘可能会延迟。
这是我在图表中的解决方案
我的解决方案包括一个Web服务器(http或socket),一个消息队列以及两个或多个文件服务器和指令服务器实例。
关注:
我的解决方案
我正在考虑将node.js用于socket / web服务器。并且可以是文件服务器的NoSQL数据库和诸如rabbitMQ或Node_Redis和Redis的队列服务器。
问题:
答案 0 :(得分:1)
这里有几个漏洞,主要是围绕网络服务器"推送"消息回到客户端。这在基于网络的世界中并不真正起作用。您可以尝试使用websockets,但通常,这最终会基于轮询。
我不知道"指令"要执行,但保存1000 500字节的消息是微不足道的。许多NoSQL解决方案拥有每秒百万+写入容量。特别是如果你让磁盘延迟使用。
不要为了返回文件而烦恼。一个好的NoSQL解决方案可以更好地扩展。构建一个Cassandra集群,对其进行负载测试,直到它能够处理您的峰值负载。
这将您的体系结构简化为一个或多个Web服务器,客户端轮询该服务器以进行文件更新,一个队列用于提交"消息"到"指令服务器" (也称为Web开发人员术语中的应用程序服务器),以及用于将文件写入的指令服务器的无sql数据库。
这使得扩展变得容易,您可以随时添加更多Web服务器,并且对于您的no-sql服务器具有适当的簇大小,您也应该在那里水平扩展。你唯一真正的瓶颈是你的指令服务器队列,你可以随时抛出更多的指令服务器。