我正在使用AWS Kinesis Client Library。
我需要一种在部署期间关闭Kinesis Worker线程的方法,这样我就停在检查点而不是processRecords()
的中间。
我在Worker.java
中看到一个关闭布尔值,但它是私有的。
我需要的原因是检查点和幂等性对我来说至关重要,我不想在批处理中杀死这个过程。
[编辑]
感谢@CaptainMurphy,我注意到Worker.java
公开了shutdown()
方法,它安全地关闭了工作人员和LeaseCoordinator
。它没有做的是在shutdown()
中调用IRecordProcessor
任务。它突然终止IRecordProcessor
而不用担心国家。
我确实理解KCL无法保证检查点之间的幂等性,并且开发人员应该使设计容错,但我觉得IRecordProcessor
应该在LeaseCoordinator
停止之前正确关闭,无论如何。
答案 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或更高版本。