Topic: 消息队列中间件中对象池技术是否适合????

  Print this page

1.消息队列中间件中对象池技术是否适合???? Copy to clipboard
Posted by: wendy_yu_2001
Posted on: 2004-02-29 18:07

我正在做一个消息队列中间件:
将接收的消息放在队列中,排队算法是WFQ;
将消息从队列中取出进行处理,处理过程是一个相当负责的过程,包括解析、解密、验证以及获得查询语句。
我想问:我设计一个对象池,池中的对象用来负责处理工作,这样合适吗?
有高手告诉我这样相当于把消息排了两次队,排队一次,应用对象池又排队一次。请问高手,这里用对象池技术好不好,效率怎样?

2.Re:消息队列中间件中对象池技术是否适合???? [Re: wendy_yu_2001] Copy to clipboard
Posted by: cailuyu
Posted on: 2004-02-29 22:09

我是这样想的 首先是我的假设
首先 你的中间件应该是工作在多线程下的 就是说中间件内部是通过多线程并行处理消息的
其次 从你说的"处理"的概念:"解析、解密、验证以及获得查询语句" 可以看出你说的这些 "对象"应该是无状态的

所以 大致你说的池的工作原理和无状态sb池是类似的
你说的那个高手提到的二次排队 我是这样理解的:
消息已经在队列里按一定顺序排队 然后"消息处理对象"异步的进行处理 由于是异步的 就会造成原有的顺序被打乱 这可能是他提到二次排队吧? 这个问题在应用层是有一定意义的 有些消息的处理顺序是严格的 这涉及到一个比较复杂情况和问题 一般的中间件产品都是在消息头中作一些处理

当然你的中间件如果暂时不考虑这些 也就没有问题了

3.Re:消息队列中间件中对象池技术是否适合???? [Re: wendy_yu_2001] Copy to clipboard
Posted by: wendy_yu_2001
Posted on: 2004-03-01 09:46

无状态sb池是什么?

那你的意思是可以用了?

4.Re:消息队列中间件中对象池技术是否适合???? [Re: wendy_yu_2001] Copy to clipboard
Posted by: cailuyu
Posted on: 2004-03-01 10:55

我的意思是 就像应用服务器中的stateless session bean的池的工作方式

如果你对信息的处理不严格要求按照队列的顺序 那就没问题
因为池的工作方式是透明的 用与不用从上层是看不出来变化的 所以不会存在什么问题
而且在存在大量短线程的情况下 性能肯定是有优势的

5.Re:消息队列中间件中对象池技术是否适合???? [Re: wendy_yu_2001] Copy to clipboard
Posted by: cailuyu
Posted on: 2004-03-01 22:36

还有一种可能
这和pool的工作原理有关
池的获得对象的方法是被同步的 这样就有可能造成 二次排队
这时候排队的方式是和同步的机制有关的 不受你的控制 也就会造成处理顺序与队列中的顺序不一致

解决方法
将方法调用序列化 再排一次队

6.Re:消息队列中间件中对象池技术是否适合???? [Re: wendy_yu_2001] Copy to clipboard
Posted by: smartHawk
Posted on: 2004-03-02 13:50

我也做个一个类似JMS的订阅/发布方式的处理过程消息处理过程,我觉得在做这个的时候,应该包括以下几个方面:
1.接收消息;
2.分发消息(排队)(维护消息的之间的逻辑(有状态的消息时需要)),有不同的消息类型;
3.处理消息
我想你所说的对象池是想在处理消息时使用不同的对象来处理,但是为了实现处理对象的重用所以使用对象池。
由于从池中取得消息处理对象时是一个同步的方法,所以在这儿可能需要在排队。
至于这个开销,我觉得是值得的,如果我们不对处理对象进行的个数进行控制,一旦消息大量到达,将会有大量的构造、虚拟机释放内存的过程。而且随着对象数目的增加,虚拟机效率肯定要降低的。但是这个就有一个问题:对象池的深度问题,太少,使得取对象的效率降低。太大,就没有起到对象池的本意。
希望我得解释能够对你有一些帮助。

7.Re:消息队列中间件中对象池技术是否适合???? [Re: smartHawk] Copy to clipboard
Posted by: cailuyu
Posted on: 2004-03-02 21:45

smartHawk wrote:
由于从池中取得消息处理对象时是一个同步的方法,所以在这儿可能需要在排队。

这个想法和我的一样
你觉得应该怎么排队哪? 只在获得处理对象的时候保证顺序和队列中的一致是否有意义? 我觉得如果要保证消息真正的按顺序处理 那么多线程也就没意义了 同步异步也就没意义了 池也就没意义了

不过我觉得 我好像理解错了楼主的意思 楼主好像是问池造成的二次排队对性能的影响
这个问题好办呀 池本身是透明的 那你在设计的时候用工厂做封装 然后设置开关 这样将来也方便做测试
是否有性能的优势 是和场合相关的 没有什么绝对的


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923