从流中复制

时间:2012-03-27 18:17:51

标签: algorithm stream scalability

我们有一个不断向我们发送数据的外部服务。为了简单起见,我们假设这个数据有三个字符串,以制表符分隔的方式。

datapointA datapointB datapointC

这些数据由我们的某个服务器接收,然后转发到处理引擎,其中使用此数据集完成了一些有意义的事情。

处理引擎的一个要求是处理引擎不会处理重复的结果。因此,例如在第1天,处理引擎收到 A B C,在第243天,服务器收到了相同的A B C。在这种特殊情况下,处理引擎会发出警告,“已经处理过的记录”而不处理该特定记录。

可能有几种方法可以解决这个问题:

  • 将传入的数据存储在内存中的HashSet中,并设置排除 将指示特定记录的处理状态。 当我们将此服务运行为零时,将出现问题 停机时间,根据数据的激增,这个集合可以 超出记忆的范围。此外,在系统中断的情况下,这 数据需要在某个地方保留。

  • 将传入的数据存储在数据库中,下一组数据将会存储 只有在数据库中不存在数据时才会被处理。这
    在一些灾难的情况下,有助于历史的持久性 但是维护正确的索引和积极的工作的开销很大 在与绩效相关的问题上进行分片。

....或其他一些技术

有人可以指出一些案例研究或已建立的模式或做法来解决这一特定问题吗?

由于

2 个答案:

答案 0 :(得分:1)

无论解决方案是什么,您都需要某种支持商店,以实现持久性。所以无论需要做多少工作。但它不必是一个简单的SQL数据库 - alternative to memcached that can persist to disk

除此之外,您可以考虑使用bloom filters来减少内存占用空间。这些可能会产生误报,因此您需要回到第二个(较慢但可靠)的层(可能是磁盘存储区)。

最后,对幂等行为的需求在消息传递/企业系统中非常普遍,因此search like this会出现更多的论文/想法(不确定您是否知道“幂等”是一个有用的搜索词)。

答案 1 :(得分:1)

您可以创建数据的哈希并将其存储在后备存储中,该后备存储将小于实际数据(假设您的数据不小于哈希值)