论坛首页 Java企业应用论坛

内部系统间调用效率的讨论

浏览 14081 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-08-21  
想做一个系统间调用的统一平台,目前想好的技术是使用JMS(使用线程等待将异步转同步)收集请求,然后发送至响应服务器,再传回结果。虽然看上去比较麻烦,但JMS的效率貌似还挺高的,activemq据说每秒有几千,而且个系统间都可以相互调用而不需要太多配置。
如果使用EJB就太麻烦了,对容器也有限制。如果使用rest之流的话,虽然很简单,但感觉在内部系统间效率不高而且建立连接、权限管理、序列化等也得花时间。

各位大牛,有比较好的方案没?
   发表时间:2012-08-21  
SPRING INTERGRATION
0 请登录后投票
   发表时间:2012-08-22   最后修改:2012-08-22

偶不是大牛,不过跳出来吐槽下

 

统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。

 

还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。

当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。

 

 

 


做为业务总线的反面:去中心化的方案,偶很不厚道的推荐自己之前写的一款RMI的小软件“挖掘机”,http://code.google.com/p/excavator/

 

0 请登录后投票
   发表时间:2012-08-22  
vlinux 写道

偶不是大牛,不过跳出来吐槽下

 

统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。

 

还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。

当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。

 

 

 


做为业务总线的反面:去中心化的方案,偶很不厚道的推荐自己之前写的一款RMI的小软件“挖掘机”,http://code.google.com/p/excavator/

 


非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。
0 请登录后投票
   发表时间:2012-08-22  
java_user 写道
vlinux 写道

偶不是大牛,不过跳出来吐槽下

 

统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。

 

还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。

当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。

 

 

 


做为业务总线的反面:去中心化的方案,偶很不厚道的推荐自己之前写的一款RMI的小软件“挖掘机”,http://code.google.com/p/excavator/

 


非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。


我遇到的需求是,不仅仅在java应用之间相互调用,还需要在  Java <==> C++之间相互调用,而且C++调用硬件,需要及时从Java端取回结果,然后C++才能接着走下面的步骤,然后释放硬件的占用。所以这就对应用间的通信的效率和反应速度要求很高。

 

使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。

 

如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。

 

大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信?

0 请登录后投票
   发表时间:2012-08-22   最后修改:2012-08-22
youarestupid 写道
java_user 写道
vlinux 写道

偶不是大牛,不过跳出来吐槽下

 

统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。

 

还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。

当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。

 

 

 


做为业务总线的反面:去中心化的方案,偶很不厚道的推荐自己之前写的一款RMI的小软件“挖掘机”,http://code.google.com/p/excavator/

 


非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。


我遇到的需求是,不仅仅在java应用之间相互调用,还需要在  Java <==> C++之间相互调用,而且C++调用硬件,需要及时从Java端取回结果,然后C++才能接着走下面的步骤,然后释放硬件的占用。所以这就对应用间的通信的效率和反应速度要求很高。

 

使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。

 

如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。

 

大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信?

 

 

Java和C++之间的调用可以选用Facebook开源的Thrift或者Google开源的Protocolbuf作为远程通讯协议。

至于JMS的使用,我觉得vlinux说的很好,去中心化是必须要考虑的。如果是Java之间通讯,楼主可以考虑一下阿里的Dubbo。

0 请登录后投票
   发表时间:2012-08-22   最后修改:2012-08-22
方世玉 写道
youarestupid 写道
java_user 写道
vlinux 写道

偶不是大牛,不过跳出来吐槽下

 

统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。

 

还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。

当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。

 

 

 


做为业务总线的反面:去中心化的方案,偶很不厚道的推荐自己之前写的一款RMI的小软件“挖掘机”,http://code.google.com/p/excavator/

 


非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。


我遇到的需求是,不仅仅在java应用之间相互调用,还需要在  Java <==> C++之间相互调用,而且C++调用硬件,需要及时从Java端取回结果,然后C++才能接着走下面的步骤,然后释放硬件的占用。所以这就对应用间的通信的效率和反应速度要求很高。

 

