Kafka: API Konsumen vs API Aliran

100

Saya baru-baru ini mulai belajar Kafka dan berakhir dengan pertanyaan-pertanyaan ini.

  1. Apa perbedaan antara Consumer dan Stream? Bagi saya, jika ada alat / aplikasi yang mengonsumsi pesan dari Kafka adalah konsumen di dunia Kafka.

  2. Apa perbedaan Stream karena ini juga menggunakan atau menghasilkan pesan ke Kafka? dan mengapa ini diperlukan karena kami dapat membuat aplikasi konsumen kami sendiri menggunakan API Konsumen dan memprosesnya sesuai kebutuhan atau mengirimkannya ke Spark dari aplikasi konsumen?

Saya melakukan Google dalam hal ini, tetapi tidak mendapatkan jawaban yang bagus untuk ini. Mohon maaf jika pertanyaan ini terlalu sepele.

SR Nathan
sumber

Jawaban:

104

Perbarui 09 April 2018 : Saat ini Anda juga dapat menggunakan ksqlDB , database streaming acara untuk Kafka, untuk memproses data Anda di Kafka. ksqlDB dibangun di atas API Streams Kafka, dan juga dilengkapi dengan dukungan kelas satu untuk "stream" dan "tabel".

apa perbedaan antara API Konsumen dan API Aliran?

Kafka's Streams API ( https://kafka.apache.org/documentation/streams/ ) dibangun di atas klien produsen dan konsumen Kafka. Ini secara signifikan lebih kuat dan juga lebih ekspresif daripada klien konsumen Kafka. Berikut adalah beberapa fitur dari Kafka Streams API:

  • Mendukung semantik pemrosesan tepat satu kali (Kafka versi 0.11+)
  • Mendukung pemrosesan stateful (dan juga stateless, tentu saja) yang toleran terhadap kesalahan termasuk streaming join , agregasi , dan windowing . Dengan kata lain, ini mendukung pengelolaan status pemrosesan aplikasi Anda di luar kotak.
  • Mendukung pemrosesan waktu acara serta pemrosesan berdasarkan waktu pemrosesan dan waktu penyerapan
  • Memiliki dukungan kelas satu untuk aliran dan tabel , di mana pemrosesan aliran memenuhi database; dalam praktiknya, sebagian besar aplikasi pemrosesan aliran memerlukan aliran DAN tabel untuk mengimplementasikan kasus penggunaannya masing-masing, jadi jika teknologi pemrosesan aliran tidak memiliki salah satu dari dua abstraksi (misalnya, tidak ada dukungan untuk tabel), Anda akan macet atau harus mengimplementasikan sendiri fungsionalitas ini secara manual (semoga beruntung dengan itu...)
  • Mendukung kueri interaktif (juga disebut 'status yang dapat dikueri') untuk memperlihatkan hasil pemrosesan terbaru ke aplikasi dan layanan lain
  • Lebih ekspresif: kapal dengan (1) pemrograman gaya fungsional DSL dengan operasi seperti map, filter, reduceserta (2) keharusan gaya Processor API untuk misalnya melakukan kompleks pengolahan acara (CEP), dan (3) Anda bahkan dapat menggabungkan DSL dan Processor API.

Lihat http://docs.confluent.io/current/streams/introduction.html untuk pengenalan yang lebih mendetail namun masih tingkat tinggi tentang Kafka Streams API, yang juga akan membantu Anda memahami perbedaan bagi konsumen Kafka tingkat bawah klien. Ada juga tutorial berbasis Docker untuk Kafka Streams API , yang saya buat di blog awal minggu ini.

Jadi apa bedanya API Aliran Kafka karena API ini juga menggunakan atau menghasilkan pesan ke Kafka?

Ya, API Aliran Kafka dapat membaca data serta menulis data ke Kafka.

dan mengapa ini diperlukan karena kami dapat membuat aplikasi konsumen kami sendiri menggunakan API Konsumen dan memprosesnya sesuai kebutuhan atau mengirimkannya ke Spark dari aplikasi konsumen?

Ya, Anda dapat menulis aplikasi konsumen Anda sendiri - seperti yang saya sebutkan, Kafka Streams API menggunakan klien konsumen Kafka (ditambah klien produsen) itu sendiri - tetapi Anda harus mengimplementasikan secara manual semua fitur unik yang disediakan Streams API . Lihat daftar di atas untuk semua yang Anda dapatkan "gratis". Oleh karena itu, jarang terjadi bahwa pengguna memilih klien konsumen tingkat rendah daripada API Aliran Kafka yang lebih kuat.

