Apache Kafka adalah platform streaming peristiwa dengan kinerja dan skalabilitas tinggi. Untuk membuka potensi penuh Kafka, Anda perlu mempertimbangkan desain aplikasi Anda dengan hati-hati. Sangat mudah untuk menulis aplikasi Kafka yang kinerjanya buruk atau pada akhirnya terbendung batasan skalabilitas. Sejak 2015, IBM telah menyediakan layanan IBM® Event Streams, yang merupakan layanan Apache Kafka yang terkelola sepenuhnya yang berjalan di IBM Cloud. Sejak itu, layanan ini telah membantu banyak pelanggan, dan juga berbagai tim di IBM, menyelesaikan masalah skalabilitas dan kinerja dengan aplikasi Kafka yang telah mereka tulis.
Artikel ini menjelaskan beberapa masalah umum Apache Kafka dan memberikan beberapa rekomendasi tentang cara menghindari masalah skalabilitas untuk aplikasi Anda.
Operasi Kafka tertentu berjalan dengan klien mengirim data ke broker dan menunggu respons. Seluruh perjalanan bolak-balik mungkin memakan waktu 10 milidetik, yang terdengar cepat, tetapi membatasi Anda pada paling banyak 100 operasi per detik. Untuk alasan ini, disarankan agar Anda mencoba menghindari operasi semacam ini jika mungkin. Untungnya, klien Kafka menyediakan cara bagi Anda untuk menghindari menunggu waktu bolak-balik ini. Anda hanya perlu memastikan untuk memanfaatkan kemampuan ini.
Tips untuk memaksimalkan throughput:
Jika Anda membaca di atas dan berpikir, “Aduh, bukankah itu akan membuat aplikasi saya lebih kompleks?”, jawabannya adalah ya, itu mungkin akan terjadi. Ada yang harus dikorbankan antara throughput dan kompleksitas aplikasi. Apa yang membuat waktu bolak-balik jaringan menjadi jebakan yang sangat berbahaya adalah bahwa begitu Anda mencapai batas ini, itu dapat memerlukan perubahan aplikasi yang ekstensif untuk mencapai peningkatan throughput lebih lanjut.
Salah satu fitur bermanfaat dari Kafka adalah memonitor “keaktifan” aplikasi yang dikonsumsi dan memutuskan koneksi apa pun yang mungkin gagal. Ini bekerja dengan membuat broker melacak kapan setiap klien konsumen terakhir memanggil “polling” (terminologi Kafka untuk meminta lebih banyak pesan). Jika klien tidak melakukan polling cukup sering, broker yang terhubung dengannya menyimpulkan bahwa koneksi pasti gagal dan memutusnya. Ini dirancang untuk memungkinkan klien yang tidak mengalami masalah untuk masuk dan mengambil alih tugas dari klien yang gagal.
Sayangnya, dengan skema ini broker Kafka tidak dapat membedakan antara klien yang membutuhkan waktu lama untuk memproses pesan yang diterimanya dan klien yang benar-benar gagal. Pertimbangkan sebuah aplikasi konsumsi yang mengulang proses: 1) Memanggil polling dan mendapatkan kembali sekumpulan pesan; atau 2) memproses setiap pesan dalam sekumpulan pesan, membutuhkan waktu 1 detik untuk memproses setiap pesan.
Jika konsumen ini menerima batch 10 pesan, maka akan memerlukan waktu sekitar 10 detik antara panggilan polling. Secara default, Kafka akan mengizinkan hingga 300 detik (5 menit) antar polling sebelum memutuskan koneksi klien, jadi semuanya akan berfungsi dengan baik dalam skenario ini. Tetapi apa yang terjadi pada hari yang sangat sibuk ketika tumpukan pesan mulai menumpuk pada topik sedang dikonsumsi aplikasi? Daripada hanya mendapatkan 10 pesan kembali dari setiap panggilan jajak pendapat, aplikasi Anda mendapatkan 500 pesan (secara default ini adalah jumlah maksimum catatan yang dapat dikembalikan oleh panggilan ke jajak pendapat). Itu akan menghasilkan waktu pemrosesan yang cukup bagi Kafka untuk memutuskan instance aplikasi telah gagal dan memutusnya. Ini berita buruk.
Anda akan senang untuk mengetahui bahwa itu bisa jadi lebih buruk. Ada kemungkinan semacam loop masukan terjadi. Ketika Kafka mulai memutuskan koneksi klien karena mereka tidak memanggil polling cukup sering, akan ada lebih sedikit instance aplikasi yang tersedia untuk memproses pesan. Kemungkinan adanya backlog besar pesan pada topik meningkat, yang mengarah pada meningkatnya kemungkinan bahwa lebih banyak klien akan mendapatkan sejumlah besar pesan dan membutuhkan waktu terlalu lama untuk memprosesnya. Akhirnya semua instance aplikasi yang mengonsumsi aplikasi masuk ke loop mulai ulang, dan tidak ada pekerjaan yang selesai.
Langkah apa yang dapat Anda ambil untuk menghindari hal ini?
Kita akan kembali ke topik kegagalan konsumen nanti dalam artikel ini, ketika kita melihat bagaimana mereka dapat memicu penyeimbangan ulang kelompok konsumen dan efek negatif yang dapat ditimbulkannya.
Di balik proses, protokol yang digunakan oleh konsumen Kafka untuk menerima pesan bekerja dengan mengirimkan permintaan “ambil” ke broker Kafka. Sebagai bagian dari permintaan ini, klien menunjukkan apa yang harus dilakukan broker jika tidak ada pesan untuk dikembalikan, termasuk berapa lama broker harus menunggu sebelum mengirim respons kosong. Secara default, konsumen Kafka menginstruksikan broker untuk menunggu hingga 500 milidetik (diatur oleh konfigurasi konsumen “fetch.max.wait.ms”) agar setidaknya 1 byte data pesan tersedia (diatur oleh konfigurasi “fetch.min.bytes”).
Menunggu 500 milidetik terdengar wajar, tetapi jika aplikasi Anda memiliki konsumen yang sebagian besar menganggur, dan skalanya hingga 5.000 instance, itu berpotensi menjadi 2.500 permintaan per detik untuk tidak melakukan apa-apa. Masing-masing permintaan ini membutuhkan waktu CPU pada broker untuk memproses, dan secara ekstrem dapat memengaruhi kinerja dan stabilitas klien Kafka yang ingin melakukan pekerjaan yang bermanfaat.
Biasanya pendekatan Kafka untuk penskalaan adalah menambahkan lebih banyak broker, dan kemudian menyeimbangkan kembali partisi topik secara merata di semua broker, baik lama maupun baru. Sayangnya, pendekatan ini mungkin tidak membantu jika klien Anda membombardir Kafka dengan permintaan fetch yang tidak perlu. Setiap klien akan mengirim permintaan fetch ke setiap broker yang memimpin partisi topik tempat klien mengonsumsi pesan. Jadi ada kemungkinan bahwa bahkan setelah menskalakan klaster Kafka, dan mendistribusikan ulang partisi, sebagian besar klien Anda akan mengirimkan permintaan fetch ke sebagian besar broker.
Jadi, apa yang bisa Anda lakukan?
Jika Anda datang ke Kafka dengan pengalaman sebelumnya dengan sistem publish-subscribe lainnya (seperti Message Queuing Telemetry Transport (MQTT)), maka Anda mungkin mengira topik Kafka sangat ringan, hampir bersifat sementara. Nyatanya tidak. Kafka jauh lebih nyaman dengan sejumlah topik yang diukur dalam jumlah ribuan. Topik Kafka juga diharapkan berumur relatif lama. Praktik seperti membuat topik untuk menerima pesan balasan tunggal, kemudian menghapus topik, jarang terjadi di Kafka dan tidak sesuai dengan sifat-sifat unggul Kafka.
Sebaliknya, rencanakan topik yang berumur panjang. Mungkin topik berumur sama dengan masa pakai aplikasi atau aktivitas. Selain itu, usahakan untuk membatasi jumlah topik dalam jumlah ratusan atau mungkin jumlah ribuan yang rendah. Ini mungkin memerlukan perspektif yang berbeda tentang pesan apa yang disisipkan pada topik tertentu.
Pertanyaan terkait yang sering muncul adalah, “Berapa banyak partisi yang harus dimiliki topik saya?” Secara tradisional, sarannya adalah lebihkan estimasi, karena menambahkan partisi setelah topik dibuat tidak mengubah partisi data yang sudah ada di topik tersebut (dan karenanya dapat memengaruhi konsumen yang mengandalkan partisi untuk menjaga urutan pesan di dalam partisi). Ini adalah saran yang bagus; tapi kami ingin menyarankan beberapa pertimbangan tambahan:
Sebagian besar aplikasi Kafka yang mengonsumsi pesan memanfaatkan kemampuan grup konsumen Kafka untuk mengoordinasikan klien mana yang mengonsumsi dari partisi topik mana. Jika ingatan Anda tentang grup konsumen sedikit kabur, berikut adalah penyegaran singkat tentang poin-poin utamanya:
Seiring semakin matangnya Kafka, algoritma penyeimbangan ulang yang semakin canggih telah (dan terus) dirancang. Dalam versi awal Kafka, ketika grup konsumen diseimbangkan ulang, semua klien dalam grup harus berhenti mengonsumsi, partisi topik akan didistribusikan kembali di antara anggota baru grup, dan semua klien akan mulai mengonsumsi lagi. Pendekatan ini memiliki dua kelemahan (jangan khawatir, ini telah ditingkatkan):
Algoritma penyeimbangan ulang yang lebih baru memiliki peningkatan signifikan dengan, menggunakan terminologi Kafka, menambahkan “kelengketan” dan “kooperasi”:
Meskipun adanya peningkatan pada algoritma penyeimbangan ulang yang lebih baru ini, jika aplikasi Anda sering melakukan penyeimbangan ulang grup konsumen, Anda masih akan melihat dampak pada throughput pesan secara keseluruhan dan membuang-buang bandwidth jaringan saat klien membuang dan mengambil kembali data pesan buffer. Berikut adalah beberapa saran tentang apa yang dapat Anda lakukan:
Tetap terinformasi tentang tren industri yang paling penting—dan menarik—tentang AI, otomatisasi, data, dan di luarnya dengan buletin Think. Lihat Pernyataan Privasi IBM®.
Sekarang Anda adalah pakar dalam menskalakan aplikasi Kafka. Kami mengundang Anda untuk mempraktikkan poin-poin penting ini dan mencoba layanan Kafka yang terkelola sepenuhnya di IBM Cloud. Untuk masalah apa pun selama penyiapan, lihat Panduan Memulai dan Pertanyaan Umum.
IBM® Event Streams adalah perangkat lunak streaming peristiwa yang dibangun pada Apache Kafka sumber terbuka. Perangkat lunak ini tersedia sebagai layanan yang dikelola sepenuhnya di IBM® Cloud atau untuk hosting mandiri.
Buka potensi bisnis dengan solusi integrasi IBM®, menghubungkan aplikasi dan sistem untuk mengakses data penting dengan cepat dan aman.
Buka kemampuan baru dan pendorong ketangkasan bisnis dengan layanan konsultasi IBM cloud.