随着信息化建设的发展,许多应用对资源的需求越来越多样化,许多企业内部都购置了多种计算资源,体系结构上可能会有PC机、高性能机、集群,操作系统可能会有Linux、Windows、国产操作系统等,至于其上安装的软件环境更是种类繁多,不胜枚举。
我们需要一个框架能将这些异构资源做整合,对分布在这些异构资源上的应用做统一的调度,譬如a同学开发的一个exe部署在机器1上,b同学开发的一个exe部署在机器2上,c同学开发的一个exe部署在机器3上。在一个项目中,我需要同时用到这三个exe做运算该怎么做呢?目前java已经有基于JMX的解决方案,这里简单带过,我们重点介绍如何基于c++开发一套异构资源管理框架。
JMX是JaVa Mallagemem Extension的缩写,它是suIl公司开发的基于JaVa语言的一套管理规范,定义了一套管理架构和API可以对基于Java编写的程序和资源进行有效管理。该规范致力于解决分布式系统管理的问题,可以用于跨越一系列不同的异构系统平台,开发无缝集成可扩展的系统、服务管理应用。JMX引入了JaVaBean模型用来代表资源的可管理属性。
以上是JMX的简单介绍,那么如何用c++开发出高效的分布式异构资源管理框架呢?参考之前风满楼:使用c++开发分布式框架实践这篇文章,在分布式框架的基础上我们引入agent来处理异构资源管理的问题,整体思路如下:
每台异构计算平台上会安装一个Agent,Agent启动之后,会向注册中心注册自己的服务能力,比如启动该平台的a.exe。消费者从注册中心查询每个Agent所提供的服务,譬如我需要a.exe的能力,那么消费者会调用基于gRPC的远程接口,使该agent启动a.exe运行并得到结果。
Agent是实现系统扩展性和异构管理的关键,它将各种异构计算资源的差异隐藏,以同一方式接受Server管理。Agent可以理解为是一个计算节点,可以提供各种计算能力。一般来说一台主机,只运行一套Agent程序,所以Agent也提供对主机的状态进行管理的能力。agent的设计思路如下:
Agent分为三个部分应用层、插件层、外部exe。其中应用层为Agent的核心,实现包括插件管理、组件管理、运行管理等功能。
外部exe就是由客户所需要的外部的软件组成。Agent主程序通过插件,对其进行控制。
插件层是实现该框架扩展性的关键,通过插件实现对外部exe的调用,因为外部的exe形式各异,调用和集成方式也各不相同,所以用插件的形式可以解耦和方便后续扩展,当后续有新的外部程序需要集成进来的时候,只要写一个插件就可以,不用改动之前的代码。
插件是以动态库方式存在于计算机中,方便Agent灵活调用。并且可以随时对插件进行添加、删除等操作。
应用层是Agent的核心,使用C++语言,基于Boost、Qt等跨平台库进行编写。可根据用户需要运行在Windows、Linux或者其他平台上。
基于以上思路设计的分布式异构资源管理框架,具有高效和扩展性良好的特点,后续唯一需要维护的就是插件的开发,灵活方便。