2

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

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

获取数据的过程包括从 Web 服务 A、B、C 中提取一些数据,并使用响应向 Web 服务 X、Y&Z 发出另一个请求。(我们无法控制 Web 服务生产者)。当前的实现非常慢,大多数时候我们在尝试对检索到的数据进行一些计算时会耗尽内存。数据以 TB 或更多为单位。当前的实现使用 maven/spring。

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

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

4

2 回答 2

1

我自己从来没有做过这种事情(虽然我很乐意),但在我看来,你可以将这些数据临时存储在某种数据网格中,这种数据网格可以在许多机器上水平扩展(所以你不会用完内存),然后在将最终结果存储到结果数据库之前对数据应用聚合函数以获得您正在寻找的结果。

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

我希望这会有所帮助。

于 2011-12-16T10:09:55.413 回答
0

处理数 TB 的数据总是很尴尬,因为您不能一次真正将所有数据都保存在内存中。(好吧,不是没有一台绝对荒谬的机器。)因此,您应该询问是否有必要将所有数据(甚至只是其中的一大块)一次存储在内存中。可以一次处理一点吗?(这些天,几 MB 可以算作“一点点”;不要太担心将所有内容最小化到 n。)如果可以,重新设计应用程序及其部署(有了这么多数据,你可以' t 真正将它们分开)以便数据在线或磁盘上。

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

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

于 2011-12-16T11:06:01.247 回答