亚马逊Kinesis和保证顺序

32

亚马逊声称他们的Kinesis流式产品保证了记录的排序。

它提供记录排序功能,以及读取和/或重播记录的能力,按照相同的顺序(...)

Kinesis由流(Streams)组成,它们本身又由一个或多个Shard组成。记录存储在这些Shard中。我们可以编写消费者应用程序连接到一个Shard并按存储顺序读取/重放记录。

但是,Kinesis是否可以直接保证Stream本身的排序,而无需将排序逻辑推入到消费者端?消费者如何从同一Stream的多个Shard中读取记录,并确保按照它们添加到Stream中的相同顺序进行读取?

6个回答

27

看起来这是不可能实现的。订单保证在分片级别上,但不能跨整个流程保证。

https://brandur.org/kinesis-order

那么回到我们最初的问题:如何确保所有记录以它们产生的顺序被消费?答案是我们无法做到,但我们不应该过分担心这个令人遗憾的事实。一旦我们将我们的流程扩展到多个分片,就没有任何机制可以用来保证记录在整个流程中按顺序被消耗,只能在单个分片内部按顺序消耗。


5
我可以证实,这个事实也被记录在官方 AWS 大数据专业课程的培训材料中。 - Glenn Bech
1
比 Kafka 更糟糕的是:当快速连续发生 puts 操作时,由于这些 put 操作在 Kinesis 数据流中几乎同时出现,因此返回的序列号不能保证增加。为了确保相同分区键的严格递增序列号,请使用 SequenceNumberForOrdering 参数,如 PutRecord 示例代码示例所示。哇...超载了吗? - aran
1
在分片级别上无法保证顺序。信息 - Lee Hannigan
1
无法保证在分片级别上进行排序。信息 - undefined

7

如果您需要保证流中所有数据的顺序,那么只能有一个分片。当然,这种方式不会很好地扩展。您需要确定的是,您是否真正需要该级别的有序数据。流中的所有数据是否与其他数据相关?关键在于在数据相关时将数据放入分片中。使用多个分片可以让您的数据并行处理。如果所有相关数据都位于一个分片中,则可以利用有保证的排序。如果您确实需要所有数据按顺序排列,则必须处理随之而来的有限扩展性。


我不需要记录排序,但问题是如果消费者崩溃,我希望从上次读取的位置读取流。我需要确保记录按照它们添加到流中的顺序读取。 - user812142

2

Kinesis 订购

Kinesis 支持每个分片的订购,但仅当您使用 PutRecord 写入分片时才支持。如果您使用批量写入 PutRecords,则会丢失排序。

PutRecord

每个数据记录都有一个唯一的序列号。在调用 client.putRecord 将数据记录添加到流后,Kinesis Data Streams 分配序列号。相同分区键的序列号通常随时间增加;PutRecord 请求之间的时间间隔越长,序列号就越大。

当连续进行 Put 操作时,返回的序列号不能保证增加,因为对于 Kinesis Data Streams 来说,这些 put 操作基本上是同时发生的。为了保证相同分区键的严格递增序列号,请使用 SequenceNumberForOrdering 参数,如 PutRecord 示例代码中所示。

无论是否使用 SequenceNumberForOrdering,通过 GetRecords 调用接收到的记录都按照序列号严格排序。

src

PutRecords

将多个数据记录一次性写入Kinesis数据流中(也称为PutRecords请求)。使用此操作将数据发送到流中进行数据摄取和处理。

响应记录数组包括成功和未成功处理的记录。 Kinesis Data Streams尝试处理每个PutRecords请求中的所有记录。 单个记录失败不会停止后续记录的处理。 因此,PutRecords不能保证记录的顺序。 如果您需要按照写入流的顺序读取记录,请改用PutRecord而不是PutRecords,并写入同一个分片。

src


0

你真的不必担心在消费者中处理顺序,因为如果你设置了适当的分区键,无论如何它们都会按顺序接收事件。确保你的分区键在将事件均匀地分发到 Kinesis 分片时维护顺序。不需要做任何其他事情来维护顺序。


0

使用分区键作为相关数据的键。例如,如果您想处理按用户排序的用户数据,则分区键可以是用户ID。因此,user1:data1、user1:data2、user1:data3将按顺序处理,而user2:data2将不在同一个分片中。


-2

在此输入图像描述

不太确定。

但是我猜他们意思是在多个分片之间可以进行排序。

我希望“数据流”意味着分片的逻辑分组。 如果这是真的,那么我想排序是可能的。

请检查并确认。


请在您的帖子中将该图像的内容作为文本包含进去。 - AMC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接