Menurut situs Kafka :
" Kakfa digunakan untuk membangun pipa data real-time dan aplikasi streaming. "
Menelusuri internet jauh dan luas, saya telah menemukan definisi " aliran data " yang diterima secara umum sebagai berikut :
- Data aliran adalah data yang mengalir secara berdekatan dari sumber ke tujuan melalui jaringan; dan
- Data stream tidak bersifat atomik, artinya setiap bagian dari aliran data yang mengalir adalah bermakna dan dapat diproses, sebagai lawan dari file yang byte-nya tidak berarti apa-apa kecuali Anda memiliki semuanya; dan
- Data aliran dapat dimulai / dihentikan kapan saja; dan
- Konsumen dapat melampirkan dan melepaskan dari aliran data sesuka hati, dan memproses hanya bagian-bagiannya yang mereka inginkan
Nah, jika apa pun yang saya katakan di atas salah, tidak lengkap, atau sepenuhnya salah, silakan mulai dengan mengoreksi saya! Dengan asumsi saya kurang lebih di jalur, maka ...
Sekarang saya mengerti apa itu "streaming data", kemudian saya mengerti apa yang dimaksud Kafka dan Kinesis ketika mereka menagih diri mereka sebagai pemrosesan / perantara middleware untuk aplikasi dengan streaming data. Tapi itu menggelitik minat saya: bisakah / haruskah "streaming middleware" seperti Kafka atau Kinesis digunakan untuk data non-streaming, seperti pialang pesan tradisional? Dan sebaliknya: dapat / haruskah MQ tradisional seperti RabbitMQ, ActiveMQ, Apollo, dll digunakan untuk streaming data?
Mari kita ambil contoh di mana aplikasi akan mengirimkan rentetan pesan JSON backend konstan yang perlu diproses, dan pemrosesannya cukup kompleks (validasi, transformasi data, pemfilteran, agregasi, dll.):
- Kasus # 1: Pesannya adalah setiap bingkai film; itu adalah satu pesan JSON per bingkai video yang berisi data bingkai dan beberapa metadata pendukung
- Kasus # 2: Pesannya adalah data deret waktu, mungkin detak jantung seseorang sebagai fungsi waktu. Jadi Pesan # 1 dikirim mewakili detak jantung saya di t = 1, Pesan # 2 berisi detak jantung saya di t = 2, dll.
- Kasus # 3: Data sepenuhnya berlainan dan tidak terkait oleh waktu atau sebagai bagian dari "aliran data" apa pun. Mungkin mengaudit / peristiwa keamanan yang dipecat ketika ratusan pengguna menavigasi tombol mengklik aplikasi dan mengambil tindakan
Berdasarkan bagaimana Kafka / Kinesis ditagih dan pada pemahaman saya tentang apa "streaming data" itu, mereka tampaknya menjadi kandidat yang jelas untuk Kasus # 1 (data video yang berdekatan) dan # 2 (data seri waktu yang berdekatan). Namun saya tidak melihat alasan mengapa broker pesan tradisional seperti RabbitMQ tidak bisa secara efisien menangani kedua input ini juga.
Dan dengan Kasus # 3, kami hanya disediakan dengan peristiwa yang telah terjadi dan kami perlu memproses reaksi terhadap peristiwa itu. Jadi bagi saya ini berbicara dengan membutuhkan broker tradisional seperti RabbitMQ. Tetapi juga tidak ada alasan mengapa Anda tidak bisa meminta Kafka atau Kinesis menangani pemrosesan data acara.
Jadi pada dasarnya, saya ingin membuat rubrik yang mengatakan: Saya memiliki data X dengan karakteristik Y. Saya harus menggunakan prosesor aliran seperti Kafka / Kinesis untuk menanganinya. Atau, sebaliknya, yang membantu saya menentukan: Saya memiliki data W dengan karakteristik Z. Saya harus menggunakan broker pesan tradisional untuk menanganinya.
Jadi saya bertanya: Faktor-faktor apa tentang data (atau sebaliknya) yang membantu mengarahkan keputusan antara stream processor atau broker pesan, karena keduanya dapat menangani data streaming, dan keduanya dapat menangani data pesan (non-streaming)?
Kafka / Kinesis dimodelkan sebagai aliran. Aliran memiliki properti yang berbeda dari pesan.
Secara umum, gunakan Kafka untuk pemrosesan aliran offline, gunakan antrian pesan untuk pesan klien-server real-time.
Contoh penggunaan case dari pivotal :
Terkadang mungkin bermanfaat untuk menggunakan keduanya! Misalnya dalam Use Case # 2, jika ini adalah aliran data dari pembuat kecepatan katakan, saya akan meminta pembuat kecepatan mengirimkan data detak jantung ke antrian pesan RabbitMQ (menggunakan protokol keren seperti MQTT) di mana ia segera diproses untuk lihat apakah sumber jantungnya masih berdetak. Ini bisa memberi daya pada dashboard dan sistem respons darurat. Antrian pesan juga akan menyimpan data deret waktu ke Kafka sehingga kami dapat menganalisis data detak jantung seiring waktu. Sebagai contoh, kita mungkin menerapkan algoritma untuk mendeteksi penyakit jantung dengan memperhatikan tren dalam aliran detak jantung.
sumber
KafkaProducer
,Kafka
danKafkaConsumer
. KatakanlahKafkaProducer
tinggal di dalam aplikasi Java, dan ituKafkaConsumer
berjalan di beberapa aplikasi / backend Ruby.KafkaProducer
mengirimMessage1
ke Kafka yang perlu diubah melaluiFunction1
. Di manaFunction1
kode hidup? Di Kafka (benar) atau di dalamKafkaConsumer
(aplikasi Ruby)?