【问题标题】:How to reorder asynchronously sent Kinesis Events inside the KCL如何在 KCL 中重新排序异步发送的 Kinesis 事件
【发布时间】:2016-07-08 15:22:07
【问题描述】:

我正在开发一个应用程序,该应用程序使用 Kinesis Client Library (KCL) 从 AWS Kinesis Stream 读取和处理事件。我不希望事件生产者一方遭受延迟,因此 KinesisAsyncClient 用于发送事件。但是,为了让我的事件处理正常工作,我需要在我的生产者端按照“我调用 putRecordAsync 的顺序”处理事件。此信息作为每个 Kinesis 记录中的时间戳字段提供。

除了切换到使用阻塞同步 Kinesis 客户端之外,还有其他解决方案可以有效地对流事件进行排序吗?

【问题讨论】:

  • 阅读器将按照事件在流中的顺序获取事件。您只能从生产者端控制事件的顺序。您可以使用 putRecords(注意 s),它将多个事件按顺序排列。您还可以使用上一个事件的 seq-id 将下一个事件放在它后面。你觉得这有意义吗?
  • @Guy 使用 Kinesis 的 Async Client 的 putRecordsAync 是否也能保证事件的顺序?
  • 使用 PutRecords(同步或异步)对 Kinesis 的 API 调用会保留调用负载中事件的顺序。如果您在客户端代码中执行额外的批处理以创建不同的 API 调用,这些事件可能不是您在多次调用中调用异步的顺序。

标签: amazon-web-services amazon-kinesis


【解决方案1】:

如果排序很重要,请不要使用异步客户端。

异步客户端只是在后台使用线程池进行完全相同的调用 - 因为它是多线程的,所以您无法保证这些线程的执行顺序,因此,您无法控制这些记录的顺序由 Kinesis 接收。

现在,如果延迟确实对您的制作人来说是个问题:

  1. 确保在可能的情况下调用 PutRecords(而不是 PutRecord) - 这肯定会为您节省一些网络往返。

  2. 与其直接调用客户端,只需将有序记录放入本地队列,并使用后台线程定期从该队列轮询调用PutRecords。

需要记住的其他一些事项 - 如果这还不足以让您的进程内队列接近空,这表明您有足够大的数据吞吐量,您需要多个线程来放置数据,并且您不再有确切的顺序。如果是这种情况,我强烈建议在您的记录中提供序列号,以便您可以在必要时在消费者方面重新排序(在这种情况下,也可以将 SQS 作为起点而不是 Kinesis)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多