当前位置: 首页 > 知识库问答 >
问题:

AWS kinesis,如果使用多个碎片,它如何确保消息的有序传递

郁明诚
2023-03-14

我计划使用DynamoDB,它的数据需要同步到CloudSearch。我知道可以使用Lambda,但我想使用运动学。所以生产者将是DynamoDB,它将为表中的每个PUT/DELETE生成流的数据。

我的设计非常直接:(假设消费者有序地接收记录)

  • 接收记录

当存在多个分片时,我无法弄清楚KCL如何确保在消费者端有序交付记录。从API留档中,我了解到

  1. 我们需要使用GetShardIterator创建每个分片迭代器
  2. 使用该分片迭代器,我可以以特定序列获取该分片的所有项目。

然而,如果我想将数据从DynamoDB同步到CloudSearch,那么我需要确保所有记录都以完全相同的顺序同步。这是我感到困惑的地方:

  1. 物品可以同时放入不同的碎片中吗
  2. (如果1是真的),那么如果我有两个碎片,我需要为每个碎片使用一个碎片编辑器,对吗
  3. (如果1,2是真的)如果我需要确保所有记录以有序的方式同步,那么我只需要一个线程,它以正确的顺序获取记录,不是吗
  4. 如果我的想法是正确的,那么我怎么能用两个碎片实现有序接收呢

共有1个答案

黄沈浪
2023-03-14

如果我的想法是正确的,那么我怎么能用两个碎片实现有序接收呢?

您不需要自己进行同步。相反,您需要仔细考虑并选择分区键,以便可以独立处理形成的分区。

例如。您正在索引记录,并且记录有一个id字段。如果您可以同时更新搜索索引中具有不同id的记录,那么记录id将是作为分区键的合适字段。

使用KCL:

它提供记录排序,以及以相同顺序读取和/或重放多个Amazon Kinesis应用程序的记录的能力。Amazon Kinesis客户端库(KCL)将给定分区键的所有记录交付给同一记录处理器,从而更容易html" target="_blank">构建从同一Amazon Kinesis流读取的多个应用程序(例如,执行计数、聚合和过滤)。

https://aws.amazon.com/kinesis/streams/

 类似资料:
  • 在下面的示例中,我有两个正在处理来自kafka的消息的服务实例,但我希望确保只在之后处理。 显然,通过将一个实例配置为仅从特定分区消费,可以很容易地解决这种情况,该分区将存储带有公共标识符的消息: 现在顺序得到了保证,将永远不会在之前处理。 但是,我在想这个问题是否可以用另一种方式来解决,直接在代码中而不是依赖基础设施?这看起来可能是微服务架构中的一个标准问题,但我不确定哪种方法是解决它的首选方法

  • 我不熟悉Kinesis,当我阅读Kinesis文档时,我意识到使用相同分区键的消息将映射到相同的切分以保证顺序。这完全有道理。然而,我想知道,如果我们在运行时增加主题碎片的数量,具有相同分区键的新消息是否会像以前一样散列到相同的碎片(旧的)中? 如果是这样,如果所有消息都提供了分区键,那么它们都不会映射到新的分片怎么办?这对我来说没有意义。 如果没有,那么Kinesis如何保证具有相同分区键的消息

  • 我想要任何关于Kafka如何维护消息序列的信息/解释,当消息被写入多个分区的主题时。例如,我有多个消息生成器,每个消息生成器按顺序生成消息,并用超过1个分区编写Kafka主题。在这种情况下,消费者组将如何工作来消费消息。

  • 我试图以一种可伸缩的方式将Spring JMS消息与@JMSListener一起使用,但我没有看到它发生。我有一个ConnectionFactory bean,它返回通过JMS和数据库数据源池连接到Oracle高级队列的工厂。 当每个@JMSListener接收器再次连接到JMS(从而连接到数据库池)时,问题就开始了。我的理解是,我可以有许多@JMSListener方法,每个服务一个,但这样做我是

  • Im将replace与addtobackstack结合起来,用于添加活动的新片段。像这样: 当用户后退两次时,我希望应用程序退出 我在这里尝试了一些答案:单击两次后退按钮以退出活动,但不会关闭应用程序,只是继续删除最后一个片段。

  • 我们公司在Go中建立了push服务,为了保证传输速度,我们在四台机器上安装了push服务,当我们需要发送通知时,我们将消息发送给rabbitMQ,然后push服务从队列中获取消息,但有时我们发现只有一台机器获取消息。 我应该如何设置配置以确保每个消费者获得相同数量的消息?