来自流的副本
我们有一个外部服务,它不断向我们发送数据。为了简单起见,可以说这个数据有三个制表符分隔的字符串。来自流的副本
datapointA datapointB datapointC
此数据由我们的服务器的一个接收,然后转发到一些有意义的事情与此数据集做了处理引擎。
处理引擎的一个要求是重复结果不会被处理引擎处理。因此,例如在第一天,处理引擎接收到 A B C
,并且在第243天,服务器接收到相同的A B C
。在这种特殊情况下,处理引擎会发出警告“已经处理的记录”,而不处理该特定的记录。
有可能是解决这个问题的一些方法:
存储在内存中的HashSet的输入数据,并设置exculsion 将指示特定记录的处理状态。 当我们有这个服务运行零宕机时间和取决于数据激增,这个集合可以 超过内存的界限时会出现问题。另外,在系统中断的情况下,这个数据需要被保存在某个地方。
将传入数据存储在数据库中,如果数据不存在于数据库中,则仅处理下一组数据 。这个
有助于在发生某些灾难时保持历史记录的耐久性,但是在性能相关问题的情况下存在维护正确索引和激进的分解的开销。
....或其他技术
有人能指出一些个案研究或已建立的模式或做法来解决这个特定的问题?
感谢
你需要某种形式的后备存储的,持久化,任何解决方案。所以无论需要执行多少工作。但它不一定是一个如此简单的SQL数据库 - alternative to memcached that can persist to disk
除此之外,你可以考虑bloom filters减少内存占用量。这些可能导致误报,因此您需要回退到第二层(较慢但可靠)的层(可能是磁盘存储)。
最后,对幂等行为的需求在消息传递/企业系统中非常普遍,所以search like this发表了更多论文/观点(不确定是否意识到“幂等”是一个有用的搜索术语)。
您可以创建数据的哈希值,并将其存储在备份存储这将是比实际数据小(只要你的数据不低于哈希小)
谢谢!这似乎是朝着正确方向迈出的一步。 – 2012-03-28 14:45:50