如何使用Java RESTful客户端消耗数TB的数据

时间:2011-12-16 09:48:42

标签: performance web-services spring maven rest-client

请有人指出我如何设计/构建一个能够消耗数TB数据并对检索到的数据进行一些计算的Web服务客户端的正确方向吗?

我在新工作中继承了一个项目。该项目是在我加入团队前几周由该团队设计并启动的。 该项目是关于从多个Web服务(soap& rest)中检索数据,并在存储到数据库中之前对数据执行一些计算,向用户显示并生成报告。

获取数据的过程涉及从Web服务A,B,C中提取一些数据,并使用响应向Web服务X,Y和Z发出另一个请求。 (我们无法控制Web服务生产者)。 当我们尝试对检索到的数据进行一些计算时,大多数时候内存不足,当前的实现速度非常慢。数据以兆兆字节或更多。 当前的实现使用maven / spring。

我正在为这个项目制定一个新的设计(引入一些缓存等)但我需要一些遇到此类问题的人的建议。

除了显而易见的,有什么特别的技巧或方法吗? 我知道这对某些人来说听起来像是一个愚蠢的问题,但任何指针都会有所帮助。

2 个答案:

答案 0 :(得分:1)

我自己从未做过这种事情(虽然很喜欢),但听起来我觉得你可以暂时将这些数据存储在某种数据网格中,这种网格在许多机器上水平缩放(所以你不要t耗尽内存)然后在数据中应用聚合函数,以便在将最终结果存储到结果数据库之前获得您要查找的结果。

在我的头脑中,我建议查看CassandraHDFS以查找分布式数据网格(NoSQL群集),然后Hadoop创建作业以查询/聚合/操作那个数据。

我希望有所帮助。

答案 1 :(得分:0)

处理数TB的数据总是很尴尬,因为你不能真的在内存中同时拥有它。 (好吧,不是没有一个绝对荒谬的机器。)所以你应该问一下是否有必要在内存中同时拥有所有数据 - 或者甚至只是一大块数据。可以一次处理一下吗? (现在几MB会被视为“一点点”;不要太担心将所有内容最小化到n th 度。)如果可以的话,重新设计应用程序及其部署(使用那些数据,你不能真正将它们分开),以便数据在线上或磁盘上。

你可能想要考虑流式过滤器和转换;基于MapReduce的算法是一个很好的计划。你看过Hadoop了吗?是的,我知道你并不热衷于设置类似的东西,但你真的有大量的数据,你必须考虑做正确的事情。也就是说,MapReduce只是配置滤波器和变换模式的一种方式;还有其他人。例如,您可以将后续服务请求视为一种转换,但需要注意的是,您需要注意服务所有者不要将您视为拒绝服务攻击!您可能需要考虑使用科学的工作流程系统(KeplerTaverna),因为它们被设计用于在很长的事情列表中执行相同的任务集。

您还需要小心数据传输;有了那么多数据,TCP / IP中内置的标准校验和算法就有很高的可能性。 (幸运的是,现代硬件的实际错误率大多真的低......)另外,处理这么多数据时,你需要非常小心,确保没有内存泄漏。即使是1%的1%泄漏,也可能意味着总体上存在GB大小的泄漏,这可能非常明显。