如何提高客户端 - 服务器架构应用程序的性能?

时间:2009-04-27 09:25:35

标签: java performance client-server rmi

我们有一个基于客户端 - 服务器架构的产品。关于所使用的技术堆栈的一些细节。

  • 客户端 - Java Swing
  • 服务器 - RMI
  • Java数据库 - Oracle

客户位于世界的不同地方,但是Java服务器& oracle数据库位于瑞典的同一台机器上。因此,存在大量网络延迟。位于偏远地区的客户表现糟糕。该应用程序用于处理大小超过50MB的文件。每项操作一般需要超过1000次网络呼叫。

根据您的经验,您如何解决这个问题并提高绩效?

编辑:回答几个问题

  1. 文件包含需要处理和更新到数据库的实际业务数据,不能部分发送。
  2. 某些网络调用可以进行批处理,但需要重新编写代码。这是一个非常古老的应用程序,写于2001年。应用程序的设计使得服务器保存所有服务,并且它们可以在代码中重用,业务逻辑在客户端编写。因此,这种业务逻辑多次调用服务器,因而是天文数字。
  3. -Snehal

12 个答案:

答案 0 :(得分:4)

减少往返次数

单次手术1000次往返是一个天文数字。你不应该看到这些数字。

使用50MB文件时仍然存在问题。在这种情况下,您需要找到一种方法来提高传输效率(仅传输两个相似文件之间的增量?),或采用某种缓存。

WAN流量正在扼杀您的应用,听起来您有重大的重构要做。

答案 1 :(得分:2)

通过网络发送大文件和大量请求会花费大量时间。期。即使您可以升级到千兆以太网,协议仍然要求您的客户端在两个连续的网络数据包之间闲置几毫秒(因此其他主机也有机会通话)。

但千兆以太网是不可行的,因为客户端很远(可能通过互联网连接)。

因此,唯一可行的方法是将业务代码移近服务器。最简单的解决方案是将客户端安装在与服务器相同的LAN中的小盒子上,并使用VNC或类似协议远程访问它们。

下一个层次是将客户端切割为业务层和显示层。将业务层转换为服务并在客户端上安装显示层。这样,数据仅在(快速)Intranet上推送。当结果准备好显示时,客户端只获得结果(小数据)。

答案 2 :(得分:1)

- 如果不是这样,则使服务器无状态

- 更轻松的远程协议,如Hessian

-Latency可能是你的瓶颈,考虑在客户端使用缓存并读取更大的数据块,1000次往返是巨大的负载。

- 重构客户端以使其能够在本地工作并使其在后台同步

- 使用分析器查看应用程序花费最多时间的位置并优化

答案 3 :(得分:1)

您是否对不同部位的相对时间消耗进行了测量?在你衡量个别过程需要多长时间之前,我不会碰任何东西。

怀疑延迟问题是关键。但在考虑任何解决方案之前,我会先测量并确定这一点。

答案 4 :(得分:1)

或许最好的办法是更好地了解基础设施的运作方式

  1. 文件为何如此之大?
  2. 必须发送整个文件,或者只是发送所需的部分进行处理
  3. 这些网络电话是什么?这些都是必要的吗?如果是这样,可以将呼叫分成一个电话吗?

答案 5 :(得分:1)

不确定,但看起来您要在50 MB文件中有一些数据要验证/处理和存储在数据库中。这是对的吗?

为什么客户端只是将文件传递给服务器,服务器执行validate / process任务并存储在数据库中?除了将文件数据传递给服务器之外,没有网络调用。

其他可能性是,如果您可以在一个呼叫中进行多个操作,即会话外观模式。

答案 6 :(得分:1)

“高性能网站:前端工程师的基本知识”作者Steve Souders是一本非常好的书。请参阅here

史蒂夫的网站是here

答案 7 :(得分:1)

我建议尽可能多地使这个过程异步。客户是否需要对处理进行实时响应?如果没有,您可以转到MOM(面向消息传递的中间件)概念,并将JMS队列/主题放在客户端和服务器之间。

客户端可以将要处理的记录发布到服务器正在监视的队列中。处理完成后,服务器会将结果放入客户端正在侦听的回复队列中。这将强制重构,但假设您的代码松散耦合,它不应该是非常侵入性的。

答案 8 :(得分:1)

以重大方式重构代码或重写整个应用程序。如果您的经理说需要长时间添加进度条,以便用户认为它变得更快。

答案 9 :(得分:0)

每个操作需要1000个请求很多! 这会杀死任何服务器。 这通常是一个无法通过添加更多硬件来解决的问题 或添加更多带宽。 这是一个设计问题。 无论如何,我会安装一个分析器,以便查看 服务器状态(内存消耗,CPU等)。 看一下lambda探针(http://www.lambdaprobe.org

答案 10 :(得分:0)

RMI是一种非常昂贵的协议。我会考虑更换它。

答案 11 :(得分:0)

如果您无法更改协议,请至少更改有效负载:

1)这听起来像一个封闭的系统。如果是,则不需要使用通用的Serializable协议。切换到Externalizable并写入捕获对象状态所需的最小数据以进行电汇。

2)压缩从服务器发送到客户端的数据。除了(1)中的对象状态之外,还应该减少在网络中移动的数据blob(“文件”)。

除此之外(这显然取决于系统),您应该探索前向缓存节点。在许多应用程序中,存在域实体访问的模式。如果存在可以被利用的地理访问模式,您应该能够轻松地创建作为远程服务器的客户端的新代理节点,然后充当附近(rmi)客户端的(rmi)服务器。