Saya telah diminta untuk mengevaluasi RabbitMQ daripada Kafka tetapi merasa sulit untuk menemukan alasan bahwa ia melakukan sesuatu yang lebih baik daripada Kafka. Adakah yang tahu apakah itu benar-benar lebih baik dalam throughput, daya tahan, latensi, atau kemudahan penggunaan?
333
Jawaban:
RabbitMQ adalah broker pesan tujuan umum yang solid yang mendukung beberapa protokol seperti AMQP, MQTT, STOMP, dll. Ia dapat menangani throughput tinggi. Kasus penggunaan umum untuk RabbitMQ adalah untuk menangani pekerjaan latar belakang atau tugas jangka panjang, seperti pemindaian file , penskalaan gambar atau konversi PDF. RabbitMQ juga digunakan di antara layanan microser, di mana ia berfungsi sebagai sarana untuk berkomunikasi antar aplikasi, menghindari kemacetan yang lewat pesan.
Kafka adalah bus pesan yang dioptimalkan untuk aliran data ulangan dan pemutaran ulang. Gunakan Kafka ketika Anda harus memindahkan sejumlah besar data, memproses data secara real-time atau menganalisis data selama periode waktu tertentu. Dengan kata lain, di mana data perlu dikumpulkan, disimpan, dan ditangani. Contohnya adalah ketika Anda ingin melacak aktivitas pengguna di toko web dan menghasilkan item yang disarankan untuk dibeli. Contoh lain adalah analisis data untuk pelacakan, konsumsi, pencatatan, atau keamanan.
Kafka dapat dilihat sebagai pialang pesan yang tahan lama di mana aplikasi dapat memproses dan memproses ulang data yang dialirkan pada disk. Kafka memiliki pendekatan routing yang sangat sederhana. RabbitMQ memiliki opsi yang lebih baik jika Anda perlu merutekan pesan Anda dengan cara yang rumit ke konsumen Anda. Gunakan Kafka jika Anda perlu mendukung konsumen batch yang bisa offline atau konsumen yang menginginkan pesan pada latensi rendah.
Untuk memahami cara membaca data dari Kafka, pertama-tama kita perlu memahami konsumen dan kelompok konsumennya. Partisi memungkinkan Anda untuk memparalelkan topik dengan memecah data di beberapa node. Setiap catatan dalam partisi ditugaskan dan diidentifikasi oleh offset uniknya. Offset ini menunjuk ke catatan dalam sebuah partisi. Dalam versi terbaru Kafka, Kafka mempertahankan offset numerik untuk setiap catatan dalam sebuah partisi. Seorang konsumen di Kafka dapat secara otomatis melakukan offset secara berkala, atau dapat memilih untuk mengontrol posisi yang dikomit ini secara manual. RabbitMQ akan menjaga semua negara bagian tentang pesan yang dikonsumsi / diakui / tidak diakui. Saya menemukan Kafka lebih kompleks untuk dipahami daripada kasus RabbitMQ, di mana pesan hanya dihapus dari antrian setelah diterima.
Antrian RabbitMQ paling cepat ketika mereka kosong, sementara Kafka menyimpan sejumlah besar data dengan sangat sedikit overhead - Kafka dirancang untuk menampung dan mendistribusikan pesan dalam volume besar. (Jika Anda berencana memiliki antrian yang sangat panjang di RabbitMQ Anda bisa melihat antrian malas .)
Kafka dibangun dari bawah ke atas dengan penskalaan horizontal (skala dengan menambahkan lebih banyak mesin) dalam pikiran, sementara RabbitMQ sebagian besar dirancang untuk penskalaan vertikal (skala dengan menambahkan lebih banyak daya).
RabbitMQ memiliki antarmuka yang ramah pengguna yang terintegrasi yang memungkinkan Anda memantau dan menangani server RabbitMQ Anda dari peramban web. Antara lain, antrian, koneksi, saluran, pertukaran, pengguna dan izin pengguna dapat ditangani - dibuat, dihapus dan didaftar di browser dan Anda dapat memonitor tingkat pesan dan mengirim / menerima pesan secara manual. Kafka memiliki sejumlah alat open-source, dan juga beberapa iklan komersial , menawarkan fungsi administrasi dan pemantauan. Saya akan mengatakan bahwa lebih mudah / lebih cepat untuk mendapatkan pemahaman yang baik tentang RabbitMQ.
Lebih banyak bacaan dan beberapa data perbandingan dapat ditemukan di sini: https://www.cloudamqp.com/blog/2019-12-12-when-to-use-rabbitmq-or-apache-kafka.html
Juga merekomendasikan makalah industri: "Kafka versus RabbitMQ: Studi perbandingan dua referensi industri menerbitkan / berlangganan implementasi": http://dl.acm.org/citation.cfm?id=3093908
Saya bekerja di perusahaan yang menyediakan Apache Kafka dan RabbitMQ sebagai Layanan.
sumber
Saya mendengar pertanyaan ini setiap minggu ... Sementara RabbitMQ (seperti IBM MQ atau JMS atau solusi perpesanan lainnya secara umum) digunakan untuk perpesanan tradisional, Apache Kafka digunakan sebagai platform streaming (pengiriman pesan + penyimpanan terdistribusi + pemrosesan data). Keduanya dibangun untuk berbagai kasus penggunaan.
Anda dapat menggunakan Kafka untuk "pesan tradisional", tetapi tidak menggunakan MQ untuk skenario khusus Kafka.
Artikel “ Apache Kafka vs. Enterprise Service Bus (ESB) —Friends, Enemies, atau Frenemies? ( https://www.confluent.io/blog/apache-kafka-vs-enterprise-service-bus-esb-friends-enemies-or-frenemies/ ) ”membahas mengapa Kafka tidak kompetitif tetapi saling melengkapi solusi integrasi dan perpesanan (termasuk RabbitMQ) dan cara mengintegrasikan keduanya.
sumber
5 Perbedaan utama antara Kafka dan RabbitMQ, pelanggan yang menggunakannya:
Sistem pesan mana yang harus dipilih atau kita harus mengubah sistem perpesanan yang ada?
Tidak ada satu jawaban untuk pertanyaan di atas. Salah satu pendekatan yang mungkin ulasan ketika Anda harus memutuskan mana sistem pesan atau harus Anda berubah sistem yang ada adalah untuk “ Evaluasi lingkup dan biaya ”
sumber
Satu perbedaan penting yang kalian lupakan adalah RabbitMQ adalah sistem pesan berbasis push sedangkan Kafka adalah sistem pesan berbasis tarik. Ini penting dalam skenario di mana sistem perpesanan harus memuaskan tipe konsumen yang berbeda dengan kemampuan pemrosesan yang berbeda. Dengan sistem berbasis Tarik, konsumen dapat mengkonsumsi berdasarkan kemampuan mereka di mana sistem dorong akan mendorong pesan-pesan terlepas dari keadaan konsumen sehingga menempatkan konsumen pada risiko tinggi.
sumber
RabbitMQ adalah broker pesan tujuan umum tradisional. Ini memungkinkan server web untuk menanggapi permintaan dengan cepat dan mengirimkan pesan ke beberapa layanan. Penerbit dapat mempublikasikan pesan dan membuatnya tersedia untuk antrian, sehingga konsumen dapat mengambilnya. Komunikasi dapat berupa asinkron atau sinkron.
Di sisi lain, Apache Kafka bukan hanya perantara pesan. Awalnya dirancang dan diterapkan oleh LinkedIn untuk melayani sebagai antrian pesan. Sejak 2011, Kafka telah bersumber terbuka dan dengan cepat berkembang menjadi platform streaming terdistribusi, yang digunakan untuk implementasi jaringan pipa data real-time dan aplikasi streaming.
Organisasi modern memiliki berbagai jalur pipa data yang memfasilitasi komunikasi antara sistem atau layanan. Hal-hal menjadi sedikit lebih rumit ketika sejumlah layanan yang wajar perlu berkomunikasi satu sama lain secara real time.
Arsitektur menjadi kompleks karena berbagai integrasi diperlukan untuk memungkinkan komunikasi antar layanan ini. Lebih tepatnya, untuk arsitektur yang mencakup sumber dan layanan target, nxm integrasi yang berbeda perlu ditulis. Juga, setiap integrasi dilengkapi dengan spesifikasi yang berbeda, yang berarti bahwa seseorang mungkin memerlukan protokol yang berbeda (HTTP, TCP, JDBC, dll.) Atau representasi data yang berbeda (Binary, Apache Avro, JSON, dll.), Membuat segalanya semakin menantang . Selain itu, layanan sumber dapat mengatasi peningkatan beban dari koneksi yang berpotensi memengaruhi latensi.
Apache Kafka mengarah ke arsitektur yang lebih sederhana dan mudah dikelola, dengan memisahkan jalur pipa data. Kafka bertindak sebagai sistem terdistribusi throughput tinggi di mana layanan sumber mendorong aliran data, membuatnya tersedia untuk layanan target untuk menarik mereka secara real-time.
Juga, banyak Antarmuka Pengguna open source dan tingkat perusahaan untuk mengelola Kafka Clusters tersedia sekarang. Untuk lebih jelasnya lihat artikel saya Tinjauan umum alat pemantauan UI untuk cluster Apache Kafka dan Mengapa Apache Kafka?
Keputusan untuk memilih RabbitMQ atau Kafka tergantung pada persyaratan proyek Anda. Secara umum, jika Anda ingin broker pesan pub-sub sederhana / tradisional kemudian pergi untuk RabbitMQ. Jika Anda ingin membangun arsitektur yang digerakkan oleh peristiwa di atasnya organisasi Anda akan bertindak berdasarkan peristiwa secara real-time, maka gunakanlah Apache Kafka karena menyediakan lebih banyak fungsionalitas untuk jenis arsitektur ini (misalnya Kafka Streaming atau ksqlDB).
sumber
Saya tahu ini agak terlambat dan mungkin Anda sudah, secara tidak langsung, mengatakannya, tetapi sekali lagi, Kafka bukan antrian sama sekali, ini adalah log (seperti seseorang mengatakan di atas, berdasarkan polling).
Untuk membuatnya sederhana, gunakan case yang paling jelas ketika Anda lebih suka RabbitMQ (atau techno antrian) daripada Kafka adalah yang berikut:
Anda memiliki banyak konsumen yang mengkonsumsi dari antrian dan setiap kali ada pesan baru dalam antrian dan konsumen yang tersedia, Anda ingin pesan ini diproses. Jika Anda melihat dari dekat bagaimana Kafka bekerja, Anda akan melihat itu tidak tahu bagaimana melakukan itu, karena penskalaan partisi, Anda akan memiliki konsumen yang didedikasikan untuk partisi dan Anda akan masuk ke masalah kelaparan. Masalah yang mudah dihindari dengan menggunakan techno antrian sederhana. Anda dapat berpikir untuk menggunakan utas yang akan mengirim pesan yang berbeda dari partisi yang sama, tetapi sekali lagi, Kafka tidak memiliki mekanisme pengakuan selektif.
Yang paling bisa Anda lakukan adalah melakukannya sebagai orang-orang itu dan mencoba mengubah Kafka sebagai antrian: https://github.com/softwaremill/kmq
Yannick
sumber
Gunakan RabbitMQ saat:
Singkatnya: RabbitMQ baik untuk kasus penggunaan sederhana, dengan lalu lintas data yang rendah, dengan manfaat antrian prioritas dan opsi perutean yang fleksibel. Untuk data besar dan throughput tinggi, gunakan Kafka.
sumber
Saya akan memberikan jawaban yang obyektif berdasarkan pengalaman saya dengan keduanya, saya juga akan melewatkan teori di belakang mereka, dengan asumsi Anda sudah mengetahuinya dan / atau jawaban lain sudah cukup.
RabbitMQ : Saya akan memilih yang ini jika persyaratan saya cukup sederhana untuk menangani komunikasi sistem melalui saluran / antrian, retensi dan streaming bukan persyaratan. Misalnya, ketika sistem manufaktur membangun aset, ia tidak memberi tahu sistem perjanjian untuk mengonfigurasi kontrak dan sebagainya.
Kafka : Persyaratan sumber acara terutama, ketika Anda mungkin perlu berurusan dengan stream (kadang-kadang tak terbatas), sejumlah besar data sekaligus seimbang dengan baik, replay offset untuk memastikan keadaan tertentu dan sebagainya. Perlu diingat bahwa arsitektur ini membawa lebih banyak kompleksitas juga, karena arsitektur ini memasukkan konsep-konsep seperti topik / partisi / pialang / pesan batu nisan, dll. Sebagai kepentingan kelas satu.
sumber
Satu-satunya manfaat yang dapat saya pikirkan adalah fitur Transaksional, sisanya semua dapat dilakukan dengan menggunakan Kafka
sumber
Melakukan penskalaan keduanya sulit dengan cara yang toleran terhadap kesalahan yang didistribusikan, tetapi saya akan menjelaskan bahwa ini jauh lebih sulit dalam skala besar dengan RabbitMQ. Bukan hal yang sepele untuk memahami Shovel, Federasi, Mirror, Antrian Msg, ACK, masalah Mem, Fault tollerance, dll. Tidak untuk mengatakan Anda tidak akan memiliki masalah khusus dengan Zookeeper dll di Kafka tetapi ada bagian yang bergerak lebih sedikit untuk dikelola. Yang mengatakan, Anda mendapatkan pertukaran Polyglot dengan RMQ yang tidak Anda lakukan dengan Kafka. Jika Anda ingin streaming, gunakan Kafka. Jika Anda ingin IOT sederhana atau pengiriman paket volume tinggi serupa, gunakan Kafka. Ini tentang konsumen yang cerdas. Jika Anda ingin fleksibilitas pesan dan keandalan yang lebih tinggi dengan biaya yang lebih tinggi dan kemungkinan kompleksitas, gunakan RMQ.
sumber
Jika Anda memiliki kebutuhan perutean yang rumit dan ingin GUI bawaan untuk memantau broker, maka RabbitMQ mungkin yang terbaik untuk aplikasi Anda. Jika tidak, jika Anda sedang mencari pialang pesan untuk menangani throughput tinggi dan memberikan akses ke riwayat streaming, Kafka kemungkinan adalah pilihan yang lebih baik.
sumber
Apache Kafka adalah pilihan populer untuk menyalakan jaringan pipa data. Apache kafka menambahkan aliran kafka untuk mendukung kasus penggunaan etl yang populer. KSQL membuatnya mudah untuk mengubah data di dalam pipa, menyiapkan pesan untuk mendarat dengan bersih di sistem lain. KSQL adalah mesin SQL streaming untuk Apache Kafka. Ini menyediakan antarmuka SQL interaktif yang mudah digunakan namun kuat untuk pemrosesan aliran pada Kafka, tanpa perlu menulis kode dalam bahasa pemrograman seperti Java atau Python. KSQL scalable, elastis, toleran terhadap kesalahan, dan real-time. Ini mendukung berbagai operasi streaming, termasuk pemfilteran data, transformasi, agregasi, gabungan, windowing, dan sesiisasi.
https://docs.confluent.io/current/ksql/docs/index.html
Rabbitmq bukan pilihan populer untuk sistem etl melainkan untuk sistem yang membutuhkan sistem pengiriman pesan sederhana dengan throughput lebih sedikit.
sumber
Saya menyadari bahwa ini adalah pertanyaan lama, tetapi satu skenario di mana RabbitMQ mungkin menjadi pilihan yang lebih baik adalah ketika berhadapan dengan redaksi data.
Dengan RabbitMQ, secara default setelah pesan digunakan, pesan itu dihapus. Dengan Kafka, secara default, pesan disimpan selama seminggu. Sudah umum untuk mengatur ini ke waktu yang lebih lama, atau bahkan untuk tidak pernah menghapusnya.
Meskipun kedua produk dapat dikonfigurasi untuk menyimpan (atau tidak menyimpan) pesan, jika kepatuhan CCPA atau GDPR menjadi perhatian, saya akan menggunakan RabbitMQ.
sumber
Kafka lebih baik daripada RabbitMQ dalam hal throughput, daya tahan, latensi. Jika Anda mengharapkan transaksi kurang dari 10k / detik maka Anda dapat menggunakan RabbitMQ, tetapi itu juga tergantung pada implementasi Anda.
Saya telah menerapkan Kafka dalam produk kami di mana kami menangani lebih dari 70k / detik transaksi dan latensi rata-rata adalah 15 ms dengan beberapa lonjakan mencapai hingga 40 ms. Ukuran topik adalah 100kb.
PFB poin data lebih banyak tentang KAFKA dan RabbitMQ: Apache Kafka termasuk broker itu sendiri, yang sebenarnya merupakan bagian yang paling terkenal dan paling populer, dan telah dirancang dan dipasarkan secara jelas ke arah skenario pemrosesan stream. Selain itu, Apache Kafka baru-baru ini menambahkan Streaming Kafka yang memposisikan dirinya sebagai alternatif untuk platform streaming seperti Apache Spark, Apache Flink, Apache Beam / Google Cloud Data Flow dan Spring Cloud Data Flow. Dokumentasi melakukan pekerjaan yang baik untuk membahas kasus penggunaan populer seperti Pelacakan Aktivitas Situs Web, Metrik, Agregasi Log, Pemrosesan Streaming, Pengadaan Acara, dan Log Komit. Salah satu kasus penggunaan yang dijelaskannya adalah pengiriman pesan, yang dapat menimbulkan kebingungan. Jadi mari kita bongkar sedikit dan dapatkan kejelasan tentang skenario pengiriman pesan mana yang terbaik untuk Kafka, seperti:
Streaming dari A ke B tanpa perutean yang rumit, dengan throughput maksimal (100 k / dt +), dikirim dalam urutan terpartisi setidaknya sekali. Ketika aplikasi Anda membutuhkan akses ke aliran sejarah, dikirim dalam urutan terpartisi setidaknya sekali. Kafka adalah toko pesan yang tahan lama dan klien bisa mendapatkan "replay" dari aliran acara sesuai permintaan, berbeda dengan pialang pesan yang lebih tradisional di mana begitu pesan telah dikirim, itu dihapus dari antrian. Sourcing Event Processing Sourcing RabbitMQ adalah solusi pesan tujuan umum, sering digunakan untuk memungkinkan server web untuk menanggapi permintaan dengan cepat alih-alih dipaksa untuk melakukan prosedur sumber daya yang berat sementara pengguna menunggu hasilnya. Ini juga baik untuk mendistribusikan pesan ke beberapa penerima untuk konsumsi atau untuk menyeimbangkan beban antara pekerja di bawah beban tinggi (20k + / detik). Ketika kebutuhan Anda melampaui throughput, RabbitMQ memiliki banyak hal untuk ditawarkan: fitur untuk pengiriman yang andal, perutean, federasi, HA, keamanan, alat manajemen, dan fitur lainnya. Mari kita periksa beberapa skenario terbaik untuk RabbitMQ, seperti:
Aplikasi Anda perlu bekerja dengan kombinasi protokol yang ada seperti AMQP 0-9-1, STOMP, MQTT, AMQP 1.0. Anda memerlukan kontrol / jaminan konsistensi yang lebih halus berdasarkan per-pesan (antrian surat mati, dll.) Namun, Kafka baru-baru ini menambahkan dukungan yang lebih baik untuk transaksi. Aplikasi Anda perlu variasi dalam point to point, request / reply, dan publikasikan / berlangganan perpesanan perpesanan kompleks ke konsumen, mengintegrasikan beberapa layanan / aplikasi dengan logika routing non-sepele RabbitMQ juga dapat secara efektif mengatasi beberapa kasus penggunaan kuat Kafka di atas, tetapi dengan bantuan perangkat lunak tambahan. RabbitMQ sering digunakan dengan Apache Cassandra ketika aplikasi membutuhkan akses ke stream history, atau dengan plugin LevelDB untuk aplikasi yang membutuhkan antrian “tak terbatas”, tetapi tidak satu pun fitur kapal dengan RabbitMQ itu sendiri.
sumber
Jawaban singkatnya adalah "ucapan terima kasih pesan". RabbitMQ dapat dikonfigurasi untuk meminta ucapan terima kasih pesan. Jika penerima gagal pesan kembali pada antrian dan penerima lain dapat mencoba lagi. Meskipun Anda dapat melakukan ini di Kafka dengan kode Anda sendiri, ini berfungsi dengan RabbitMQ di luar kotak.
Dalam pengalaman saya, jika Anda memiliki aplikasi yang memiliki persyaratan untuk meminta aliran informasi, Kafka dan KSql adalah taruhan terbaik Anda. Jika Anda menginginkan sistem antrian, Anda lebih baik menggunakan RabbitMQ.
sumber
Jawaban yang paling banyak dipilih mencakup sebagian besar tetapi saya ingin menyoroti sudut pandang penggunaan huruf besar. Bisakah kafka melakukan itu kelinci mq bisa lakukan, jawabannya adalah ya tapi bisakah kelinci melakukan semua yang dilakukan kafka, jawabannya tidak. Jadi, hal apa yang tidak bisa dilakukan kelinci yang membuat kafka terpisah, yaitu pemrosesan pesan yang didistribusikan. Dengan ini, baca kembali jawaban yang paling banyak dipilih dan itu akan lebih masuk akal. Untuk menguraikannya, gunakan case use case di mana Anda perlu membuat sistem pesan yang memiliki throughput super tinggi misalnya "suka" di facebook dan Anda telah memilih kelinci mq untuk itu. Anda membuat pertukaran dan antrian dan konsumen tempat semua penerbit (dalam hal ini pengguna FB) dapat mempublikasikan pesan 'suka'. Karena throughput Anda tinggi, Anda akan membuat beberapa utas di konsumen untuk memproses pesan secara paralel tetapi Anda masih terikat oleh kapasitas perangkat keras mesin tempat konsumen berjalan. Dengan asumsi bahwa satu konsumen tidak cukup untuk memproses semua pesan - apa yang akan Anda lakukan? Bisakah Anda menambahkan satu lagi konsumen ke antrian - tidak, Anda tidak dapat melakukannya. Bisakah Anda membuat antrian baru dan mengikat antrian itu untuk bertukar yang menerbitkan pesan 'suka', jawabannya bukan karena Anda akan memproses pesan dua kali. Itulah masalah inti yang dipecahkan kafka. Ini memungkinkan Anda membuat partisi terdistribusi (Antrian di kelinci mq) dan konsumen terdistribusi yang berbicara satu sama lain. Itu memastikan pesan Anda dalam suatu topik mendapat proses oleh konsumen yang didistribusikan di berbagai node (Mesin). Pialang Kafka memastikan bahwa pesan mendapat muatan yang seimbang di semua partisi dari topik itu. Grup konsumen memastikan bahwa semua konsumen saling berbicara dan pesan tidak diproses dua kali. Tetapi dalam kehidupan nyata Anda tidak akan menghadapi masalah ini kecuali hasil Anda sangat tinggi karena kelinci mq juga dapat memproses data dengan sangat cepat bahkan dengan satu konsumen.
sumber