6

我阅读了官方 AWS Kinesis Firehose 的文档,但没有提到如何处理重复事件。有没有人有这方面的经验?我google了有人用ElasticCache做过滤,是不是需要用AWS Lambda来封装这样的过滤逻辑?有没有像 firehose 这样的简单方法将数据摄取到 Redshift 中,同时具有“exactly once”语义?非常感谢!

4

2 回答 2

12

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

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

在您开始解决此问题之前,您应该评估此类重复的频率以及此类重复对业务的影响是什么。并非每个系统都在处理不能容忍重复的金融交易。不过,如果您决定需要进行这种重复数据删除,解决它的常用方法是使用一些事件 ID 并跟踪您是否已经处理了该事件 ID。

带有 Redis 的 ElasticCache 是跟踪事件 ID 的好地方。每次拿起一个事件进行处理时,检查是否已经在 Redis 的哈希表中存在,如果找到,则跳过它,如果没有找到,则将其添加到表中(使用基于此类复制的可能时间窗口的一些 TTL)。

如果您选择使用 Kinesis Firehose(而不是 Kinesis Streams),您将无法再控制使用者应用程序并且无法实施此过程。因此,您要么希望在生产者端运行此类重复数据删除逻辑,要么改用 Kinesis Streams 并在 Lambda 或 KCL 中运行您自己的代码,要么选择 Redshift 中的重复数据删除功能(见下文)。

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

于 2016-01-16T22:39:40.053 回答
0

Not sure if this could be a solution. But to handle duplicates, you need to write your own KCL. Firehose cannot gurantee no duplication. You can get rid of Firehose once you have your own KCL consumers that processes your data from the Kinesis Date Stream. If you do so you can follow the linked article, (full disclosure, auther here), which stores events into S3 after deduplicating and processing it through a KCL consumer.

Store events by grouping them based on the minute they were received by the Kinesis data stream by looking at their ApproximateArrivalTimestamp. This allows us to always save our events on the same key prefix, given a batch of records no matter when they are processed. For e.g. all events received by Kinesis at 2020/02/02/ 15:55 Hrs will be stored at /2020/02/02/15/55/*. Therefore, if the key is already present in the given minute, it means that the batch has already been processed and stored to S3.

You can implement your own ISequenceStore which will be implemented against Redshift in your case (In the article, it is done against S3). Read the full article below.

https://www.nabin.dev/avoiding-duplicate-records-with-aws-kcl-and-s3

于 2020-02-04T10:28:00.117 回答