锁定老帖子 主题:内部系统间调用效率的讨论
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-08-21
如果使用EJB就太麻烦了,对容器也有限制。如果使用rest之流的话,虽然很简单,但感觉在内部系统间效率不高而且建立连接、权限管理、序列化等也得花时间。 各位大牛,有比较好的方案没? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-08-21
SPRING INTERGRATION
|
|
返回顶楼 | |
发表时间:2012-08-22
最后修改:2012-08-22
偶不是大牛,不过跳出来吐槽下
统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。
还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。 当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。
|
|
返回顶楼 | |
发表时间:2012-08-22
vlinux 写道 偶不是大牛,不过跳出来吐槽下
统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。
还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。 当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。
非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。 |
|
返回顶楼 | |
发表时间:2012-08-22
java_user 写道
vlinux 写道
偶不是大牛,不过跳出来吐槽下
统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。
还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。 当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。
非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。
使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。
如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。
大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信? |
|
返回顶楼 | |
发表时间:2012-08-22
最后修改:2012-08-22
youarestupid 写道
java_user 写道
vlinux 写道
偶不是大牛,不过跳出来吐槽下
统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。
还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。 当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。
非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。
使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。
如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。
大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信?
Java和C++之间的调用可以选用Facebook开源的Thrift或者Google开源的Protocolbuf作为远程通讯协议。 至于JMS的使用,我觉得vlinux说的很好,去中心化是必须要考虑的。如果是Java之间通讯,楼主可以考虑一下阿里的Dubbo。 |
|
返回顶楼 | |
发表时间:2012-08-22
最后修改:2012-08-22
方世玉 写道
youarestupid 写道
java_user 写道
vlinux 写道
偶不是大牛,不过跳出来吐槽下
统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。
还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。 当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。
非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。
使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。
如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。
大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信?
Java和C++之间的调用可以选用Facebook开源的Thrift或者Google开源的Protocolbuf作为远程通讯协议。 至于JMS的使用,我觉得vlinux说的很好,去中心化是必须要考虑的。如果是Java之间通讯,楼主可以考虑一下阿里的Dubbo。
我的面临的核心问题是: 两个应用部署在同一台服务器上,一个Java应用,一个C++应用,两个应用之间独立,不能互相成为彼此的嵌入模块,但是两个应用之间又需要高实时性地通信。 也就是: 外部电流信号进入硬件==>硬件检测电压变化,将感应传输给硬件驱动 ==>硬件驱动告诉C++应用 ==>> C++应用调用Java应用 ==>Java引用处理一些逻辑,将结果返回C++应用 ==>C++应用告诉硬件驱动 ==>硬件驱动命令硬件做出反应。
这是一个完整的回路流程,要求在瞬间完成,不能阻塞。
因为Java应用和C++应用部署在同一台服务器上,我就想,有没有办法让着两个应用间建立一种非常快速的通信机制,类似Java通过JNI调用动态链接库,但是又不能使用JNI,因为C++应用不能成为Java应用的一部分。
如果使用Socket通信,当并发数量很多的时候,Java的Socket Server会出现线程排队的现象,这样整个流程就不是一个实时性的东西了。
|
|
返回顶楼 | |
发表时间:2012-08-22
youarestupid 写道
方世玉 写道
youarestupid 写道
java_user 写道
vlinux 写道
偶不是大牛,不过跳出来吐槽下
统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。
还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。 当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。
非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。
使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。
如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。
大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信?
Java和C++之间的调用可以选用Facebook开源的Thrift或者Google开源的Protocolbuf作为远程通讯协议。 至于JMS的使用,我觉得vlinux说的很好,去中心化是必须要考虑的。如果是Java之间通讯,楼主可以考虑一下阿里的Dubbo。
我的面临的核心问题是: 两个应用部署在同一台服务器上,一个Java应用,一个C++应用,两个应用之间独立,不能互相成为彼此的嵌入模块,但是两个应用之间又需要高实时性地通信。 也就是: 外部电流信号进入硬件==>硬件检测电压变化,将感应传输给硬件驱动 ==>硬件驱动告诉C++应用 ==>> C++应用调用Java应用 ==>Java引用处理一些逻辑,将结果返回C++应用 ==>C++应用告诉硬件驱动 ==>硬件驱动命令硬件做出反应。
这是一个完整的回路流程,要求在瞬间完成,不能阻塞。
因为Java应用和C++应用部署在同一台服务器上,我就想,有没有办法让着两个应用间建立一种非常快速的通信机制,类似Java通过JNI调用动态链接库,但是又不能使用JNI,因为C++应用不能成为Java应用的一部分。
如果使用Socket通信,当并发数量很多的时候,Java的Socket Server会出现线程排队的现象,这样整个流程就不是一个实时性的东西了。
在你的场景下,“瞬间”是什么样的响应时间,指标是多少?如果真的是实时系统,用java就不合适了,因为还要考虑GC导致的停顿。 另外部署在一台服务器上可以考虑用操作系统的消息机制,不过按照你说的方案,c++一定要同步的调用java获取返回值,那就又不合适了,因为消息机制是异步的。 |
|
返回顶楼 | |
发表时间:2012-08-22
之前我的一个应用和你有些类似。有java写的系统,也有VC++写的系统。最终采用的方案是,jms+socket.
跨语言间调用采用socket,java语言同步调用采用socket,异步调用采用jms. |
|
返回顶楼 | |
发表时间:2012-08-22
最后修改:2012-08-22
方世玉 写道
youarestupid 写道
方世玉 写道
youarestupid 写道
java_user 写道
vlinux 写道
偶不是大牛,不过跳出来吐槽下
统一调用平台,实际上你要做的是业务总线咯。用JMS的方式不是说不ok,但从执行效率来说绝对不是高效的。因为你的业务总线(也就是你的统一调用平台啦)是一个绝对的单点,这就意味着你的这个平台必须保证至少一组热备。另外由于是所有业务都接入,每个业务自身都有优先级,所以你的前置接口机必须根据业务优先级进行物理隔离,防止低级业务挤占高级业务的线程池。物理隔离还必须延伸到JMS,防止不同优先级的业务事件相互挤占。此外基于JMS的QoS你还很不好做。
还有JMS消息的重复投递、无序投递,服务的幂等被迫做得很细,如果业务上无法做幂等,你还得在技术上判重。 当JMS的Producer全部下线(server端故障)时,做为Consumer无法及时感知,无法立即返回业务方失败,只能活生生的等待超时。
非个人研究,不敢做实验,呵呵 JMS可以做集群,响应的服务器也可以做集群,感觉问题应该不大,至于等待超时这个确实没办法只能在客户端做文章。之前也是有过相关的经验,才会想到这个的。
使用Socket在Java <==> C++通信,自己约定一些通信协议规则,是目前采取的措施,但是有时候Java应用和C++应用就在同一台服务器上,这样也用Socket通信,有点走弯路的感觉。
如果使用JNI,则Java 和 C++之间必须耦合成一个应用,这样就不能做到C++应用的替换了。
大家有没有一种比较好的办法,实现Java 与 C++之间高效率、及时性地通信?
Java和C++之间的调用可以选用Facebook开源的Thrift或者Google开源的Protocolbuf作为远程通讯协议。 至于JMS的使用,我觉得vlinux说的很好,去中心化是必须要考虑的。如果是Java之间通讯,楼主可以考虑一下阿里的Dubbo。
我的面临的核心问题是: 两个应用部署在同一台服务器上,一个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端发生了什么事情的问题。 |
|
返回顶楼 | |