我目前正在寻找一个好的中间件来构建监控和维护系统的解决方案。我们的任务是监控、收集和维护由多达 10,000 个独立节点组成的分布式系统。
该系统集群成 5-20 个节点的组。每个组通过处理传入的传感器数据来生成数据(作为一个团队)。每个组都有一个专用节点(蓝色框)作为组的外观/代理,将组中的数据和状态暴露给外界。这些集群在地理上是分开的,并且可以通过不同的网络连接到外部世界(一个可能通过光纤运行,另一个通过 3G/卫星)。我们很可能会经历更短(秒/分钟)和更长(小时)的中断。数据由每个集群在本地持久化。
这些数据需要由外部和集中式服务器(绿色框)收集(持续且可靠),以供各种客户端(橙色框)进一步处理、分析和查看。此外,我们需要通过每个组代理节点监控所有节点的状态。不需要直接监视每个节点,即使中间件可以支持它会很好(处理来自约 10,000 个节点的心跳/状态消息)。在代理失败的情况下,可以使用其他方法来查明单个节点。
此外,我们需要能够与每个节点交互以调整设置等,但这似乎更容易解决,因为这主要是在需要时手动处理每个节点。可能需要进行一些批量调整,但总而言之,它看起来像是标准的 RPC 情况(Web 服务或类似情况)。当然,如果中间件也可以通过一些请求/响应机制来处理这个问题,那将是一个加分项。
要求:
- 1000+ 节点发布/提供连续数据
- 数据需要可靠(以某种方式)并持续收集到一台或多台服务器。这很可能建立在中间件之上,使用某种明确的请求/响应来请求丢失的数据。如果这可以由中间件自动处理,这当然是一个加号。
- 多个服务器/订阅者需要能够连接到同一个数据生产者/发布者并接收相同的数据
- 数据速率最大为每组每秒 10-20 次
- 消息大小范围从大约 100 字节到 4-5 KB
- 节点范围从嵌入式受限系统到普通 COTS Linux/Windows 机器
- 节点一般使用C/C++,服务器和客户端一般使用C++/C#
- 节点应该(最好)不需要安装额外的软件或服务器,即每个节点一个专用的代理或额外的服务是昂贵的
- 安全性将基于消息,即不需要传输安全性
我们正在寻找一种解决方案,它可以处理主要代理节点(蓝色)和服务器(绿色)之间的通信,用于数据发布/轮询/下载,以及从客户端(橙色)到单个节点(RPC 样式)以调整设置。
对于相反的情况,似乎有很多讨论和建议;将数据从服务器分发到许多客户端,但很难找到与所描述情况相关的信息。一般的解决方案似乎是使用 SNMP、Nagios、Ganglia 等来监控和修改大量节点,但对我们来说棘手的部分是数据收集。
我们简要介绍了 DDS、ZeroMQ、RabbitMQ(所有节点都需要代理?)、SNMP、各种监控工具、Web 服务(JSON-RPC、REST/协议缓冲区)等解决方案。
那么,对于一个易于使用、健壮、稳定、轻量级、跨平台、跨语言的中间件(或其他)解决方案,您有什么建议吗?尽可能简单但不简单。