Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Migrasi dari KCL 1.x ke KCL 3.5.x+
Gambaran umum
Panduan ini memberikan petunjuk untuk memigrasikan aplikasi konsumen Anda dari KCL 1.x ke KCL 3.5.x+. Karena perbedaan arsitektur antara KCL 1.x dan KCL 3.5.x+, migrasi memerlukan pembaruan beberapa komponen untuk memastikan kompatibilitas.
KCL 1.x menggunakan kelas dan antarmuka yang berbeda dibandingkan dengan KCL 3.5.x+. Anda harus memigrasikan prosesor rekaman, pabrik prosesor rekaman, dan kelas pekerja ke format yang kompatibel dengan KCL 3.5.x+ terlebih dahulu, dan ikuti langkah-langkah migrasi untuk migrasi KCL 1.x ke KCL 3.5.x+.
catatan
KCL 3.5.x+ didukung dengan Amazon DynamoDB Streams Kinesis Adapter versi 2.4.x+ di situs web.
Langkah migrasi
Topik
Langkah 1: Migrasikan prosesor rekaman
Contoh berikut menunjukkan prosesor rekaman yang diimplementasikan untuk adaptor KCL 1.x DynamoDB Streams Kinesis:
package com.amazonaws.kcl; import com.amazonaws.services.kinesis.clientlibrary.exceptions.InvalidStateException; import com.amazonaws.services.kinesis.clientlibrary.exceptions.ShutdownException; import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessorCheckpointer; import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessor; import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IShutdownNotificationAware; import com.amazonaws.services.kinesis.clientlibrary.lib.worker.ShutdownReason; import com.amazonaws.services.kinesis.clientlibrary.types.InitializationInput; import com.amazonaws.services.kinesis.clientlibrary.types.ProcessRecordsInput; import com.amazonaws.services.kinesis.clientlibrary.types.ShutdownInput; public class StreamsRecordProcessor implements IRecordProcessor, IShutdownNotificationAware { @Override public void initialize(InitializationInput initializationInput) { // // Setup record processor // } @Override public void processRecords(ProcessRecordsInput processRecordsInput) { for (Record record : processRecordsInput.getRecords()) { String data = new String(record.getData().array(), Charset.forName("UTF-8")); System.out.println(data); if (record instanceof RecordAdapter) { // record processing and checkpointing logic } } } @Override public void shutdown(ShutdownInput shutdownInput) { if (shutdownInput.getShutdownReason() == ShutdownReason.TERMINATE) { try { shutdownInput.getCheckpointer().checkpoint(); } catch (ShutdownException | InvalidStateException e) { throw new RuntimeException(e); } } } @Override public void shutdownRequested(IRecordProcessorCheckpointer checkpointer) { try { checkpointer.checkpoint(); } catch (ShutdownException | InvalidStateException e) { // // Swallow exception // e.printStackTrace(); } } }
Untuk memigrasikan RecordProcessor kelas
-
Ubah antarmuka dari
com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessordancom.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IShutdownNotificationAwarekecom.amazonaws.services.dynamodbv2.streamsadapter.processor.DynamoDBStreamsShardRecordProcessorsebagai berikut:// import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessor; // import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IShutdownNotificationAware; import com.amazonaws.services.dynamodbv2.streamsadapter.processor.DynamoDBStreamsShardRecordProcessor; -
Perbarui pernyataan impor untuk
processRecordsmetodeinitializedan:// import com.amazonaws.services.kinesis.clientlibrary.types.InitializationInput; import software.amazon.kinesis.lifecycle.events.InitializationInput; // import com.amazonaws.services.kinesis.clientlibrary.types.ProcessRecordsInput; import com.amazonaws.services.dynamodbv2.streamsadapter.model.DynamoDBStreamsProcessRecordsInput; -
Ganti
shutdownRequestedmetode dengan metode baru berikut:leaseLost,shardEnded, danshutdownRequested.// @Override // public void shutdownRequested(IRecordProcessorCheckpointer checkpointer) { // // // // This is moved to shardEnded(...) and shutdownRequested(ShutdownReauestedInput) // // // try { // checkpointer.checkpoint(); // } catch (ShutdownException | InvalidStateException e) { // // // // Swallow exception // // // e.printStackTrace(); // } // } @Override public void leaseLost(LeaseLostInput leaseLostInput) { } @Override public void shardEnded(ShardEndedInput shardEndedInput) { try { shardEndedInput.checkpointer().checkpoint(); } catch (ShutdownException | InvalidStateException e) { // // Swallow the exception // e.printStackTrace(); } } @Override public void shutdownRequested(ShutdownRequestedInput shutdownRequestedInput) { try { shutdownRequestedInput.checkpointer().checkpoint(); } catch (ShutdownException | InvalidStateException e) { // // Swallow the exception // e.printStackTrace(); } }
Berikut ini adalah versi terbaru dari kelas prosesor rekaman:
package com.amazonaws.codesamples; import software.amazon.kinesis.exceptions.InvalidStateException; import software.amazon.kinesis.exceptions.ShutdownException; import software.amazon.kinesis.lifecycle.events.InitializationInput; import software.amazon.kinesis.lifecycle.events.LeaseLostInput; import com.amazonaws.services.dynamodbv2.streamsadapter.model.DynamoDBStreamsProcessRecordsInput; import software.amazon.kinesis.lifecycle.events.ShardEndedInput; import software.amazon.kinesis.lifecycle.events.ShutdownRequestedInput; import software.amazon.dynamodb.streamsadapter.processor.DynamoDBStreamsShardRecordProcessor; import software.amazon.dynamodb.streamsadapter.adapter.DynamoDBStreamsKinesisClientRecord; import com.amazonaws.services.dynamodbv2.streamsadapter.processor.DynamoDBStreamsShardRecordProcessor; import com.amazonaws.services.dynamodbv2.streamsadapter.adapter.DynamoDBStreamsClientRecord; import software.amazon.awssdk.services.dynamodb.model.Record; public class StreamsRecordProcessor implements DynamoDBStreamsShardRecordProcessor { @Override public void initialize(InitializationInput initializationInput) { } @Override public void processRecords(DynamoDBStreamsProcessRecordsInput processRecordsInput) { for (DynamoDBStreamsKinesisClientRecord record: processRecordsInput.records()) Record ddbRecord = record.getRecord(); // processing and checkpointing logic for the ddbRecord } } @Override public void leaseLost(LeaseLostInput leaseLostInput) { } @Override public void shardEnded(ShardEndedInput shardEndedInput) { try { shardEndedInput.checkpointer().checkpoint(); } catch (ShutdownException | InvalidStateException e) { // // Swallow the exception // e.printStackTrace(); } } @Override public void shutdownRequested(ShutdownRequestedInput shutdownRequestedInput) { try { shutdownRequestedInput.checkpointer().checkpoint(); } catch (ShutdownException | InvalidStateException e) { // // Swallow the exception // e.printStackTrace(); } } }
catatan
DynamoDB Streams Kinesis Adapter sekarang menggunakan model SdKv2 Record. Di SdKv2, AttributeValue objek kompleks (BS,,, NS ML,SS) tidak pernah mengembalikan null. Gunakan hasSs() metode hasBs()hasNs(),,hasM(),hasL(), untuk memverifikasi apakah nilai-nilai ini ada.
Langkah 2: Migrasikan pabrik prosesor rekaman
Pabrik pengolah rekaman bertanggung jawab untuk membuat prosesor rekaman ketika sewa diperoleh. Berikut ini adalah contoh pabrik KCL 1.x:
package com.amazonaws.codesamples; import software.amazon.dynamodb.AmazonDynamoDB; import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessor; import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessorFactory; public class StreamsRecordProcessorFactory implements IRecordProcessorFactory { @Override public IRecordProcessor createProcessor() { return new StreamsRecordProcessor(dynamoDBClient, tableName); } }
Untuk memigrasikan RecordProcessorFactory
-
Ubah antarmuka yang diimplementasikan dari
com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessorFactorykesoftware.amazon.kinesis.processor.ShardRecordProcessorFactory, sebagai berikut:// import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessor; import software.amazon.kinesis.processor.ShardRecordProcessor; // import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessorFactory; import software.amazon.kinesis.processor.ShardRecordProcessorFactory; // public class TestRecordProcessorFactory implements IRecordProcessorFactory { public class StreamsRecordProcessorFactory implements ShardRecordProcessorFactory { Change the return signature for createProcessor. // public IRecordProcessor createProcessor() { public ShardRecordProcessor shardRecordProcessor() {
Berikut ini adalah contoh pabrik prosesor rekaman di 3.5.x+:
package com.amazonaws.codesamples; import software.amazon.kinesis.processor.ShardRecordProcessor; import software.amazon.kinesis.processor.ShardRecordProcessorFactory; public class StreamsRecordProcessorFactory implements ShardRecordProcessorFactory { @Override public ShardRecordProcessor shardRecordProcessor() { return new StreamsRecordProcessor(); } }
Langkah 3: Migrasikan pekerja
Di versi 3.5.x+ dari KCL, kelas baru, yang disebut Scheduler, menggantikan kelas Worker. Berikut ini adalah contoh pekerja KCL 1.x:
final KinesisClientLibConfiguration config = new KinesisClientLibConfiguration(...) final IRecordProcessorFactory recordProcessorFactory = new RecordProcessorFactory(); final Worker worker = StreamsWorkerFactory.createDynamoDbStreamsWorker( recordProcessorFactory, workerConfig, adapterClient, amazonDynamoDB, amazonCloudWatchClient);
Untuk memigrasikan pekerja
-
Ubah
importpernyataan untukWorkerkelas menjadi pernyataan impor untukConfigsBuilderkelasSchedulerdan.// import com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker; import software.amazon.kinesis.coordinator.Scheduler; import software.amazon.kinesis.common.ConfigsBuilder; -
Imp
StreamTrackeror dan ubah imporStreamsWorkerFactorykeStreamsSchedulerFactory.import software.amazon.kinesis.processor.StreamTracker; // import software.amazon.dynamodb.streamsadapter.StreamsWorkerFactory; import software.amazon.dynamodb.streamsadapter.StreamsSchedulerFactory; -
Pilih posisi dari mana untuk memulai aplikasi. Bisa jadi
TRIM_HORIZONatauLATEST.import software.amazon.kinesis.common.InitialPositionInStream; import software.amazon.kinesis.common.InitialPositionInStreamExtended; -
Buat
StreamTrackercontoh.StreamTracker streamTracker = StreamsSchedulerFactory.createSingleStreamTracker( streamArn, InitialPositionInStreamExtended.newInitialPosition(InitialPositionInStream.TRIM_HORIZON) ); -
Buat
AmazonDynamoDBStreamsAdapterClientobjek.import software.amazon.dynamodb.streamsadapter.AmazonDynamoDBStreamsAdapterClient; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; ... AwsCredentialsProvider credentialsProvider = DefaultCredentialsProvider.create(); AmazonDynamoDBStreamsAdapterClient adapterClient = new AmazonDynamoDBStreamsAdapterClient( credentialsProvider, awsRegion); -
Buat
ConfigsBuilderobjek.import software.amazon.kinesis.common.ConfigsBuilder; ... ConfigsBuilder configsBuilder = new ConfigsBuilder( streamTracker, applicationName, adapterClient, dynamoDbAsyncClient, cloudWatchAsyncClient, UUID.randomUUID().toString(), new StreamsRecordProcessorFactory()); -
Buat
SchedulerpenggunaanConfigsBuilderseperti yang ditunjukkan pada contoh berikut:import java.util.UUID; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient; import software.amazon.awssdk.services.kinesis.KinesisAsyncClient; import software.amazon.kinesis.common.KinesisClientUtil; import software.amazon.kinesis.coordinator.Scheduler; ... DynamoDbAsyncClient dynamoClient = DynamoDbAsyncClient.builder().region(region).build(); CloudWatchAsyncClient cloudWatchClient = CloudWatchAsyncClient.builder().region(region).build(); DynamoDBStreamsPollingConfig pollingConfig = new DynamoDBStreamsPollingConfig(adapterClient); pollingConfig.idleTimeBetweenReadsInMillis(idleTimeBetweenReadsInMillis); // Use ConfigsBuilder to configure settings RetrievalConfig retrievalConfig = configsBuilder.retrievalConfig(); retrievalConfig.retrievalSpecificConfig(pollingConfig); CoordinatorConfig coordinatorConfig = configsBuilder.coordinatorConfig(); coordinatorConfig.clientVersionConfig(CoordinatorConfig.ClientVersionConfig.CLIENT_VERSION_CONFIG_COMPATIBLE_WITH_2X_PHASE1); Scheduler scheduler = StreamsSchedulerFactory.createScheduler( configsBuilder.checkpointConfig(), coordinatorConfig, configsBuilder.leaseManagementConfig(), configsBuilder.lifecycleConfig(), configsBuilder.metricsConfig(), configsBuilder.processorConfig(), retrievalConfig, adapterClient );
catatan
Migrasi KCL 3.5.x+menggunakan tiga fase:
-
Fase 1 (
CLIENT_VERSION_CONFIG_COMPATIBLE_WITH_2X_PHASE1): Mode kompatibel KCL 1.x murni. Tidak ada metadata khusus migrasi yang ditulis ke tabel sewa. Kembalikan aman ke KCL v1 dengan menyebarkan ulang kode sebelumnya. Gunakan fase ini untuk memvalidasi stabilitas. -
Tahap 2 (
CLIENT_VERSION_CONFIG_COMPATIBLE_WITH_2X): Memulai migrasi. MenWORKER_METRIC_STATSulisMigration3.0dan memasukkan ke tabel sewa. Transisi otomatis KCL ke penyeimbangan beban 3.x penuh saat semua pekerja siap. Kembalikan ke Tahap 1 didukung (melalui Alat Migrasi KCL). Kembalikan ke KCL v1 tidak lagi dimungkinkan. -
Fase 3 (
CLIENT_VERSION_CONFIG_3X): Fungsionalitas penuh KCL 3.x. Disetel secara eksplisit oleh pelanggan atau digunakan sebagai default saat konfigurasi dihapus. Status terminal, tidak ada rollback.
Pengaturan ini mempertahankan kompatibilitas antara DynamoDB Streams Kinesis Adapter untuk KCL v3 dan KCL v1, bukan antara KCL v2 dan v3.
penting
Anda harus memulai migrasi dengan CLIENT_VERSION_CONFIG_COMPATIBLE_WITH_2X_PHASE1 (Tahap 1). Fase 1 kompatibel ke belakang dengan KCL v1 dan tidak menulis entri khusus migrasi apa pun ke tabel sewa, memungkinkan rollback yang aman ke versi KCL Anda sebelumnya hanya dengan menyebarkan ulang kode Anda sebelumnya. Setelah pengujian memanggang menyeluruh di Tahap 1, Anda dapat melanjutkan ke Fase 2 (CLIENT_VERSION_CONFIG_COMPATIBLE_WITH_2X) untuk memulai migrasi penuh. Jika Anda melewatkan Tahap 1 dan memulai langsung dengan Tahap 2, entri non-sewa segera ditulis ke tabel sewa, secara permanen mencegah rollback ke KCL v1 tanpa pembersihan DynamoDB manual.
Langkah 4: Ikhtisar dan rekomendasi konfigurasi KCL 3.5.x+
Untuk penjelasan rinci tentang konfigurasi yang diperkenalkan pasca KCL 1.x yang relevan di KCL 3.5.x+ lihat konfigurasi KCL dan konfigurasi klien migrasi KCL. https://docs.aws.amazon.com//streams/latest/dev/kcl-migration.html#client-configuration
penting
Alih-alih langsung membuat objekcheckpointConfig,,,coordinatorConfig, processorConfig dan leaseManagementConfig metricsConfigretrievalConfig, sebaiknya gunakan ConfigsBuilder untuk mengatur konfigurasi di KCL 3.5.x+ dan versi yang lebih baru untuk menghindari masalah inisialisasi Penjadwal. ConfigsBuildermenyediakan cara yang lebih fleksibel dan dapat dipelihara untuk mengkonfigurasi aplikasi KCL Anda.
Konfigurasi dengan pembaruan nilai default di KCL 3.5.x +
billingMode-
Di KCL versi 1.x, nilai default untuk disetel
billingModeke.PROVISIONEDNamun, dengan KCL versi 3.5.x+, defaultnyabillingModeadalahPAY_PER_REQUEST(mode on-demand). Kami menyarankan Anda menggunakan mode kapasitas sesuai permintaan untuk tabel sewa Anda untuk menyesuaikan kapasitas secara otomatis berdasarkan penggunaan Anda. Untuk panduan menggunakan kapasitas yang disediakan untuk tabel sewa Anda, lihat Praktik terbaik untuk tabel sewa dengan mode kapasitas yang disediakan. idleTimeBetweenReadsInMillis-
Di KCL versi 1.x, nilai default untuk
idleTimeBetweenReadsInMillisdisetel menjadi 1.000 (atau 1 detik). KCL versi 3.5.x+ menetapkan nilai defaultidleTimeBetweenReadsInMillisuntuk menjadi 1.500 (atau 1,5 detik), tetapi Amazon DynamoDB Streams Kinesis Adapter mengganti nilai default menjadi 1.000 (atau 1 detik).
Konfigurasi baru di KCL 3.5.x+
leaseAssignmentIntervalMillis-
Konfigurasi ini menentukan interval waktu sebelum pecahan yang baru ditemukan mulai diproses, dan dihitung sebagai 1,5 ×
leaseAssignmentIntervalMillis. Jika pengaturan ini tidak dikonfigurasi secara eksplisit, interval waktu default menjadi 1,5 ×failoverTimeMillis. Memproses pecahan baru melibatkan pemindaian tabel sewa dan menanyakan indeks sekunder global (GSI) pada tabel sewa. MenurunkanleaseAssignmentIntervalMillispeningkatan frekuensi operasi pemindaian dan kueri ini, menghasilkan biaya DynamoDB yang lebih tinggi. Sebaiknya atur nilai ini ke 2000 (atau 2 detik) untuk meminimalkan penundaan dalam memproses pecahan baru. shardConsumerDispatchPollIntervalMillis-
Konfigurasi ini mendefinisikan interval antara jajak pendapat berturut-turut oleh konsumen shard untuk memicu transisi status. Di KCL versi 1.x, perilaku ini dikendalikan oleh
idleTimeInMillisparameter, yang tidak diekspos sebagai pengaturan yang dapat dikonfigurasi. Dengan KCL versi 3.5.x+, kami sarankan mengatur konfigurasi ini agar sesuai dengan nilai yang digunakanidleTimeInMillisdalam pengaturan KCL versi 1.x Anda.
Langkah 5: Migrasi dari KCL 2.x ke KCL 3.5.x +
Untuk memastikan transisi yang lancar dan kompatibilitas dengan versi Kinesis Client Library (KCL) terbaru, ikuti langkah 5-8 dalam petunjuk panduan migrasi untuk meningkatkan dari KCL 2.x ke KCL 3.5.x+.
Untuk masalah pemecahan masalah umum KCL 3.5.x+, lihat Memecahkan masalah aplikasi konsumen KCL.