日志文章

2008年03月14日 16:50:27

利用RMI来实现java应用程序集群构想

Wangwj/scttsc
Valenwon/cnoug
14/march/2008


Java RMI Remote Method Invocation 远程方法调用),它运行虚拟机之间的互相的对象调用,这样就提供分布式计算的基本能力。RMI目前使用Java远程消息交换协议JRMPJava Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。RMIsunjdk1.1起就开始提供,但是随着分布式运算的发展,RMI并没有成为主流,而是被诸如CORBAL等方案所替代。

我突然对RMI产生了兴趣,还得源于一个项目。某系统,在一期建设的时候,CORE设计是基于WLS的,在多台服务器上部署10node,而计算能力是分布在这个10node上。后来,进入项目2期,由于一些不得以的原因,我把CORE的代码完全由EJB改写为纯的Java代码。这样,对比12期,1期的并行计算/均衡负载有WLS实现,2期仅仅设计了线程池来并发计算,无法做到横向的均衡负载,也无法避免单点宕机的风险。

2期也有一定优点,首先就是速度快,服务器首先是多路并发的,线程池的使用可以充分发挥其威力,比1期速度提高50%以上,毕竟它是直接运行在virtual machine上的。第二就是维护简单,基本上维护人员只需要检查进程和console日志。但最近系统的业务范围面临扩大,我不得不面对一个事实,它的处理能力无法继续扩展,除非换硬件。所以,我必须为它设计一套“网格”计算的纯java实现方案(节约了millions 的采购中间件成本哦J)。

基本需求:

1.     实现多台服务器之间的均衡负载

2.     实现多台服务器之间的并行计算和数据同步

3.     防止单点宕机

初步设想,我决定用RMI实现一个Coordinator,实现工作任务获取和分发工作,原Core模块直接和它通信,获得任务信息。该Coordinator在每台服务器会存在一个instance,主Coordinator出于工作状态,备用则出于休眠状态,一旦主instance crashstandby 能够自动接替工作。Coordinator的任务分配机制则处理了任务的同步和并发,主Coordinator每次构建任务清单的时候,会复制一个副本到standby Coordinator,这样可以避免main node crash导致丢失系统状态。这样,系统构建发生如下变化(假设用3台服务器做集群):

状态1:三台机器分别部署Coordinator A B C,和三套CoreCore A B C都和Coordinator A 通信,进而获得工作清单,Coordinator B C 出于休眠状态。





状态2Server A CrashCore A停止工作,Coordinator A发现Core A的任务执行超时后,转移给Core B




状态3Coordinator A CrashCore ABC停止工作,Coordinator A发现Core A的任务执行超时后,转移给Core BCore ABC发现Coordinator A无响应后,根据配置文件,自动寻找Coordinator B,并激活它。




状态4Server A 突然Crash。激活并启动Coordinator B,转移Core A的任务。





Coordinator要能够实现上述基本状态的转换。
未完待续,下一节,细述协调人框架的设计构想。

Tags: rmi   集群  

类别: JAVA ee |  评论(0) |  浏览(4219) |  收藏
发表评论
看不清楚,换一张