Kinesis:关闭工人的最佳/安全方法是什么?

时间:2015-04-25 00:17:20

标签: java multithreading amazon-web-services aws-sdk amazon-kinesis

我正在使用AWS Kinesis Client Library

我需要一种在部署期间关闭Kinesis Worker线程的方法,这样我就停在检查点而不是processRecords()的中间。

我在Worker.java中看到一个关闭布尔值,但它是私有的。

我需要的原因是检查点和幂等性对我来说至关重要,我不想在批处理中杀死这个过程。

[编辑]

感谢@CaptainMurphy,我注意到Worker.java公开了shutdown()方法,它安全地关闭了工作人员和LeaseCoordinator。它没有做的是在shutdown()中调用IRecordProcessor任务。它突然终止IRecordProcessor而不用担心国家。

我确实理解KCL无法保证检查点之间的幂等性,并且开发人员应该使设计容错,但我觉得IRecordProcessor应该在LeaseCoordinator停止之前正确关闭,无论如何。

2 个答案:

答案 0 :(得分:1)

当您在Worker上调用shutdown时,确实会调用Record Processor关闭方法。您可以从ShutdownTask类中追溯它,该类由ShardConsumer类创建,该类由Worker关闭。

因此,您可以通过侦听关闭调用来检查最后收到的记录,在最后一个处理值的迭代点将最后一个序列接收函数传递给checkpointer。例如。在你被覆盖的processRecords()中:

for(Record currRecord : records)
{
    someProcessSingleRecordMethod(currRecord)
    if(shutdown) 
    { 
        checkpointer.checkpoint(currRecord.getSequenceNumber()); 
        return; 
    } 
}

您的shutdown方法将shutdown标志设置为true。

请注意,对于Kinesis应用程序来说,最好的做法是设置在"至少一次"在非正常关闭的情况下,例如实例终止。接收和处理"只需一次"可能不是Kinesis的一个很好的用例。

答案 1 :(得分:1)

由于版本1.7.1(请参阅下面的注释),应用程序可以请求正常关闭,并且实现IShutdownNotificationAware的记录处理器将有机会在关闭之前检查点。

  • 确保记录处理器除IShutdownNotificationAware个接口之外还实现IRecordProcessor接口。在shutdownRequested(IRecordProcessorCheckpointer checkpointer)方法中调用检查点。注意 - 如果关闭原因是TERMINATE,则IRecordProcessor的shutdown方法应仅调用检查点
  • 关于应用程序关闭启动工作程序关闭过程

    Future<Void> shutdown = worker.requestShutdown();
    shutdown.get(); // wait for shutdown complete
    

PS:版本1.7.4之前的Kinesis客户端包含阻止正确关闭的竞争条件。因此,请使用1.7.4或更高版本。