使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。

 

如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。

 

大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信?

 

 

Java和C++之间的调用可以选用Facebook开源的Thrift或者Google开源的Protocolbuf作为远程通讯协议。

至于JMS的使用,我觉得vlinux说的很好,去中心化是必须要考虑的。如果是Java之间通讯,楼主可以考虑一下阿里的Dubbo。


Thrift本质上还是通过TCP来通信,相当于不同语言之间的RMI,Google Protocolbuf,看了一下介绍,只是一个序列化、反序列化工具,没有应用间通信的功能。

 

我的面临的核心问题是:

两个应用部署在同一台服务器上,一个Java应用,一个C++应用,两个应用之间独立,不能互相成为彼此的嵌入模块,但是两个应用之间又需要高实时性地通信。

也就是:

外部电流信号进入硬件==>硬件检测电压变化,将感应传输给硬件驱动 ==>硬件驱动告诉C++应用 ==>> C++应用调用Java应用 ==>Java引用处理一些逻辑,将结果返回C++应用 ==>C++应用告诉硬件驱动 ==>硬件驱动命令硬件做出反应。

这是一个完整的回路流程,要求在瞬间完成,不能阻塞。

 

因为Java应用和C++应用部署在同一台服务器上,我就想,有没有办法让着两个应用间建立一种非常快速的通信机制,类似Java通过JNI调用动态链接库,但是又不能使用JNI,因为C++应用不能成为Java应用的一部分。

 

如果使用Socket通信,当并发数量很多的时候,Java的Socket Server会出现线程排队的现象,这样整个流程就不是一个实时性的东西了。

0 请登录后投票
   发表时间:2012-08-22  
youarestupid 写道
方世玉 写道
youarestupid 写道
java_user 写道
vlinux 写道

偶不是大牛,不过跳出来吐槽下

 

统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。

 

还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。

当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。

 

 

 


做为业务总线的反面:去中心化的方案,偶很不厚道的推荐自己之前写的一款RMI的小软件“挖掘机”,http://code.google.com/p/excavator/

 


非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。


我遇到的需求是,不仅仅在java应用之间相互调用,还需要在  Java <==> C++之间相互调用,而且C++调用硬件,需要及时从Java端取回结果,然后C++才能接着走下面的步骤,然后释放硬件的占用。所以这就对应用间的通信的效率和反应速度要求很高。

 

使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。

 

如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。

 

大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信?

 

 

Java和C++之间的调用可以选用Facebook开源的Thrift或者Google开源的Protocolbuf作为远程通讯协议。

至于JMS的使用,我觉得vlinux说的很好,去中心化是必须要考虑的。如果是Java之间通讯,楼主可以考虑一下阿里的Dubbo。


Thrift本质上还是通过TCP来通信,相当于不同语言之间的RMI,Google Protocolbuf,看了一下介绍,只是一个序列化、反序列化工具,没有应用间通信的功能。

 

我的面临的核心问题是:

两个应用部署在同一台服务器上,一个Java应用,一个C++应用,两个应用之间独立,不能互相成为彼此的嵌入模块,但是两个应用之间又需要高实时性地通信。

也就是:

外部电流信号进入硬件==>硬件检测电压变化,将感应传输给硬件驱动 ==>硬件驱动告诉C++应用 ==>> C++应用调用Java应用 ==>Java引用处理一些逻辑,将结果返回C++应用 ==>C++应用告诉硬件驱动 ==>硬件驱动命令硬件做出反应。

这是一个完整的回路流程,要求在瞬间完成,不能阻塞。

 

因为Java应用和C++应用部署在同一台服务器上,我就想,有没有办法让着两个应用间建立一种非常快速的通信机制,类似Java通过JNI调用动态链接库,但是又不能使用JNI,因为C++应用不能成为Java应用的一部分。

 

如果使用Socket通信,当并发数量很多的时候,Java的Socket Server会出现线程排队的现象,这样整个流程就不是一个实时性的东西了。

