分布式计算实践(C#)-1

时间:2022-01-29 03:31:02

为什么要采用分布式计算?简单的来讲就两个原因:一是单台计算机计算能力有限,即在一个限定的时间内要完成某个计算任务,一台机器的计算能力不够,需要用多台计算机来完成;二是有些需要计算处理的对象天然就是分布的,要完成这些计算,就必须在这些对象分布点上进行,比如多台计算机的管理。当然,我这里所讲的分布更多的是逻辑上的,一个分布点就是一个计算节点,至于这些节点在物理上是否分布在多台计算机上,不是考虑的关键点。

我们首先来看看分布式计算的几个要点,我们知道,如果把一件任务交给多个节点去处理,包括以下基本的流程步骤:
1)任务创建:一般由外部系统创建,提交给系统执行;
2)任务分配:包括任务分析,分解和分配;
3)任务执行:有执行者执行具体的任务;
4)过程管理:包括任务执行过程中的进度反馈,异常处理等;
5)结果汇集:需要把执行人的任务执行结果进行收集汇总;
6)结果反馈:将任务最重的执行结果反馈给任务提交人,任务结束;

上面是任务执行比较正常的情况,实际的分布式计算因为要考虑到容错等异常因素,实际上要复杂很多。在这里我们只是体验一下分布式计算,就没必要弄这么复杂。

从上面的分布式流程步骤,我们可以得到几个基本的角色:
1)管理者:负责接收任务,分配任务,结果汇集和结果反馈,是任务执行的指挥和协调者(hadoop中的Master角色),当然,这个角色还可以根据更具体的职责进行细分;
2)执行者:负责具体的任务执行,包括任务接收,执行和结果反馈,是任务的具体执行者(hadoop中的Slave角色);
3)通信使者:负责管理者,执行者之间的任务资源和信息的传递.
4)环境:包括任务执行的软硬件设施。
通过对流程步骤和基本角色的进一步分析,我们可以得出分布式计算的基本功能:
1)节点管理:对节点的增加,删除和状态进行管理,这是基本的功能,当然,采用不同的方式,管理方法会不一样,比如对等方式和Master/Slave方式等;心跳服务是最基本的.
2)任务管理:包括对任务的接收,预处理,切割和分配,结果汇集和反馈等;
3)过程监控:任务分配出去后,需要对任务的执行过程和结果进行监控;
4)执行管理:对于任务的执行本身进行管理,包括执行预处理,执行过程监控和结果反馈,现场清理等.
5)安全管理:这个是必须的,这个包括执行权限和执行过程的控制.当然,由于这里主要是体验一下分布式计算,权限的控制没有涉及.但C#的应用程序域概念,对于执行过程的内存越界安全提供了基本的保证,还是比较方便的.

其实分布式计算的任何一个细节,如果要做得够好,都非很复杂,比如采用M/S方式,就M的选举一项(领导者选举),就可以整一个算法集.而执行结果的判定,就更复杂了,投票制之类的都可以弄进去.但就我的观点来看,我觉得很多东西其实有过度设计之嫌,有的时候甚至为了1%的可能性,投入了80%成本。比如对于查询很分析任务,其实完全没必要做什么结果判定投票制之类的,错了,再执行一次嘛。搞个很复杂的机制出来,其实99%的时间都碰不到。

我做的分布式计算模型比较简单:采用对等方式,任务分割交给外部请求自己完成(其实这非常适合做分布式部属和计算机管理,比如你要获取某个计算接点所在机器的硬盘号,你只要写一段获取硬盘号的代码,去目标节点上执行就可以,360大流氓客户端估计就是这么干的),任务代码可以使CS源码或者DLL文件,计算节点Host程序中的任务管理器根据接到的任务和路由信息(节点分配)进行路由,目标节点任务管理器接到任务代码后,新建一个应用程序域,执行任务代码,这样至少建立了任务级的隔离,而且执行完可以销毁。

码文字很累,下一篇上代码。