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

时间:2016-04-05 14:38:55

标签: amazon-web-services amazon-kinesis

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

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

1 个答案:

答案 0 :(得分:0)

如果订购很重要,请使用async客户端。

异步客户端只是使用封面下的线程池来进行完全相同的调用 - 因为它是多线程的,你无法保证这些线程的执行顺序,因此,你无法控制Kinesis收到这些记录的顺序。

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

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

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

  3. 要记住的其他一些事项 - 如果这还不够快,以使您的进程内队列保持接近空,这表明您有足够大的数据吞吐量,您需要多个线程放置数据,你不再有确切的订购。如果是这种情况,我强烈建议在您的记录中提供序列号,这样您就可以在必要时在消费者方面对它们进行重新排序(也考虑将SQS作为起点而不是Kinesis)情况下)