![](/img/trans.png)
[英]How does LATEST position in stream works in Kinesis, KCL?
[英]AWS Kinesis KCL skips records added before startup
我開始同時使用KPL
和KCL
在服務之間交換數據。 但是每當consumer service
離線時, KPL
發送的所有數據將永遠丟失。 所以我只得到那些在consumer service
啟動並且它的shardConsumer
准備就緒時發送的數據塊。 我需要從最后消耗的點開始,或者以其他方式處理遺留的數據。
這是我的ShardProcessor
代碼:
@Override
public void initialize(InitializationInput initializationInput) {
}
@Override
public void processRecords(ProcessRecordsInput processRecordsInput) {
processRecordsInput.records()
.forEach(record -> {
//my logic
});
}
@Override
public void leaseLost(LeaseLostInput leaseLostInput) {
}
@Override
public void shardEnded(ShardEndedInput shardEndedInput) {
try {
shardEndedInput.checkpointer().checkpoint();
} catch (ShutdownException | InvalidStateException e) {
LOG.error("Kinesis error on Shard Ended", e);
}
}
@Override
public void shutdownRequested(ShutdownRequestedInput shutdownRequestedInput) {
try {
shutdownRequestedInput.checkpointer().checkpoint();
} catch (ShutdownException | InvalidStateException e) {
LOG.error("Kinesis error on Shutdown Requested", e);
}
}
和配置代碼:
public void configure(String streamName, ShardRecordProcessorFactory factory) {
Region region = Region.of(awsRegion);
KinesisAsyncClient kinesisAsyncClient =
KinesisClientUtil.createKinesisAsyncClient(KinesisAsyncClient.builder().region(region));
DynamoDbAsyncClient dynamoClient = DynamoDbAsyncClient.builder().region(region).build();
CloudWatchAsyncClient cloudWatchClient = CloudWatchAsyncClient.builder().region(region).build();
ConfigsBuilder configsBuilder =
new ConfigsBuilder(streamName, appName, kinesisAsyncClient, dynamoClient, cloudWatchClient,
UUID.randomUUID().toString(), factory);
Scheduler scheduler = new Scheduler(
configsBuilder.checkpointConfig(),
configsBuilder.coordinatorConfig(),
configsBuilder.leaseManagementConfig(),
configsBuilder.lifecycleConfig(),
configsBuilder.metricsConfig(),
configsBuilder.processorConfig(),
configsBuilder.retrievalConfig()
.retrievalSpecificConfig(new PollingConfig(streamName, kinesisAsyncClient))
);
Thread schedulerThread = new Thread(scheduler);
schedulerThread.setDaemon(true);
schedulerThread.start();
}
有兩種方法可以解決這個問題。 第一,問題。
默認情況下,KCL 配置為在LATEST
開始讀取 stream。 此設置告訴 stream 讀取器在“當前”時間戳處獲取 stream。
在您的情況下,您在 stream 中擁有“現在”之前放置在那里的數據。 為了讀取該數據,您可能需要考慮讀取 stream 中最早的數據。如果您設置默認 stream,則 stream 將存儲數據 24 小時。
要從 stream 的“開頭”讀取數據,或者在您啟動 KCL 應用程序前 24 小時,您需要將 stream 讀取器設置為TRIM_HORIZON
。 此設置稱為initialPositionInStream
。 你可以在這里閱讀它。 API中記錄了三種不同的設置。
要解決您的問題,如第一個鏈接中所述,首選方法是向屬性文件添加一個條目。 如果您不使用屬性文件,則只需將其添加到您的Scheduler
構造函數中:
Scheduler scheduler = new Scheduler(
configsBuilder.checkpointConfig(),
configsBuilder.coordinatorConfig(),
configsBuilder.leaseManagementConfig(),
configsBuilder.lifecycleConfig(),
configsBuilder.metricsConfig(),
configsBuilder.processorConfig(),
configsBuilder.retrievalConfig()
.initialPositionInStreamExtended(InitialPositionInStreamExtended.newInitialPosition(TRIM_HORIZON))
.retrievalSpecificConfig(new PollingConfig(streamName, kinesisAsyncClient))
);
此設置要記住的一件事是當您在 stream 中有數據並且從TRIM_HORIZON
開始時的啟動功能。 在這種情況下, RecordProcessor
將盡可能快地遍歷記錄。 這可能會在 Kinesis API 甚至下游系統(無論您在 RecordProcessor 擁有數據后發送數據)上產生性能問題,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.