Pemecahan Masalah Kinesis Data Streams Konsumen - Amazon Kinesis Data Streams

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Pemecahan Masalah Kinesis Data Streams Konsumen

Beberapa Catatan Aliran Data Kinesis Dilewati Saat Menggunakan Perpustakaan Klien Kinesis

Penyebab paling umum dari catatan yang dilewati adalah pengecualian yang tidak tertangani yang dilemparkan. processRecords Perpustakaan Klien Kinesis (KCL) bergantung pada processRecords kode Anda untuk menangani pengecualian apa pun yang muncul dari pemrosesan catatan data. Setiap pengecualian yang dilemparkan processRecords diserap oleh KCL. Untuk menghindari percobaan ulang tak terbatas pada kegagalan berulang, KCL tidak mengirim ulang batch catatan yang diproses pada saat pengecualian. KCL kemudian memanggil processRecords batch rekaman data berikutnya tanpa memulai ulang prosesor rekaman. Ini secara efektif menghasilkan aplikasi konsumen yang mengamati catatan yang dilewati. Untuk mencegah catatan yang dilewati, tangani semua pengecualian di dalamnya processRecords dengan tepat.

Catatan Milik Pecahan yang Sama Diproses oleh Prosesor Rekaman yang Berbeda pada Saat yang Sama

Untuk aplikasi Kinesis Client Library (KCL) yang berjalan, pecahan hanya memiliki satu pemilik. Namun, beberapa prosesor rekaman dapat memproses pecahan yang sama untuk sementara. Dalam kasus instance pekerja yang kehilangan konektivitas jaringan, KCL mengasumsikan bahwa pekerja yang tidak dapat dijangkau tidak lagi memproses catatan, setelah waktu failover berakhir, dan mengarahkan instance pekerja lain untuk mengambil alih. Untuk waktu yang singkat, prosesor rekaman baru dan prosesor rekaman dari pekerja yang tidak terjangkau dapat memproses data dari pecahan yang sama.

Anda harus menetapkan waktu failover yang sesuai untuk aplikasi Anda. Untuk aplikasi latensi rendah, default 10 detik mungkin mewakili waktu maksimum yang ingin Anda tunggu. Namun, dalam kasus di mana Anda mengharapkan masalah konektivitas seperti melakukan panggilan di seluruh wilayah geografis di mana konektivitas dapat hilang lebih sering, jumlah ini mungkin terlalu rendah.

Aplikasi Anda harus mengantisipasi dan menangani skenario ini, terutama karena konektivitas jaringan biasanya dikembalikan ke pekerja yang sebelumnya tidak dapat dijangkau. Jika prosesor rekaman memiliki pecahan yang diambil oleh prosesor rekaman lain, ia harus menangani dua kasus berikut untuk melakukan shutdown yang anggun:

  1. Setelah panggilan saat ini processRecords selesai, KCL memanggil metode shutdown pada prosesor rekaman dengan alasan shutdown 'ZOMBIE'. Prosesor rekaman Anda diharapkan untuk membersihkan sumber daya apa pun yang sesuai dan kemudian keluar.

  2. Ketika Anda mencoba untuk memeriksa dari pekerja 'zombie', KCL melempar. ShutdownException Setelah menerima pengecualian ini, kode Anda diharapkan keluar dari metode saat ini dengan bersih.

Untuk informasi selengkapnya, lihat Menangani Rekaman Duplikat.

Aplikasi Konsumen Membaca pada Tingkat Lebih Lambat Dari yang Diharapkan

Alasan paling umum untuk throughput baca lebih lambat dari yang diharapkan adalah sebagai berikut:

  1. Beberapa aplikasi konsumen memiliki total pembacaan melebihi batas per pecahan. Untuk informasi selengkapnya, lihat Kuota dan Batas. Dalam hal ini, tingkatkan jumlah pecahan dalam aliran data Kinesis.

  2. Batas yang menentukan jumlah maksimum GetRecords per panggilan mungkin telah dikonfigurasi dengan nilai rendah. Jika Anda menggunakan KCL, Anda mungkin telah mengonfigurasi pekerja dengan nilai rendah untuk maxRecords properti tersebut. Secara umum, kami sarankan menggunakan default sistem untuk properti ini.

  3. Logika di dalam processRecords panggilan Anda mungkin memakan waktu lebih lama dari yang diharapkan karena sejumlah alasan yang mungkin; logikanya mungkin intensif CPU, pemblokiran I/O, atau macet pada sinkronisasi. Untuk menguji apakah ini benar, uji coba jalankan prosesor rekaman kosong dan bandingkan throughput baca. Untuk informasi tentang cara mengikuti data yang masuk, lihatResharding, Scaling, dan Pemrosesan Paralel.

