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



我正在开发一个应用程序,该应用程序使用Kinesis客户端库(KCL)从AWS Kinesis流中读取和处理事件。我不希望事件生成器端出现延迟,因此使用KinesisAncClient发送事件。然而,为了使我的事件处理正常工作,我需要在生产者端以"我调用putRecordAsync的顺序"处理evens。此信息可作为每个Kinesis记录中的时间戳字段使用。

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

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

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

现在,如果延迟真的是你的生产者的一个问题:

  1. 如果可能的话,一定要打电话给PutRecords(而不是PutRecord)——这肯定会为你节省一些网络往返行程。

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

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

最新更新