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