簡體   English   中英

AWS Kinesis KCL 跳過啟動前添加的記錄

[英]AWS Kinesis KCL skips records added before startup

我開始同時使用KPLKCL在服務之間交換數據。 但是每當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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM