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

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

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

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

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

编辑:回答几个问题

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

-Snehal

减少往返次数

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

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

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

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

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

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

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

– 如果不是这样的话,使服务器无状态

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

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

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

– 使用分析器查看应用程序花费最多时间的位置并对其进行优化

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

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

也许最好的办法是更好地了解基础设施的工作原理

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

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

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

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

Steve Souders的“高性能网站:前端工程师的基本知识”是一本非常好的书。 看到这里 。

史蒂夫的网站就在这里 。

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

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

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

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

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

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

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

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

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