关于jdon框架的domainMessage.getEventResult性能问

14-05-06 wxjwzx
         

这几天用jdon框架+spring搞了个程序,发现 domainMessage.getEventResult 这个方法性能很低,每次获取对象要10秒左右,不知道是版本bug还是使用方法不对。请benq大侠给分析下原因,不胜感激。。。。。

DomainMessage domainMessage= event.getDomainMessage();

JdonMessageResult jdonmsg=(JdonMessageResult)domainMessage.getEventResult(); //速度很慢

         

banq
2014-05-06 20:52

是的,因为这实际上是同步操作,需要堵塞等待。getEventResult可在预估1秒以后的地方再调用,而不是什么都不做,干等getEventResult返回结果,先做点别的事情。

异步编程与同步区别在于编程思路有些区别,原来调用者发出一个请求必然有一个响应,调用一个方法调用肯定有一个方法返回结果,现在将这一去一回分成两个事件,两个步骤,而不是都在调用者这里全部完成。

wxjwzx
2014-05-08 13:41

谢谢benq的回复,按照异步的思维的确是没问题的,但是像有些操作,比如更新删除之类的,如果不等返回结果就进行下面操作的话,万一操作失败,会让用户感觉是程序有问题。

banq
2014-05-08 14:47

2014-05-08 13:41 "@wxjwzx"的内容
比如更新删除之类的,如果不等返回结果就进行下面操作的话,万一操作失败,会让用户感觉是程序有问题 ...

只要你保证你的服务器负载不会满负荷,这种情况基本不会发生。相反,如果你的服务器负载满负荷,同步操作后也会让用户堵塞等待很长时间,用户也会感觉程序有问题的。

在服务器CPU有空闲的情况下,采取异步操作,比如更新完成后,可以直接更新内存中的状态,更新完成后就返回结果“成功”给用户,而不必等DB等慢设备完成后才返回结果“成功”给用户。用户看到“成功”,然后再发出GET操作获得新结果时,这段时间差其实服务器端已经更新完DB的慢设备了,所以,用户获得GET结果都是最新结果。

用新的思路和办法试验一下吧,如果不行,再改回同步。

banq
2014-05-10 11:14

另外可使用RxJava,对domaneMessage设为可观察者,一旦domainMessage.getEventResult有数据后,将自动激活回调函数。

当然,这个方法我还没有试验过,在以后版本中会引入lambda和RxJava。

可参考:RXJAVA的Observable和AKKA Actor综合使用

结合vert.x 2.0和RxJava