amazon-web-services - 您如何处理Amazon Kinesis Record重复项?

标签 amazon-web-services amazon-dynamodb amazon-kinesis amazon-elasticache amazon-elasticsearch

根据Amazon Kinesis Streams documentation,一条记录可以多次传递。

确保只处理一次所有记录的唯一方法是将它们临时存储在支持完整性检查的数据库(例如DynamoDB,Elasticache或MySQL / PostgreSQL)中,或者仅检查每个Kinesis分片的RecordId。

您知道更好/更有效的方式来处理重复项吗?

最佳答案

在为移动应用程序构建遥测系统时,我们确实遇到了这个问题。在我们的案例中,我们还不确定生产者将每个消息发送一次,因此,对于每个接收到的记录,我们都会即时计算其MD5并检查它是否以某种持久存储形式出现,但实际上使用的是哪种存储。最棘手的。

首先,我们尝试了琐碎的关系数据库,但是它很快成为整个系统的主要瓶颈,因为这不仅是读取繁重的情况,也是写入繁重的情况,因为通过Kinesis传递的数据量非常大。

我们最终有了一个DynamoDB表,用于存储每个唯一消息的MD5。我们遇到的问题是删除消息并不是那么容易-尽管我们的表包含分区键和排序键,但DynamoDB不允许删除具有给定分区键的所有记录,我们必须查询所有以获得排序键值(浪费时间和容量)。不幸的是,我们不得不偶尔将整个表放下。次优解决方案的另一种方法是定期轮换存储消息标识符的DynamoDB表。

但是,最近DynamoDB引入了一个非常方便的功能-Time To Live,这意味着现在我们可以通过启用每个记录的自动过期来控制表的大小。从这个意义上讲,DynamoDB似乎与ElastiCache非常相似,但是ElastiCache(至少是Memcached集群)的持久性要差得多-那里没有冗余,并且在扩展规模或发生故障的情况下,位于终止节点上的所有数据都会丢失。

关于amazon-web-services - 您如何处理Amazon Kinesis Record重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057954/

相关文章:

amazon-kinesis - AWS Kinesis Stream Consumer使用推还是拉协议(protocol)?

amazon-web-services - 如何查询AWS堆栈输出?

amazon-web-services - 如何使用 Terraform 添加或删除安全组的入口/导出规则?

go - 用主键和排序键上的两个条件查询表

java - 本地运行的 DynamoDb 的默认预配置吞吐量(读取和写入容量单位)是多少?

amazon-kinesis - Kinesis 分区键始终位于同一个分片中

postgresql - 带有 Postgres 的 AWS RDS : Is OOM killer configured

python - 如何获取 S3 存储桶中所有不同前缀的列表?

mysql - AWS DynamoDB 和 RDS 多区域同步

python - 如何访问来自 AWS Kinesis Data Stream 事件的数据?