在你的场景下,“瞬间”是什么样的响应时间,指标是多少?如果真的是实时系统,用java就不合适了,因为还要考虑GC导致的停顿。

另外部署在一台服务器上可以考虑用操作系统的消息机制,不过按照你说的方案,c++一定要同步的调用java获取返回值,那就又不合适了,因为消息机制是异步的。

0 请登录后投票
   发表时间:2012-08-22  
之前我的一个应用和你有些类似。有java写的系统,也有VC++写的系统。最终采用的方案是,jms+socket.
跨语言间调用采用socket,java语言同步调用采用socket,异步调用采用jms.
0 请登录后投票
   发表时间:2012-08-22   最后修改:2012-08-22
方世玉 写道
youarestupid 写道
方世玉 写道
youarestupid 写道
java_user 写道
vlinux 写道

偶不是大牛,不过跳出来吐槽下

 

统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。

 

还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。

当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。

 

 

 


做为业务总线的反面:去中心化的方案,偶很不厚道的推荐自己之前写的一款RMI的小软件“挖掘机”,http://code.google.com/p/excavator/

 


非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。


我遇到的需求是,不仅仅在java应用之间相互调用,还需要在  Java <==> C++之间相互调用,而且C++调用硬件,需要及时从Java端取回结果,然后C++才能接着走下面的步骤,然后释放硬件的占用。所以这就对应用间的通信的效率和反应速度要求很高。

 

使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。

 

如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。

 

大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信?

 

 

Java和C++之间的调用可以选用Facebook开源的Thrift或者Google开源的Protocolbuf作为远程通讯协议。

至于JMS的使用,我觉得vlinux说的很好,去中心化是必须要考虑的。如果是Java之间通讯,楼主可以考虑一下阿里的Dubbo。


Thrift本质上还是通过TCP来通信,相当于不同语言之间的RMI,Google Protocolbuf,看了一下介绍,只是一个序列化、反序列化工具,没有应用间通信的功能。

 

我的面临的核心问题是:

两个应用部署在同一台服务器上,一个Java应用,一个C++应用,两个应用之间独立,不能互相成为彼此的嵌入模块,但是两个应用之间又需要高实时性地通信。

也就是:

外部电流信号进入硬件==>硬件检测电压变化,将感应传输给硬件驱动 ==>硬件驱动告诉C++应用 ==>> C++应用调用Java应用 ==>Java引用处理一些逻辑,将结果返回C++应用 ==>C++应用告诉硬件驱动 ==>硬件驱动命令硬件做出反应。

这是一个完整的回路流程,要求在瞬间完成,不能阻塞。

 

因为Java应用和C++应用部署在同一台服务器上,我就想,有没有办法让着两个应用间建立一种非常快速的通信机制,类似Java通过JNI调用动态链接库,但是又不能使用JNI,因为C++应用不能成为Java应用的一部分。

 

如果使用Socket通信,当并发数量很多的时候,Java的Socket Server会出现线程排队的现象,这样整个流程就不是一个实时性的东西了。

在你的场景下,“瞬间”是什么样的响应时间,指标是多少?如果真的是实时系统,用java就不合适了,因为还要考虑GC导致的停顿。

另外部署在一台服务器上可以考虑用操作系统的消息机制,不过按照你说的方案,c++一定要同步的调用java获取返回值,那就又不合适了,因为消息机制是异步的。


瞬间是:某人一按按钮,另外一个地方的警报器就马上响起来,绝对不能漏接,绝对不能等待。

 

目前来看,Java与C++之间唯一可行的通信方式,就是Socket,但是我的担心是:

1、如果Java服务宕掉怎么办,C++端都不知道它宕掉了;

2、如果Java端的Socket Server有线程一直执行不完,C++端再发来请求,出现了线程等待怎么办?

3、我想如果Java端出现什么情况,我在C++端都能立刻知道,就像所有的流程都在C++中一样,不要出现C++端不知道java端发生了什么事情的问题。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics