`
wendong007
  • 浏览: 3069 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于分布式容器的一点想法

阅读更多

      这几天一直在考虑分布式计算的问题,因为之前写过一个IoC框架,所以打算对原来的框架进行扩展,做成一个分布式的容器,该容器的设计目标是:由多个子容器构成一个大的分布式容器,用户不需要知道Bean存在于哪一个容器中,只需知道Bean的ID即可进行调用,对用户来讲,远程容器中的Bean和本地的Bean是没有区别的,容器是非侵入式的,不需要继承任何类或者实现接口。
      最初考虑到比较简单,觉得容器解决的只是容器间的通信问题,我设想的是用户请求远程容器中的Bean时,在本地生成目标接口的一个动态代理,该动态代理通过把参数对象序列化(或者其他方式)后保存在一个调用请求中,然后把调用请求传递给远程容器,远程容器接收到请求后调用容器中的Bean,把返回结果对象序列化后保存在一个调用响应中,然后把调用响应返回给本地容器,由动态代理对象处理后返回。
      真正开始设计之后才发现很多细节问题没有考虑到,比如远程容器中Bean的生存周期(非单例状态的情况下),本地容器中的动态代理对象成为垃圾之后如果保证远程容器中的Bean被回收。我设想的分布式是通过容器间的引用来配置的,比如,容器A引用容器B,那么A可以透明的调用B中的Bean,从简化配置和设计的角度来考虑,如果A引用了B,B又引用了C,应该让A也能够调用C才对,也就是说应该具有传递性,但是很可能存在的情况是容器间存在循环引用,这时如果用户请求了一个不存在的Bean,就会出现死循环的情况。还有容器必须把结果返回给正确的调用者,还有多线程等问题……
      突然想到《非诚勿扰》里的一句台词:老说改进服务质量,怎么改进啊?其实就是细节。

 

分享到:
评论
32 楼 xiaoyu 2009-02-01  
aaa_star 写道
你要做的这些,过去的corba/rmi,现在的sca已经都做了,呵呵,别再重复发明轮子了,如果从学习角度,我觉得更高效的是分析tuscany源码,load, debug, step-step,,



我也觉得奇怪, 为什么有那么的回帖, 但是都没有提到SCA

先看看SCA的规范, 再去看看tuscany

EJB容器本身也是这样的。
31 楼 wendong007 2009-02-01  
<div class="quote_title">regular 写道</div>
<div class="quote_div">顺便说一句,远程的代理,或者也叫做票根(stub)?仅仅是对RMI或者类似技术的使用,能够代表的仅仅是方法。到目前至少我没看到过能够代理成员对象的。比方说<br />
<pre name="code" class="java">class A {
int i;
int getI(){return i;}
void setI(int i) {this.i = i;}
}</pre>
<br /><br />stub仅能访问getI和setI,没有直接能访问i的。所以再模拟,也只是模拟。没有在同一个JVM那样亲近。<br /><br />如果能把成员对象都能通过远程的方法达到同一个JVM里面的效果,我觉得这才是真正的模拟。不过受限制于Java语言,这可能吗?</div>
<p> </p>
<p><span style="font-family: -webkit-monospace; white-space: pre-wrap;">之所以叫代理,就是因为它的返回结果和调用原对象的方法返回结果是一致的,我的想法就是所有跨容器的调用都由容器返回代理对象,当然,这样存在很严重的性能问题,不过反正我也没打算把这东西放到生产环境中,自己写来玩的,没必要太较真</span></p>
30 楼 regular 2009-02-01  
顺便说一句,远程的代理,或者也叫做票根(stub)?仅仅是对RMI或者类似技术的使用,能够代表的仅仅是方法。到目前至少我没看到过能够代理成员对象的。比方说
class A {
int i;
int getI(){return i;}
void setI(int i) {this.i = i;}
}


stub仅能访问getI和setI,没有直接能访问i的。所以再模拟,也只是模拟。没有在同一个JVM那样亲近。

如果能把成员对象都能通过远程的方法达到同一个JVM里面的效果,我觉得这才是真正的模拟。不过受限制于Java语言,这可能吗?
29 楼 pipilu 2009-01-16  
aaa_star 写道
你要做的这些,过去的corba/rmi,现在的sca已经都做了,呵呵,别再重复发明轮子了,如果从学习角度,我觉得更高效的是分析tuscany源码,load, debug, step-step,,


呵呵,同感。我也觉得分析它们的架构和源码学习效果更好,自己做太费时间了,而且很容易在比较低的水平上耗时(实现的过程更多的是重复已有的理解)。
28 楼 sdh5724 2009-01-16  
关于RMI问题, 你可以看看jbossremoting的实现。 他远程CALL实现基本是协议无关的, 也就是, 可以使用你想使用的协议, 关键是你如何设计一个通信工厂来达成你的意愿。 RMI的使用不能称之为入侵, 如果你自己设计一个, 才是最大的入侵方案。 看你如何实现了。
设计一个分布容器并不困难, 困难是高效的协议, 高效的通信机制, 以及容器服务对象的注册查询。

通信上, 如果不想自己设计协议, 我觉得mina+hessina协议是非常好的选择。

类似东西我已经见过实作作品了, 已经在极度高压力下运行。 我甚至看他们能从远程注入bean对象。 非常的方便。
27 楼 aaa_star 2009-01-16  
你要做的这些,过去的corba/rmi,现在的sca已经都做了,呵呵,别再重复发明轮子了,如果从学习角度,我觉得更高效的是分析tuscany源码,load, debug, step-step,,
26 楼 wendong007 2009-01-15  
<div class="quote_title">eyeieye 写道</div>
<div class="quote_div">楼主想法很可爱,但是,网络调用的开销你算到了吗?大规模的细粒度调用在系统间存在的时候,我想你应该准备去买豆腐了。</div>
<p> </p>
<p> </p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px;">      我前面也说了,我根本就没考虑真的拿去应用,所以我考虑的只是实现这些功能,至于效率问题我不是很在意,我只是以学习和研究的态度去写这个东西,我现在读大三,想出去实习,学校却不放人,我在学校里根本接触不到真正的应用,之前我也到过一些小作坊式的公司,但是那里的项目基本上都是SSH,除了熟悉业务,基本学不到什么东西,我很喜欢考虑架构方面的问题,但是因为没有实际的工作经验,我根本不知道我应该研究什么,之前我一直在模仿的阶段,我写过IoC、AOP的容器,也写过类似Hibernate的框架,还有一个通用分表框架,这些东西我写出来自己用的都很少,因为我很清楚它们和Spring、Hibernate比起来肯定有差距,我真正给别人开发的时候还是会选择更成熟的技术</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px;"> </p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px;">      现在这个东西是我第一次自己考虑一个东西出来,不足的地方很多,有些是我欠考虑的,有些我也考虑到了,但是现有的能力解决不了这些问题,大家愿意指教的话我很高兴,至于豆腐的问题,如果哪位好心能给我留点,我拿来做个汤也不错</p>
<p> </p>
25 楼 kaneg 2009-01-13  
eyeieye 写道
楼主想法很可爱,但是,网络调用的开销你算到了吗?大规模的细粒度调用在系统间存在的时候,我想你应该准备去买豆腐了。



不要打击楼主了,不管结果如何,楼主有这样的想法已经很好了。自己做的就算比不上ejb什么的,只要够用就行,何必非要很好很强大呢
24 楼 eyeieye 2009-01-13  
楼主想法很可爱,但是,网络调用的开销你算到了吗?大规模的细粒度调用在系统间存在的时候,我想你应该准备去买豆腐了。
23 楼 pipilu 2009-01-12  
<div class="quote_title">wendong007 写道</div>
<div class="quote_div">
<p><span style="white-space: pre-wrap; font-family: -webkit-monospace;"><span style="font-size: medium;">    其实我写这个东西很大程度上是写着玩的,反正马上放寒假了,在家闲着没什么事,借着这个东西学习下相关的知识<br />    现在重量级的东西我也写不出来,轻量级的东西也根本用不到分布式,就像楼上说的,如果真的考虑到业务逻辑的分布,EJB应该算是最好的选择了,而且真正需要分布式容器的地方也没多少,对于那些高负载的系统选择的应该是负载均衡集群,也不是这种分布式,所以说这个东西真正的应用领域,我自己也不知道,我纯粹是出于研究的目的,发到这里就是相和大家一块讨论一下</span></span></p>
</div>
<p> </p>
<p>是啊,我有疑问的地方也就是这些,所以我想知道应用的场景。</p>
<p>是要解决负载均衡和故障转移?</p>
<p>还是要分布式计算,并行处理?</p>
<p>还是为了系统的整合?</p>
<p>自己出于兴趣实现一个粗略的东东也挺好的,但即使是这种情况,也应该先定义好问题的边界,是吧?</p>
<p>最上面你提出的疑问,我感觉挺好奇,但没想清楚那种机制(多个子容器,容器之间的引用)是为了解决什么应用。</p>
22 楼 eyes2near 2009-01-12  
你这东西本质上就是需要集群而已,去看看 terracotta , 已经是很好的解决方案了。
21 楼 mycmq 2009-01-12  
建议参考下JBOSS的集群实现
20 楼 wendong007 2009-01-12  
<p><span style='font-family: -webkit-monospace; white-space: pre-wrap;'><span style='font-size: medium;'>    其实我写这个东西很大程度上是写着玩的,反正马上放寒假了,在家闲着没什么事,借着这个东西学习下相关的知识
    现在重量级的东西我也写不出来,轻量级的东西也根本用不到分布式,就像楼上说的,如果真的考虑到业务逻辑的分布,EJB应该算是最好的选择了,而且真正需要分布式容器的地方也没多少,对于那些高负载的系统选择的应该是负载均衡集群,也不是这种分布式,所以说这个东西真正的应用领域,我自己也不知道,我纯粹是出于研究的目的,发到这里就是相和大家一块讨论一下</span></span></p>
19 楼 hpq852 2009-01-12  
czx566 写道
hpq852 写道
czx566 写道
hpq852 写道
好吧, 一个难题, 分布式事务如何实现?

Spring中没有相关的实现, 原因是因为99%的业务没有这个需求, 那么即使需要用到了就交给EJB吧, 搞那么复杂干吗?



这个可以用悲观或乐观锁实现~

我觉得如果一定要采用分布式容器


最好用EJB3



我这里指的是业务逻辑的分布, 而不是数据库的分布. 不要搞混了. 而在管理业务逻辑分布方面恐怕是EJB唯一可以拿的出手的东西了.



就一般而言,如果你的业务逻辑都分布了,数据库应该也就分布了吧。
  而悲观锁 和 乐观锁  好像和你在那层实现分布是没有关系的吧,就算你在view层控制,也可以。


谁说业务逻辑分布, 数据库就一定要分布? 另外 乐观锁 悲观锁 和数据库的分布式事务半点关系都占不上.
建议先搞清楚业务逻辑分布, 和数据库分布是怎么回事

看看这个帖吧 http://www.iteye.com/topic/72400
18 楼 pipilu 2009-01-12  
貌似有人要填补Java领域的一项空白?

怎么把分布式事务说的那么轻松??WS-Transaction是对WebService实现的分布式事务的定义,这个有人研究明白了么?我正打算了解一下WS-*相关的知识,苦于能查到的资料太少(cxf和glassfish都有WS-*的实现,但只实现了一部分,而且去读那些源码?目前还没鼓足勇气)

还有,有人能告知一下本软件应用的场景么??比如用于解决什么问题,现有的技术在解决时有什么不足。
17 楼 czx566 2009-01-12  
hpq852 写道
czx566 写道
hpq852 写道
好吧, 一个难题, 分布式事务如何实现?

Spring中没有相关的实现, 原因是因为99%的业务没有这个需求, 那么即使需要用到了就交给EJB吧, 搞那么复杂干吗?



这个可以用悲观或乐观锁实现~

我觉得如果一定要采用分布式容器


最好用EJB3



我这里指的是业务逻辑的分布, 而不是数据库的分布. 不要搞混了. 而在管理业务逻辑分布方面恐怕是EJB唯一可以拿的出手的东西了.



就一般而言,如果你的业务逻辑都分布了,数据库应该也就分布了吧。
  而悲观锁 和 乐观锁  好像和你在那层实现分布是没有关系的吧,就算你在view层控制,也可以。
16 楼 hpq852 2009-01-12  
czx566 写道
hpq852 写道
好吧, 一个难题, 分布式事务如何实现?

Spring中没有相关的实现, 原因是因为99%的业务没有这个需求, 那么即使需要用到了就交给EJB吧, 搞那么复杂干吗?



这个可以用悲观或乐观锁实现~

我觉得如果一定要采用分布式容器


最好用EJB3



我这里指的是业务逻辑的分布, 而不是数据库的分布. 不要搞混了. 而在管理业务逻辑分布方面恐怕是EJB唯一可以拿的出手的东西了.
15 楼 czx566 2009-01-12  
hpq852 写道
好吧, 一个难题, 分布式事务如何实现?

Spring中没有相关的实现, 原因是因为99%的业务没有这个需求, 那么即使需要用到了就交给EJB吧, 搞那么复杂干吗?



这个可以用悲观或乐观锁实现~

我觉得如果一定要采用分布式容器


最好用EJB3

14 楼 eyes2near 2009-01-12  
去看看 www.terracotta.org
13 楼 hpq852 2009-01-12  
好吧, 一个难题, 分布式事务如何实现?

Spring中没有相关的实现, 原因是因为99%的业务没有这个需求, 那么即使需要用到了就交给EJB吧, 搞那么复杂干吗?

相关推荐

Global site tag (gtag.js) - Google Analytics