Michael G. Noll
sumber
8
Dalam kasus apa aplikasi menggunakan Kafka Consumer API melalui Kafka Streams API?
bhh1988
4
Terutama dalam situasi di mana Anda memerlukan akses langsung ke metode tingkat lebih rendah dari API Konsumen Kafka. Sekarang Kafka Streams tersedia, ini biasanya dilakukan untuk aplikasi khusus dan khusus dan kasus penggunaan. Berikut analoginya: Bayangkan Kafka Streams adalah sebuah mobil - kebanyakan orang hanya ingin mengendarainya tetapi tidak ingin menjadi mekanik mobil. Tetapi beberapa orang mungkin ingin membuka dan menyetel mesin mobil untuk alasan apa pun, yaitu saat Anda mungkin ingin langsung menggunakan API Konsumen. (Karena itu, Kafka Streams juga memiliki API Prosesor untuk kebutuhan khusus.)
Michael G. Noll
1
Menurut saya hal utama yang membedakan mereka adalah kemampuan mengakses toko. Setelah Anda memahami kekuatan penggunaan simpanan dalam aliran, Anda akan memahami kekuatan aliran kafka.
Yonatan Kiron
23

Komponen Kafka Stream dibangun untuk mendukung transformasi pesan jenis ETL. Berarti untuk input aliran dari topik, mengubah dan output ke topik lain. Ini mendukung pemrosesan waktu nyata dan pada saat yang sama mendukung fitur analitik lanjutan seperti agregasi, windowing, join, dll.

"Kafka Streams menyederhanakan pengembangan aplikasi dengan mengembangkan produsen Kafka dan perpustakaan konsumen dan memanfaatkan kemampuan asli Kafka untuk menawarkan paralelisme data, koordinasi terdistribusi, toleransi kesalahan, dan kesederhanaan operasional."

Di bawah ini adalah fitur arsitektur utama di Kafka Stream. Silakan lihat di sini

  1. Partisi Stream dan Tugas : Kafka Streams menggunakan konsep partisi dan tugas sebagai unit logis dari model paralelisme berdasarkan partisi topik Kafka.
  2. Model Threading: Kafka Streams memungkinkan pengguna mengonfigurasi jumlah utas yang dapat digunakan perpustakaan untuk memparalelkan pemrosesan dalam sebuah instance aplikasi.
  3. Local State Stores : Kafka Streams menyediakan apa yang disebut penyimpanan negara, yang dapat digunakan oleh aplikasi pemrosesan aliran untuk menyimpan dan meminta data, yang merupakan kemampuan penting saat mengimplementasikan operasi stateful
  4. Fault Tolerance: Kafka Streams dibangun di atas kemampuan toleransi kesalahan yang terintegrasi secara native di dalam Kafka. Partisi Kafka sangat tersedia dan direplikasi, jadi ketika data aliran disimpan ke Kafka, itu tersedia bahkan jika aplikasi gagal dan perlu diproses ulang.

Berdasarkan pemahaman saya di bawah ini adalah perbedaan utama yang terbuka untuk saya perbarui jika ada yang hilang atau menyesatkan

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Tempat menggunakan Konsumen - Produsen:

  1. Jika ada konsumen tunggal, konsumsi proses pesan tetapi jangan tumpahkan ke topik lain.
  2. Seperti poin 1 jika hanya produser yang memproduksi pesan kita tidak membutuhkan Kafka Stream.
  3. Jika pesan konsumen dari satu cluster Kafka tetapi mempublikasikan ke topik cluster Kafka yang berbeda. Dalam hal ini, Anda bahkan dapat menggunakan Kafka Stream, tetapi Anda harus menggunakan Produser terpisah untuk memublikasikan pesan ke cluster yang berbeda. Atau cukup gunakan mekanisme Kafka Consumer - Producer.
  4. Pemrosesan batch - jika ada persyaratan untuk mengumpulkan pesan atau jenis pemrosesan batch, ada baiknya untuk menggunakan cara tradisional biasa.

Tempat menggunakan Kafka Stream:

  1. Jika Anda menggunakan pesan dari satu topik, ubah dan publikasikan ke topik lain Kafka Stream paling cocok.
  2. Pemrosesan waktu nyata, analitik waktu nyata, dan pembelajaran mesin.
  3. Transformasi stateful seperti agregasi, join window, dll.
  4. Berencana untuk menggunakan penyimpanan negara bagian lokal atau penyimpanan negara bagian yang terpasang seperti Portworx dll.
  5. Mencapai tepat satu semantik pemrosesan dan toleransi kesalahan yang ditentukan otomatis.
sun007
sumber
1
Luar biasa, sangat membantu, tetapi ada satu kesalahan besar, Tepat sekali semantik tersedia di api Konsumen dan Streams, terlebih lagi EOS hanyalah sekumpulan pengaturan untuk konsumen / produsen di tingkat yang lebih rendah, sehingga grup pengaturan ini terkait dengan nilai spesifiknya menjamin perilaku EOS. Saat ini saya menggunakan EOS dengan api Konsumen tanpa masalah.
hingga Anda
Ya benar, kita dapat mendefinisikan Semantik sekali dalam Kafka Stream dengan mengatur properti. Namun untuk produsen dan konsumen sederhana kita perlu mendefinisikan idempoten dan transaksi untuk mendukung sebagai transaksi unit
sun007
melakukan perubahan pada kata-kata sesuai saran
sun007
@ sun007, manakah yang lebih cepat untuk aplikasi sederhana yang tidak memerlukan kemampuan waktu nyata? dan juga, apakah menggunakan streaming menambahkan overhead konversi "ekstra" seperti alat tingkat tinggi lainnya selain fungsi asli kafka?
Nag