`

【转】 socket VS RMI VS WebService 性能和实现

    博客分类:
  • java
阅读更多
转载自 yangtbo
最终编辑 yangtbo

WebService与EJB调用性能对比

2.测试结果

数据条数 WebService时间 非WebService时间 差值 清耗百分比
2 0.078 0.077 0.001 1.8%
11 0.125 0.113 0.012 9.6%
20 0.187 0.153 0.033 17.9%
30 0.222 0.215 0.007 3.1%
40 0.275 0.257 0.018 6.5%
80 0.477 0.422 0.054 11.4%
100 0.576 0.495 0.081 14.1%
200 1.070 0.920 0.150 14.0%
300 1.590 1.391 0.199 12.5%
400 2.157 1.810 0.348 16.1%
500 2.627 2.234 0.393 15.0%
600 3.067 2.630 0.437 14.3%
800 4.120 3.559 0.561 13.6%
1000 5.193 4.385 0.807 15.5%
1500 7.369 6.265 1.103 15.0%
2000 10.010 8.525 1.484 14.8%
3000 14.715 12.427 2.288 15.5%
4000 19.727 16.407 3.320 16.8%
5000 24.599 21.376 3.223 13.1%
8000 38.881 34.434 4.447 11.4%
10000 48.237 40.91147 7.325 15.2%

3.结论.

感觉WebService比EJB的RMI方法要消耗约15%左右的效率.

 

RMI vs Socket

一般来说,基于CS(client-server)软件架构的开发技术有很多种。比较常用的有:基于socket的网络编程、RPC、基于Java技术的 RMI(当然C#也有类似技术)、CORBA等。在这里我们只是对基于socket的网络编程与RMI作个对比,有助于我们了解它们各自的应用领域,帮助我们在面对一个具体问题的时候选用适合的技术。另外,本文所做的讨论可以认为是脱离了语言层面的东西,只是对技术的本身做一个讨论,无关乎你是用C++、 C#或Java 在开发。
一、RMI技术简介
        本文就以Java为例,简单介绍一下RMI技术。
        从Java1.1开始,远程方法调用作为Java分布式对象技术成为Java核心的API之一(在java.rmi.* 包)。RMI的引入,使得Java程序之间能够实现灵活的,可扩展的分布式通信。RMI允许Java对象存在于多个不同的地址空间,分布在不同的Java 虚拟机上。每一个地址空间可以在同一台主机上或者网络上不同的计算机上。由于远程方法调用跨越不同的虚拟机边界到不同的指定的地址空间,所以没有对象共享的全局变量,这就需要对象序列化(Object Serialization)API,它使得Java对象能够在不同的JVM之间传递。对象序列化是特别为Java的对象设计的,这就意味着Java程序中的对象可以作为对象参数存取(可序列化的对象必须实现Serializable接口)。结合RMI和对象序列化机制,就可以访问越过本地Java虚拟机边界的对象以及数据。通过RMI,可以调用远程对象的远程方法,而通过Java对象序列化机制可以将对象传递给这些方法。
        最基本的Java模型并没有提供将远程主机上的Java对象看作本地Java程序地址空间一部分的能力,而RMI祢补了这一不足。另外,由于Java与硬件平台无关的特性,无论是同构的系统还是异构的系统,RMI不需移植就可以顺利运行。
       RMI为Java平台的分布式计算提供了一个简单而直接的模型。因为Java的RMI技术是基于Java平台的,所以它将Java平台的安全性和可移植性等优点带到了分布式计算中。RMI大大扩展Java的网络计算能力,它为编写基于分布式对象技术的企业级Internet/Intranet应用提供了强大的系统平台支持。
      Java RMI体系结构如下图:


二、基于socket的网络编程
        当你使用socket进行网络应用开发的时候,一般的思路是“消息驱动逻辑”,即这样的软件系统一般具有以下特点:
       (1) 客户端与服务器端依靠消息进行通讯。
       (2) 客户端或者服务器端都需要一个消息派遣器,将消息投递给具体的massage handler
       (3) 客户端或者服务器端利用massage handler进行逻辑事务处理
见下图:

        使用socket开发的软件系统,从技术的本质上来讲,有以下几个特点:
        (1) 基于TCP协议的通讯
        (2) 应用程序本身需要提供对消息的序列化处理(所谓的序列化指的是将消息输出到网络流中)
        (3) 客户端与服务器端需要事先商议好它们之间的通讯协议即它们交互的消息格式
        (4) 由于是消息驱动逻辑,从本质上决定了这样的编程模式很难面向对象化
三、RMI Vs Sochet
         RMI技术比较socket的网络编程主要有以下几个方面:
        第一、.RMI是面向对象的,而后者不是。
        第二、.RMI是与语言相绑定的。比如当你使用Java RMI技术的时候,客户端与服务器端都必须使用Java开发。而socket的网络编程是使用独立于开发语言的,甚至独立于平台。基于socket的网络编程,客户端与服务器端可以使用不同开发语言和不同的平台。
       第三、从网络协议栈的观点来看,RMI与socket的网络编程处于不同层次上。基于socket的网络编程位于TCP协议之上,而RMI在TCP协议之上,又定义了自己的应用协议,其传输层采用的是Java远程方法协议(JRMP)。可见,在网络协议栈上,基于RMI的应用位置更高一些,这也决定了,与 socket的网络编程相比,RMI会丧失一些灵活性和可控性,但是好处是它带给了应用开发者更多的简洁,方便和易用。比如:如果你用的是RMI,你不需要关心消息是怎么序列化的,你只需要像本地方法调用一样,使用RMI。代价是:应用开发者无法很好地控制消息的序列化机制。
      第四、这是最后一点不同,我认为也是比较重要的一点,就是两种方法的性能比较,其往往决定着你将使用那种技术来开发你的应用。以下引用Adrian Reber在Network-programming with RMI文中对TCP和RMI所做的一个比较,其做的实验主要是对两者在网络传输的带宽上作的对比: 在网络上传输2 byte的有效数据,对于TCP而言,总共有478 byte被额外传输,而对于RMI, 1645byte被额外传输。
以下是两者的trace结果:
TCP:
46037 > 12345 [SYN] Seq=801611567 Ack=0 Win=5840 Len=0
12345 > 46037 [SYN, ACK] Seq=266515894 Ack=801611568 Win=10136 Len=0
46037 > 12345 [ACK] Seq=801611568 Ack=266515895 Win=5840 Len=0
12345 > 46037 [PSH, ACK] Seq=266515895 Ack=801611568 Win=10136 Len=1
46037 > 12345 [ACK] Seq=801611568 Ack=266515896 Win=5840 Len=0
12345 > 46037 [FIN, PSH, ACK] Seq=266515896 Ack=801611568 Win=10136 Len=1
46037 > 12345 [RST, ACK] Seq=801611568 Ack=266515898 Win=5840 Len=0
RMI:
42749 > rmiregistry [SYN, ECN, CWR]
Seq=3740552479 Ack=0 Win=32767 Len=0
rmiregistry > 42749 [SYN, ACK, ECN]
Seq=3749262223 Ack=3740552480 Win=32767 Len=0
42749 > rmiregistry [ACK] Seq=3740552480 Ack=3749262224 Win=32767 Len=0
JRMI, Version: 2, StreamProtocol
rmiregistry > 42749 [ACK] Seq=3749262224 Ack=3740552487 Win=32767 Len=0
JRMI, ProtocolAck
42749 > rmiregistry [ACK] Seq=3740552487 Ack=3749262240 Win=32767 Len=0
Continuation
rmiregistry > 42749 [ACK] Seq=3749262240 Ack=3740552506 Win=32767 Len=0
JRMI, Call
rmiregistry > 42749 [ACK] Seq=3749262240 Ack=3740552556 Win=32767 Len=0
JRMI, ReturnData
42749 > rmiregistry [ACK] Seq=3740552556 Ack=3749262442 Win=32767 Len=0
JRMI, Ping
JRMI, PingAck
42749 > rmiregistry [ACK] Seq=3740552557 Ack=3749262443 Win=32767 Len=0
JRMI, DgcAck
42749 > rmiregistry [FIN, ACK]
Seq=3740552572 Ack=3749262443 Win=32767 Len=0
rmiregistry > 42749 [FIN, ACK]
Seq=3749262443 Ack=3740552573 Win=32767 Len=0
42749 > rmiregistry [ACK] Seq=3740552573 Ack=3749262444 Win=32767 Len=0
        实验的结果是:RMI与TCP based socket相比,传输相同的有效数据,RMI需要占用更多的网络带宽(protocol overhead)。从这里,我们可以得出一个一般性的结论:RMI主要是用于远程方法的”调用“(RMI是多么的名符其实:)),其技术内涵强调的是 “调用”,基于此,我能想到的是:移动计算,和远程控制,当你的应用不需要在client与server之间传输大量的数据时,RMI是较好的选择,它简洁、易于开发。但是,一旦你的应用需要在client与server之间传输大量的数据,极端的,比如FTP应用,则RMI是不适合的,我们应该使用 socket。

分享到:
评论

相关推荐

    Socket性能测试指导.doc

    Socket性能测试指导 Socket性能测试指导是指通过kylinPET工具对网络通信协议类型进行测试,包括文本协议(如HTTP)...kylinPET工具的使用可以帮助用户快速、高效地实现Socket性能测试,满足用户对网络协议测试的需求。

    (完整版)Java系统架构师面试题.docx

    JAVA 通信方面相关知识包括 Socket 编程、RMI、WebService 等。Socket 编程是指使用 Socket 对象来实现网络通信。RMI(Remote Method Invocation,远程方法调用)是一种 JAVA 技术,提供了远程方法调用功能。...

    (完整版)Java系统架构师面试题 (2).docx

    Java通讯方面的知识包括Socket、RMI、WebService等技术,用于实现大项目之间的通讯。 7、8. 谈谈架构师的职责有哪些?软件设计领域,有哪些设计模式? 架构师的职责包括软件设计、系统架构、项目管理等。软件设计...

    Java远程通讯可选技术及原理

    Java远程通讯技术是构建分布式系统的关键,涉及到多种技术如RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等。这些技术在不同的场景下有着...深入理解这些技术的原理和实现方式,能帮助开发者做出更明智的选择。

    系统移动应用系统安全管理平台解决方案概述1.pdf

    中间服务器的实现方式有多种,包括HTTP/Socket/SOAP/RMI等网络协议的持久化框架、网页提取与解析以及WebService。持久化框架如Hibernate和MyBatis能快速处理SQL查询,但可能在海量数据处理时性能受限。网页提取与...

    4a统一安全管理平台解决方案.docx

    例如,通过HTTP/Socket/SOAP/RMI等协议的持久化框架,快速获取和处理数据;使用网页提取与解析技术,无需改造原有Web应用,直接将其转化为适应移动客户端的形式;或者利用WebService,提供跨平台的数据和服务共享,...

    JAVA基础知识点

    - **远程控制:** 如案例中提到的,可以使用RMI来实现程序的远程启动和停止控制。 **注意事项:** - **跨语言支持:** 当需要与非Java环境进行交互时,RMI可能不是最佳选择,此时可以考虑使用WebService等技术。 - ...

    项目间的数据交互方式

    这种方式不再做过多描述,具体请参阅我的《Webservice 之 CXF 实现》、《Webservice 架构设计》博文。这这种方式在互联网上用得多一些。 4. 远程 RMI(如 OMG CORBA)方式 远程 RMI 方式是项目之间进行数据交互的...

    JAVA技术体系.pdf

    - **网络编程**:Applet用于Web浏览器中的小程序,Socket编程实现TCP/IP通信,NIO提供非阻塞I/O,RMI和CORBA支持远程方法调用和分布式计算。 2. **JavaEE初级软件工程师**: - **JSF框架**:用于构建Web应用程序...

    dubbo源码解析

    6. 设计模式:设计模式是软件开发中普遍适用的知识点,了解设计模式有助于理解Dubbo框架中各种设计的意图和实现方式。 7. Dubbo架构和背景:随着互联网的发展,网站应用规模的扩大,传统的垂直应用架构已难以满足...

    JAVA技术路线图.docx

    网络编程方面,Java支持Socket/TCP/UDP通信,NIO(非阻塞I/O),RMI(远程方法调用)和CORBA(公共对象请求代理架构)等技术,用于实现不同层次的网络应用。 Java的高级特性如反射、泛型、注解等,为开发者提供了...

    【系统】移动应用系统安全管理平台解决方案概述1.docx

    目前,移动应用系统的中间件服务器主要采用HTTP/Socket/SOAP/RMI等协议的持久化框架,网页提取与解析,以及WebService等技术,以适应不同的应用场景和需求。 综上所述,构建移动应用系统安全管理平台的关键在于平衡...

    java的各种技术.pdf

    3. **Java网络编程**:Java的Socket编程允许开发网络应用程序,支持TCP/IP和UDP通信,同时NIO(非阻塞I/O)提供高性能的网络编程模型。 4. **Java RMI(远程方法调用)**:RMI允许Java对象在不同的JVM之间进行远程...

    SOA通用架构.docx

    11. **通信协议和接口**:Webservice、RESTful API、Mq(消息队列)、JMS(Java消息服务)、Socket、远程对象(RPC/RMI)、OLAP(在线分析处理)、二进制/JSON/XML格式数据交换,以及HTTP(S)、SOAP、IIOP等协议用于...

    java程序员的标准

    - **Collections**:提供了一系列用于存储和操作对象集合的接口和实现类,如List、Set、Map等。 - **Serialization**:支持对象的序列化和反序列化机制,便于对象的持久化和网络传输。 - **Networking**:提供了...

    java web方向学习曲线图

    网络编程涵盖了Applet、Socket/TCP/UDP、NIO、RMI和CORBA,这些技术用于网络通信和分布式应用。 JavaEE初级软件工程师阶段,主要学习JSF(JavaServer Faces)框架,包括配置文件、组件库、核心库以及与HTML、CSS、...

    JAVA技术路线图.pdf

    Java网络编程涉及Socket/TCP/UDP通信,非阻塞I/O(NIO),远程方法调用(RMI)以及CORBA技术,这些都是构建分布式系统的基础。此外,Java的高级特性,如反射、泛型、注解、自动装箱/拆箱、枚举类、可变参数、可变返回...

    JAVA技术体系

    - **Socket编程**:掌握TCP/IP协议,实现客户端和服务端之间的通信。 - **NIO**:学习如何使用NIO进行非阻塞式网络编程。 - **RMI与CORBA**:理解远程方法调用(RMI)和公共对象请求代理体系(CORBA)用于分布式系统中的...

Global site tag (gtag.js) - Google Analytics