分布式计算最基本的目的之一就是为了充分利用空闲的计算节点的计算能力。通常,我们首先会将要被分布式计算的程序在每个计算节点部署好,然后才可以调用分布式计算。这种“部署”是一种静态的。之所以称为静态的,是因为还有一种更动态更灵活的方式 -- 我们可以随时的、动态的将我们新完成的程序自动【提交】到已经部署好的分布式框架里动态运行起来。比如,假设我刚写了一个新的排序的算法程序(假设程序集为X.dll),然后我要对现有的10000000个数据进行排序,但是,我的机器配置太差,运行不了如此大的计算任务,那么我就可以将X.dll和要排序的数据传递给部署在其它地方的动态分布式计算框架实例,动态分布式计算框架会调用X.dll中的排序算法来对数据进行排序,并返回结果。这就是“动态”的含义。我写DCFramework(Dynamic Distributed Computing Framework)这个框架的主要目标是达到这样的一个效果。不知道这种分布式计算架构和“云计算”是否有点关系?
如果是使用C或C++来实现这样的动态效果,应该不是一件简单的事情,但是强大的.Net平台使得实现这一目标称为可能,并且不是那么难。
我将平台选定在.NET,这可以使很多功能更加容易实现,也使得很多问题得到简化。DCFramework的主要特性如下:
(1)基于.NET平台。这有两种含义:DCFramework是用.NET(2.0)实现的;也只有基于.NET的程序才可以使用DCFramework支撑的动态分布式计算架构。
(2)DCFramework 使用DCTask表示动态分布式计算任务。
(3)分布式计算节点可以动态的增加、删除。所谓计算节点就是用于真正执行分布式计算任务的节点,在DCFramework中称为DC Worker Node。
(4)在DCFramework架构中有一个特殊的节点叫DC Master Node,它的作用在于统一管理所有的DC Worker Node,并将新的分布式计算任务分配给当前负载最低的那个DC Worker Node。
(5)DCFramework使用Remoting技术解决DC Worker Node和DC Master Node,以及DC Master Node和Client(需要动态分布式计算的客户端)之间的通信。
(6)DCFramework使用反射技术来动态加载程序集和调用计算方法。
(7)DCFramework使用DCAppDomain(对.NET AppDomain的封装)来构建执行分布式任务的独立环境。即每个分布式计算任务最终在一个独立的DCAppDomain种执行。
(8)DCFramework使用序列化技术来传递被调用的对象。
关于DCFramework中节点部署的简单图示如下:
现在,我们假设某个Client A有个计算任务要提交给DCFramework执行,让我们来看看这个过程是怎样进行的。
Client A 将计算的逻辑封装在MyClass类中,其位于X.dll程序集中,而X.dll有依赖于Y.dll,Y.dll又依赖于Z.dll,而X.dll、Y.dll、Z.dll都是用户自定义的程序集。如果是在Client A本地执行计算任务,是这样做的:
下面的代码将会在DCFramework架构的某个DC Worker Node上执行MyClass.DoSomething()方法。
分布式计算执行的过程简述如下:
(1)DCJobDispatcher 会自动Remoting连接到DC Master Node。
(2)DCJobDispatcher 将分布式计算任务封装为一个DCTask,DCTask实例中会包含X.dll、Y.dll、Z.dll程序集对应的文件数据。
(3)DCJobDispatcher 将DCTask提交给DC Master ,DC Master 会将其交与DC Worker Node中负载最小的那个节点(假设为Worker A)执行。
(4)Worker A会为新任务创建一个单独的DCAppDomain,然后加载传递过来的DCTask中的X.dll、Y.dll、Z.dll,接着就可以反序列化MyClass对象,最后通过反射调用其DoSomething方法,以开始执行计算任务。
(5)计算完成后,Worker A会卸载对应的DCAppDomain,并将计算结果返回。
上述就是DCFramework执行动态分布式任务的一个简单介绍,更详细的部分会在后续的文章中介绍。
欢迎讨论,谢谢。
目录:
DCFramework 动态分布式计算框架(01)-- 基础结构
下载:
1.DCFramework的完整Demo源码:DCFrameworkDemo