如何在 KCL 中重新排序异步发送的 Kinesis 事件

How to reorder asynchronously sent Kinesis Events inside the KCL

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

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

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

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

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

  1. 确保尽可能调用 PutRecords(而不是 PutRecord)——这肯定会为您节省一些网络往返次数。

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

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