我们有一个基于客户端 - 服务器架构的产品。关于所使用的技术堆栈的一些细节。
客户位于世界的不同地方,但是Java服务器& oracle数据库位于瑞典的同一台机器上。因此,存在大量网络延迟。位于偏远地区的客户表现糟糕。该应用程序用于处理大小超过50MB的文件。每项操作一般需要超过1000次网络呼叫。
根据您的经验,您如何解决这个问题并提高绩效?
编辑:回答几个问题
-Snehal
答案 0 :(得分:4)
减少往返次数
单次手术1000次往返是一个天文数字。你不应该看到这些数字。
使用50MB文件时仍然存在问题。在这种情况下,您需要找到一种方法来提高传输效率(仅传输两个相似文件之间的增量?),或采用某种缓存。
WAN流量正在扼杀您的应用,听起来您有重大的重构要做。
答案 1 :(得分:2)
通过网络发送大文件和大量请求会花费大量时间。期。即使您可以升级到千兆以太网,协议仍然要求您的客户端在两个连续的网络数据包之间闲置几毫秒(因此其他主机也有机会通话)。
但千兆以太网是不可行的,因为客户端很远(可能通过互联网连接)。
因此,唯一可行的方法是将业务代码移近服务器。最简单的解决方案是将客户端安装在与服务器相同的LAN中的小盒子上,并使用VNC或类似协议远程访问它们。
下一个层次是将客户端切割为业务层和显示层。将业务层转换为服务并在客户端上安装显示层。这样,数据仅在(快速)Intranet上推送。当结果准备好显示时,客户端只获得结果(小数据)。
答案 2 :(得分:1)
- 如果不是这样,则使服务器无状态
- 更轻松的远程协议,如Hessian
-Latency可能是你的瓶颈,考虑在客户端使用缓存并读取更大的数据块,1000次往返是巨大的负载。
- 重构客户端以使其能够在本地工作并使其在后台同步
- 使用分析器查看应用程序花费最多时间的位置并优化
答案 3 :(得分:1)
您是否对不同部位的相对时间消耗进行了测量?在你衡量个别过程需要多长时间之前,我不会碰任何东西。
我怀疑延迟问题是关键。但在考虑任何解决方案之前,我会先测量并确定这一点。
答案 4 :(得分:1)
或许最好的办法是更好地了解基础设施的运作方式
答案 5 :(得分:1)
不确定,但看起来您要在50 MB文件中有一些数据要验证/处理和存储在数据库中。这是对的吗?
为什么客户端只是将文件传递给服务器,服务器执行validate / process任务并存储在数据库中?除了将文件数据传递给服务器之外,没有网络调用。
其他可能性是,如果您可以在一个呼叫中进行多个操作,即会话外观模式。
答案 6 :(得分:1)
答案 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)服务器。