一个消息服务器的设计及实现中的问题,高手请进

xubei1009 2005-02-02 05:16:50
前几天开发了一个消息服务器,可以实现PTP方式的通信,经过性能压力测试,都还比较满意,但是后来想到一个问题,目前还没有找到好的解决方法,特来请教大家,望诸位高手不吝赐教!!!

我得消息服务器是以队列方式组织的,在程序启动是可以根据配置文件建立多个队列。服务器通过ServerSocket提供服务,能够接入客户端的连接。

每个客户Socket第一次接进来的时候,先发送一条注册消息,表名自己所要连接的队列,以及是要从该队列接收或是要向该队列发送消息。服务器每次发现有客户Socket接入,就会根据它的注册消息,把它作为Sender或者Receiver绑定到相应的队列。

服务器上每个队列都配有两个线程,一个线程用来监听该队列的Sender,一旦有消息写入,就将该消息填入队列,另一个线程不停轮询队列长度,一发现队列中有消息,并且该队列的Receiver!=null,就向该Receiver发送队列中的消息。

现在的问题是:检测队列长度并发送消息的线程,是跟据队列当前长度和Receiver是否为null来判断是否要向Receiver发送消息的,这样的话,如果一个作为Receiver的客户端仅仅是接进来,但是并没有发出read请求的时候,队列中的消息就已经被写进它的InputStream里了。比如,某个Sender向队列TEST1发送了100条消息,然后退出;接着又一个Receiver连到队列TEST1上,但是并未发出receive消息的请求就断开了,这时,就会一些消息被写入该Receiver,并且从队列中删除,这样就会造成消息损失,比如这时另有个客户Socket接进来向TEST1队列请求接收消息,它就只能接收不到100条的消息。

不知道各位有没有什么好的方法来解决这个问题,这里先谢过了!
...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang21cnboy 2005-03-01
  • 打赏
  • 举报
回复
比如现在队列TEST1里有100条消息,接进来一个Socket作为TEST1的Receiver,并且它发送了50个接收消息的请求,然后就断开了。接着,又接进来一个Socket作为TEST1的Receiver,并且也发送50个接收消息的请求,但是,第二个Socket将只能接收到小于50条的消息。

这是因为,在第一个socket收玩50条消息,和该socket断开之间这段时间,那个“检测队列长度并发送消息的线程”又把一些消息写进它的InputStream里,并且从队列中删除了,所以会造成消息丢失。

在第一个socket收玩50条消息,和该socket断开之间这段时间,那个“检测队列长度并发送消息的线程”又把一些消息写进它的InputStream里,我想知道的是,在这段时间内,如果没有socket连接,也就没有发送接受消息的请求,那你的监测队列还为什么要把消息写入InputStream呢?

根据你上面的描述,好像你是实现了同步的消息处理,(请求和相应对应哦),但是后面的描述又是异步的。

sqz007 2005-02-03
  • 打赏
  • 举报
回复
为什么不用jms,我想应该可以满足楼主的需要吧
xubei1009 2005-02-03
  • 打赏
  • 举报
回复
哦,打开了,这个一年多以前文档以前看过的,见得只是MQ的运作机制,但是我现在需要的是一个设计实现上的思路啊!
xubei1009 2005-02-03
  • 打赏
  • 举报
回复
楼上给的文档打不开啊。

IBM MQ我们公司已经用了很久了,我本人对MQ的运作模式可以说非常熟悉,现在就是因为有些地方不能用IBM MQ,所以才想到要自己写一个简单的实现,能满足基本的消息服务器的功能。

也用过开源的JMS实现,比如Joran,效果不是很好。

现在只想实现JMS规范中的PTP功能,上边已经说出了我得思路和一个问题,现在就是想求一个更好的思路。

如果哪位牛人研究过开源的JMS实现,能不能讲一下他们的PTP方式是如何实现的?
hq1305018 2005-02-03
  • 打赏
  • 举报
回复
建议你使用现有的消息中间件,比如WebSphere MQ。
如果楼主想自己设计,可以参考他的思路,下面有他的RedBook。

http://www.redbooks.ibm.com/redpapers/pdfs/redp0021.pdf

tomuno 2005-02-03
  • 打赏
  • 举报
回复
不遵循JMS规范
以后如何扩展?
rationalArrow 2005-02-03
  • 打赏
  • 举报
回复
up
xubei1009 2005-02-03
  • 打赏
  • 举报
回复
用现成的jms实现当然可以满足这个功能,但是我开发这个也是为了实践一下,不想用现成的。
xubei1009 2005-02-02
  • 打赏
  • 举报
回复
楼上可能误会了,我描述一下有问题的结果:

比如现在队列TEST1里有100条消息,接进来一个Socket作为TEST1的Receiver,并且它发送了50个接收消息的请求,然后就断开了。接着,又接进来一个Socket作为TEST1的Receiver,并且也发送50个接收消息的请求,但是,第二个Socket将只能接收到小于50条的消息。

这是因为,在第一个socket收玩50条消息,和该socket断开之间这段时间,那个“检测队列长度并发送消息的线程”又把一些消息写进它的InputStream里,并且从队列中删除了,所以会造成消息丢失。

当然了,如果Receiver一直监听队列的话是没有这个问题的,楼上的再帮忙想想:)
zhang21cnboy 2005-02-02
  • 打赏
  • 举报
回复
呵呵,你的这个问题,我觉得你是自己难为自己!

如果你需要把任何发送的消息,都要发送给任何接收消息的用户(包括哪些当前不在线的用户)

那我想,基本上是不可能的。

当然,如果你的消息接收者是固定的用户,那还是可以解决!

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