我正在将Java应用程序从Kafka转换为Kinesis。该应用程序将永远运行。它休眠30秒,然后唤醒,运行一些HBase查询,使用并处理所有新的Kafka消息,然后再次休眠。
这在Kafka中可以正常工作-这正是默认Consumer所做的。但是,在Kinesis中并非如此。从KCL进行消费需要KCL使用者始终处于运行状态,这不能满足我的需求。我需要能够通过一个方法调用按需使用所有新消息。
Kinesis Java API的官方文档说:
您按分片从流中检索记录。对于每个分片,以及从该分片中检索的每一批记录,都需要获取一个分片迭代器。
和
如果未返回任何记录,则表示该分片中当前没有可用的数据记录,而该数据由分片迭代器引用。发生这种情况时,您的应用程序应等待一段时间
但是我不在乎碎片!我只想在一次方法调用中获取自上次消费以来的所有消息。如果我的应用程序死了并且需要重启,该怎么办?它怎么知道从哪里恢复?
当前代码:
GetRecordsRequest getRecordsRequest = new GetRecordsRequest();
getRecordsRequest.setShardIterator(TRIM_HORIZON);
getRecordsRequest.setLimit(25);
GetRecordsResult result = client.getRecords(getRecordsRequest);
// Put the result into record list. The result can be empty.
records = result.getRecords();
编辑
更清楚地说,有了Kafka,我可以运行:
ConsumerRecords<String, String> records = this.consumer.poll(0);
获取所有未消耗的消息。如果我的应用程序死掉并重新启动,那没有问题,补偿会得到补偿,我将从上次中断的地方恢复。
我如何在Kinesis中做到这一点?
答案 0 :(得分:0)
要回答您的问题,可以与StockTradeRecordProcessor
一起使用,它可以选择重置统计信息,从而仅使用新消息。请参考here来找到StockTradeRecordProcessor
的实现。
但请注意,This method uses 60-second intervals for the reporting and checkpointing rate
并非您的应用程序要求的30秒。