Jika Anda hanya memiliki satu aplikasi konsumen, selalu mungkin untuk membaca setidaknya dua kali lebih cepat dari tarif put. Itu karena Anda dapat menulis hingga 1.000 catatan per detik untuk menulis, hingga total tingkat penulisan data maksimum 1 MB per detik (termasuk kunci partisi). Setiap pecahan terbuka dapat mendukung hingga 5 transaksi per detik untuk pembacaan, hingga total kecepatan baca data maksimum 2 MB per detik. Perhatikan bahwa setiap pembacaan (GetRecordspanggilan) mendapat sekumpulan catatan. Ukuran data yang dikembalikan GetRecords bervariasi tergantung pada pemanfaatan pecahan. Ukuran maksimum data yang GetRecords dapat dikembalikan adalah 10 MB. Jika panggilan mengembalikan batas itu, panggilan berikutnya dilakukan dalam 5 detik berikutnyaProvisionedThroughputExceededException.

GetRecords Mengembalikan Array Catatan Kosong Bahkan Ketika Ada Data di Stream

Mengkonsumsi, atau mendapatkan catatan adalah model tarik. Pengembang diharapkan untuk memanggil GetRecordsdalam loop kontinu tanpa back-off. Setiap panggilan untuk GetRecords juga mengembalikan ShardIterator nilai, yang harus digunakan dalam iterasi berikutnya dari loop.

GetRecordsOperasi tidak memblokir. Sebaliknya, ia segera kembali; dengan catatan data yang relevan atau dengan Records elemen kosong. RecordsElemen kosong dikembalikan dalam dua kondisi:

  1. Tidak ada lagi data saat ini di pecahan.

  2. Tidak ada data di dekat bagian pecahan yang ditunjukkan oleh. ShardIterator

Kondisi terakhir tidak kentara, tetapi merupakan tradeoff desain yang diperlukan untuk menghindari waktu pencarian (latensi) tak terbatas saat mengambil catatan. Dengan demikian, aplikasi yang memakan streaming harus mengulang dan memanggilGetRecords, menangani catatan kosong sebagai hal yang biasa.

Dalam skenario produksi, satu-satunya waktu loop kontinu harus keluar adalah ketika NextShardIterator nilainya. NULL KapanNULL, NextShardIterator itu berarti bahwa pecahan saat ini telah ditutup dan ShardIterator nilainya akan melewati rekor terakhir. Jika aplikasi yang mengkonsumsi tidak pernah memanggil SplitShard atauMergeShards, pecahan tetap terbuka dan panggilan untuk GetRecords tidak pernah mengembalikan NextShardIterator nilai yang adaNULL.

Jika Anda menggunakan Kinesis Client Library (KCL), pola konsumsi di atas diabstraksikan untuk Anda. Ini termasuk penanganan otomatis satu set pecahan yang berubah secara dinamis. Dengan KCL, pengembang hanya memasok logika untuk memproses catatan yang masuk. Ini dimungkinkan karena perpustakaan membuat panggilan terus menerus GetRecords untuk Anda.

Shard Iterator Kedaluwarsa Tanpa Diduga

Sebuah iterator shard baru dikembalikan oleh setiap GetRecords permintaan (asNextShardIterator), yang kemudian Anda gunakan dalam GetRecords permintaan berikutnya (asShardIterator). Biasanya, iterator pecahan ini tidak kedaluwarsa sebelum Anda menggunakannya. Namun, Anda mungkin menemukan bahwa iterator shard kedaluwarsa karena Anda belum menelepon GetRecords lebih dari 5 menit, atau karena Anda telah melakukan restart aplikasi konsumen Anda.

