algorithm - 来自流的重复项

标签 algorithm stream scalability

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

datapointA datapointB datapointC

此数据由我们的一台服务器接收,然后转发到处理引擎,在此处理引擎对该数据集进行一些有意义的处理。

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

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

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

  • 将传入的数据存储在数据库中,下一组数据将 仅当数据不存在于数据库中时才被处理。这
    在发生灾难时有助于历史的持久性 但是有维护适当索引和攻击性的开销
    在性能相关问题的情况下进行分片。

....或其他一些技术

有人可以指出一些案例研究或既定模式或实践来解决这个特定问题吗?

谢谢

最佳答案

无论采用何种解决方案,您都需要某种后备存储来实现持久性。所以无论有多少工作都必须实现。但对于如此简单的事情,它不必是一个 sql 数据库 - alternative to memcached that can persist to disk

除此之外,您还可以考虑 bloom filters用于减少内存占用。这些可能会产生误报,因此您需要退回到第二层(速度较慢但可靠)(可能是磁盘存储)。

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

关于algorithm - 来自流的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9895229/

相关文章:

Delphi:TFileStream 读/写进度(不浪费性能)

java - SSH 与 JSch 用于具有中间输出的多个命令

c# - "Parameter not valid"加载System.Drawing.Image异常

linux - Linux 上是否还存在 Thundering Herd 问题?

oracle - 是什么使Oracle更具可扩展性?

java - 在 AppEngine 中从 Servlet 调用 Web 服务

algorithm - 所有 MPI 算法的详细信息?

algorithm - 如何生成统一的随机整数分区?

java - 寻找一种从 2 个列表中查找排序顺序的有效方法

algorithm - 互递归分析