2016-01-16 34 views
4

我读了官方AWS Kinesis Firehose的文档,但没有提及如何处理重复的事件。有没有人有经验呢?我搜索了一些人使用ElasticCache进行过​​滤,这是否意味着我需要使用AWS Lambda来封装过滤逻辑?是否有任何简单的方法像Firehose将数据摄入Redshift中,同时具有“恰好一次”的语义?非常感谢!如何对从AWS Kinesis Firehose到Redshift的记录进行重复数据删除?

+0

嗨!你能链接或引用这样的文件吗?谢谢。 – MattAllegro

+1

您在这里:http://blog.flux7.com/amazon-kinesis-a-use-case –

回答

9

您可以在Kinesis Stream的两侧进行复制。您可能会将相同的事件两次放入流中,并且可能会由消费者两次读取事件。

如果您尝试将事件放入Kinesis流中,但由于某种原因,您不确定它是否成功写入,并且您决定再次放入,生产者端可能会发生。如果您正在获取一批事件并开始处理它们,并且在设法检查您的位置之前崩溃,并且下一个工作人员正在从Kinesis流中选择同一批事件(基于上一个检查点)序列ID。

在你开始解决这个问题之前,你应该评估你有多少次这样的重复以及这种重复对业务有什么影响。并非每个系统都在处理不能容忍重复的金融交易。但是,如果您决定需要重复数据删除,则解决该问题的常用方法是使用某个事件ID并追踪是否已处理该事件ID。

ElasticCache with Redis是一个跟踪事件ID的好地方。每次你选择一个事件进行处理时,你都会检查你是否已经在Redis的哈希表中找到了它,如果你找到它,就跳过它,如果你没有找到它,就把它添加到表中基于这种重复的可能时间窗口的一些TTL)。

如果您选择使用Kinesis Firehose(而不是Kinesis Streams),则不再控制消费者应用程序,并且无法实现此过程。因此,您可能希望在生产者端运行这种重复数据删除逻辑,转而使用Kinesis Streams并在Lambda或KCL中运行您自己的代码,或者在Redshift中解决重复数据删除功能(见下文)。

如果您对复制不太敏感,则可以在Redshift中使用一些函数,例如WINDOW函数中的COUNT DISTINCT或LAST_VALUE。

+0

感谢您的回答。我的用例场景是财务计算,因此它不能容忍重复。我现在关心的是在这种重复数据删除用例中应该使用哪种类型的ElasticCache? Memcache或Redis。 –

+0

可能Redis,更好的TPS和密钥的内存大小非常小,并且可以适合单个实例。 – Guy

相关问题