Jika iterator shard segera kedaluwarsa, sebelum Anda dapat menggunakannya, ini mungkin menunjukkan bahwa tabel DynamoDB yang digunakan oleh Kinesis tidak memiliki kapasitas yang cukup untuk menyimpan data sewa. Situasi ini lebih mungkin terjadi jika Anda memiliki sejumlah besar pecahan. Untuk mengatasi masalah ini, tingkatkan kapasitas tulis yang ditetapkan ke tabel pecahan. Untuk informasi selengkapnya, lihat Menggunakan Meja Sewa untuk Melacak Pecahan yang Diproses oleh Aplikasi Konsumen KCL.

Pemrosesan Rekor Konsumen Tertinggal

Untuk sebagian besar kasus penggunaan, aplikasi konsumen membaca data terbaru dari aliran. Dalam keadaan tertentu, bacaan konsumen mungkin tertinggal, yang mungkin tidak diinginkan. Setelah Anda mengidentifikasi seberapa jauh di belakang konsumen Anda membaca, lihat alasan paling umum mengapa konsumen tertinggal.

Mulailah dengan GetRecords.IteratorAgeMilliseconds metrik, yang melacak posisi baca di semua pecahan dan konsumen di aliran. Perhatikan bahwa jika usia iterator melewati 50% dari periode retensi (secara default, 24 jam, dapat dikonfigurasi hingga 365 hari), ada risiko kehilangan data karena kedaluwarsa rekaman. Solusi sementara cepat adalah meningkatkan periode retensi. Ini menghentikan hilangnya data penting saat Anda memecahkan masalah lebih lanjut. Untuk informasi selengkapnya, lihat Memantau Layanan Amazon Kinesis Data Streams dengan Amazon CloudWatch. Selanjutnya, identifikasi seberapa jauh di belakang aplikasi konsumen Anda membaca dari setiap pecahan menggunakan CloudWatch metrik khusus yang dipancarkan oleh Kinesis Client Library (KCL),. MillisBehindLatest Untuk informasi selengkapnya, lihat Memantau Perpustakaan Klien Kinesis dengan Amazon CloudWatch.

Berikut adalah alasan paling umum konsumen dapat tertinggal:

  • Peningkatan besar yang tiba-tiba ke GetRecords.IteratorAgeMilliseconds atau MillisBehindLatest biasanya menunjukkan masalah sementara, seperti kegagalan operasi API ke aplikasi hilir. Anda harus menyelidiki peningkatan mendadak ini jika salah satu metrik secara konsisten menampilkan perilaku ini.

  • Peningkatan bertahap pada metrik ini menunjukkan bahwa konsumen tidak mengikuti aliran karena tidak memproses catatan dengan cukup cepat. Akar penyebab paling umum untuk perilaku ini adalah sumber daya fisik yang tidak mencukupi atau logika pemrosesan catatan yang belum diskalakan dengan peningkatan throughput aliran. Anda dapat memverifikasi perilaku ini dengan melihat CloudWatch metrik kustom lain yang dipancarkan KCL terkait dengan processTask operasi, termasukRecordProcessor.processRecords.Time,, dan. Success RecordsProcessed

    • Jika Anda melihat peningkatan processRecords.Time metrik yang berkorelasi dengan peningkatan throughput, Anda harus menganalisis logika pemrosesan catatan Anda untuk mengidentifikasi mengapa metrik tidak menskalakan dengan peningkatan throughput.

    • Jika Anda melihat peningkatan processRecords.Time nilai yang tidak berkorelasi dengan peningkatan throughput, periksa untuk melihat apakah Anda melakukan panggilan pemblokiran di jalur kritis, yang sering menjadi penyebab perlambatan dalam pemrosesan catatan. Pendekatan alternatif adalah meningkatkan paralelisme Anda dengan meningkatkan jumlah pecahan. Terakhir, konfirmasikan bahwa Anda memiliki jumlah sumber daya fisik yang memadai (memori, pemanfaatan CPU, dll.) Pada node pemrosesan yang mendasarinya selama permintaan puncak.

Kesalahan izin kunci master KMS yang tidak sah

Kesalahan ini terjadi ketika aplikasi konsumen membaca dari aliran terenkripsi tanpa izin pada kunci master KMS. Untuk menetapkan izin ke aplikasi untuk mengakses kunci KMS, lihat Menggunakan Kebijakan Utama di KMS dan Menggunakan Kebijakan IAM dengan AWS KMS. AWS

Masalah umum, pertanyaan, dan ide pemecahan masalah bagi konsumen