Saya membutuhkan kinerja tinggi pesan bus untuk aplikasi saya, jadi saya mengevaluasi kinerja ZeroMQ
, RabbitMQ
dan Apache Qpid
. Untuk mengukur kinerja, saya menjalankan program uji yang menerbitkan mengatakan 10.000 pesan menggunakan salah satu pesan implementasi antrian dan menjalankan proses lain di mesin yang sama dengan mengkonsumsi 10.000 pesan. Kemudian saya merekam perbedaan waktu antara pesan pertama yang diterbitkan dan pesan terakhir yang diterima.
Berikut adalah pengaturan yang saya gunakan untuk perbandingan.
RabbitMQ
: saya menggunakan "fanout" jenis valuta dan antrian dengan konfigurasi default. Saya menggunakan RabbitMQ C library.ZeroMQ
: penerbit Saya publises untuk tcp://localhost:port1
dengan ZMQ_PUSH
socket, broker Saya mendengarkan pada tcp://localhost:port1dan mengirim ulang pesan ke tcp://localhost:port2 dan saya konsumen mendengarkan pada tcp://localhost:port2
menggunakan ZMQ_PULL
socket. Saya menggunakan broker bukan peer to peer komunikasi di ZeroMQ
untuk membuat perbandingan kinerja adil untuk pesan antrian implementasi yang menggunakan broker.Qpid
C++ pesan broker: saya menggunakan "fanout" jenis valuta dan antrian dengan konfigurasi default. Saya menggunakan Qpid C++ library.Berikut adalah hasil kinerja:
RabbitMQ
: dibutuhkan waktu sekitar 1 detik untuk menerima 10.000 pesan.ZeroMQ
: dibutuhkan sekitar 15 mili detik untuk menerima 10.000 pesan.Qpid
: Itu membutuhkan waktu sekitar 4 detik untuk menerima 10.000 pesan.Pertanyaan:
RabbitMQ
atau Qpid
untuk membuat kinerja yang lebih baik? Catatan:
Tes dilakukan pada mesin virtual dengan dua dialokasikan prosesor. Hasil dapat bervariasi untuk hardware yang berbeda, namun saya terutama tertarik pada kinerja relatif dari MQ produk.
RabbitMQ mungkin melakukan ketekunan pada pesan tersebut. Saya pikir anda perlu untuk mengatur prioritas pesan atau pilihan lain di pesan untuk tidak melakukan ketekunan. Kinerja akan meningkatkan 10x kemudian. Anda harus mengharapkan setidaknya 100K pesan/detik melalui AMQP broker. Di OpenAMQ kita punya kinerja sampai 300K pesan/detik.
AMQP adalah dirancang untuk kecepatan (misalnya tidak membongkar pesan-pesan dalam rangka untuk rute mereka) tapi ZeroMQ cukup baik dirancang dalam cara kunci. E. g. menghilangkan hop dengan menghubungkan node tanpa broker; itu tidak baik asynchronous I/O dari salah satu AMQP klien tumpukan; itu tidak lebih agresif pesan batching. Mungkin 60% dari waktu yang dihabiskan bangunan ZeroMQ pergi ke performance tuning. Itu adalah pekerjaan yang sangat sulit. It's tidak lebih cepat dengan kecelakaan.
Satu hal yang saya'd ingin lakukan, tapi saya terlalu sibuk, adalah untuk menciptakan sebuah AMQP-seperti broker di atas ZeroMQ. Ada lapisan pertama berikut ini: http://rfc.zeromq.org/spec:15. Seluruh stack akan bekerja agak seperti RestMS, dengan transportasi dan semantik dipisahkan menjadi dua lapisan. Hal ini akan memberikan banyak fungsi yang sama dengan AMQP/0.9.1 (dan semantik interoperable) tetapi secara signifikan lebih cepat.
Hmm, tentu saja ZeroMQ akan menjadi lebih cepat, hal ini dirancang untuk menjadi dan tidak memiliki banyak broker berdasarkan fungsi yang dua lainnya memberikan. The ZeroMQ situs memiliki perbandingan broker vs brokerless pesan dan kelemahan & kelebihan dari keduanya.
RabbitMQ dan 0MQ berfokus pada aspek yang berbeda dari pesan. 0MQ menempatkan lebih fokus pada bagaimana pesan-pesan dipindahkan melalui kawat. RabbitMQ, di sisi lain, berfokus pada bagaimana pesan disimpan, disaring dan dipantau.
(Saya juga seperti di atas RabbitMQ posting di atas itu juga berbicara tentang menggunakan ZeroMQ dengan RabbitMQ)
Jadi, apa yang saya'm coba katakan adalah bahwa anda harus memutuskan pada teknologi yang paling sesuai dengan kebutuhan anda. Jika satu-satunya persyaratan adalah kecepatan, ZeroMQ. Tapi jika anda membutuhkan aspek-aspek lain seperti ketekunan pesan, penyaringan, pemantauan, failover, dll nah, kemudian yang's ketika anda perlu mulai mempertimbangkan RabbitMQ & Qpid.
saya menggunakan broker bukan peer to peer komunikasi di ZeroMQ untuk membuat perbandingan kinerja adil untuk pesan antrian implementasi yang menggunakan broker.
Tidak yakin mengapa anda ingin melakukan itu -- jika satu-satunya hal yang anda pedulikan adalah kinerja, ada tidak perlu untuk membuat lapangan bermain tingkat. Jika anda don't peduli tentang ketekunan, filtering, dll. lalu mengapa membayar harga?
I'm juga sangat mencurigai menjalankan benchmark pada VM's -- ada banyak lapisan tambahan yang dapat mempengaruhi hasil dalam cara yang tidak jelas. (Kecuali anda're berencana untuk menjalankan sistem nyata pada VM's, tentu saja, yang dalam hal itu adalah sangat valid metode).
I've diuji c++/qpid
Saya dikirim 50000 pesan per detik antara dua mesin yang berbeda untuk waktu yang lama dengan tidak ada antrian.
Aku't menggunakan fanout, hanya pertukaran sederhana (non persistent pesan)
Apakah anda menggunakan gigih pesan? Apakah anda parsing pesan?
Saya kira tidak, karena 0MQ doesn't memiliki pesan struct.
Jika broker tersebut terutama menganggur, anda mungkin ingin't dikonfigurasi prefetch pada pengirim dan reseptor. Hal ini sangat penting untuk mengirim banyak pesan.
Kami telah dibandingkan RabbitMQ dengan kami SocketPro (http://www.udaparts.com/) gigih antrian pesan di situs http://www.udaparts.com/document/articles/fastsocketpro.htm dengan semua kode sumber. Berikut ini adalah hasil yang kita peroleh untuk RabbitMQ:
Mesin yang sama enqueue dan dequeue:
"Hello world" -- Enqueue: 30000 pesan per detik; Dequeue: 7000 pesan per detik.
Text dengan 1024 byte - Enqueue: 11000 pesan per detik; Dequeue: 7000 pesan per detik.
Text dengan 10 * 1024 byte - Enqueue: 4000 pesan per detik; Dequeue: 4000 pesan per detik.
Cross-mesin enqueue dan dequeue dengan jaringan bandwidth 100 mbps:
"Hello world" -- Enqueue: 28000 pesan per detik; Dequeue: 1900 pesan per detik.
Text dengan 1024 byte - Enqueue: 8000 pesan per detik; Dequeue: 1000 pesan per detik.
Text dengan 10 * 1024 byte - Enqueue: 800 pesan per detik; Dequeue: 700 pesan per detik.
Kami've mengembangkan open source pesan bus yang dibangun di atas ZeroMQ - awalnya kami melakukan ini untuk menggantikan Qpid. It's brokerless jadi's benar-benar adil perbandingan tetapi menyediakan fungsi yang sama seperti yang ditengahi solusi.
Kami headline kinerja angka 140K pesan per detik antara dua mesin, tapi anda dapat lihat lebih detail di sini: https://github.com/Abc-Arbitrage/Zebus/wiki/Performance