Wangwj/scttscValenwon/cnoug14/march/2008 Java RMI (Remote Method Invocation 远程方法调用),它运行虚拟机之间的互相的对象调用,这样就提供分布式计算的基本能力。RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。RMI是sun在jdk1.1起就开始提供,但是随着分布式运算的发展,RMI并没有成为主流,而是被诸如CORBAL等方案所替代。 我突然对RMI产生了兴趣,还得源于一个项目。某系统,在一期建设的时候,CORE设计是基于WLS的,在多台服务器上部署10个node,而计算能力是分布在这个10个node上。后来,进入项目2期,由于一些不得以的原因,我把CORE的代码完全由EJB改写为纯的Java代码。这样,对比1、2期,1期的并行计算/均衡负载有WLS实现,2期仅仅设计了线程池来并发计算,无法做到横向的均衡负载,也无法避免单点宕机的风险。但2期也有一定优点,首先就是速度快,服务器首先是多路并发的,线程池的使用可以充分发挥其威力,比1期速度提高50%以上,毕竟它是直接运行在virtual machine上的。第二就是维护简单,基本上维护人员只需要检查进程和console日志。但最近系统的业务范围面临扩大,我不得不面对一个事实,它的处理能力无法继续扩展,除非换硬件。所以,我必须为它设计一套“网格”计算的纯java实现方案(节约了millions 的采购中间件成本哦J)。 基本需求:1. 实现多台服务器之间的均衡负载2. 实现多台服务器之间的并行计算和数据同步3. 防止单点宕机初步设想,我决定用RMI实现一个Coordinator,实现工作任务获取和分发工作,原Core模块直接和它通信,获得任务信息。该Coordinator在每台服务器会存在一个instance,主Coordinator出于工作状态,备用则出于休眠状态,一旦主instance crash,standby 能够自动接替工作。Coordinator的任务分配机制则处理了任务的同步和并发,主Coordinator每次构建任务清单的时候,会复制一个副本到standby Coordinator,这样可以避免main node crash导致丢失系统状态。这样,系统构建发生如下变化(假设用3台服务器做集群):状态1:三台机器分别部署Coordinator A B C,和三套Core,Core A B C都和Coordinator A 通信,进而获得工作清单,Coordinator B C 出于休眠状态。 状态2:Server A Crash,Core A停止工作,Coordinator A发现Core A的任务执行超时后,转移给Core B。 状态3:Coordinator A Crash,Core ABC停止工作,Coordinator A发现Core A的任务执行超时后,转移给Core B。Core ABC发现Coordinator A无响应后,根据配置文件,自动寻找Coordinator B,并激活它。 状态4:Server A 突然Crash。激活并启动Coordinator B,转移Core A的任务。 Coordinator要能够实现上述基本状态的转换。 未完待续,下一节,细述协调人框架的设计构想。
一共有 0 条评论