ZeroMQ, RabbitMQ va Apache Qpid o'rtasidagi ishlash taqqoslash

Mening kodlash uchun ZeroMQ , RabbitMQ va Apache Qpid ning ishlashini baholayman. Ishlashni o'lchash uchun men 10 mingta xabarlarni xabarlar quyish dasturlaridan birini ishlatib, o'sha 10,000 ta xabarni iste'mol qilish uchun o'sha mashinada boshqa operatsiyani amalga oshiradigan bir sinov dasturini ishga tushiraman. So'ngra, e'lon qilingan birinchi xabar va olingan so'nggi xabar o'rtasida vaqt farqi yozib qo'yaman.

Quyidagi taqqoslash uchun foydalanadigan sozlamalar.

  1. RabbitMQ: I used a "fanout" type exchange and a queue with default configuration. I used the RabbitMQ C client library.
  2. ZeroMQ: My publisher publises to tcp://localhost:port1 with ZMQ_PUSH socket, My broker listens on tcp://localhost:port1 and resends the message to tcp://localhost:port2 and my consumer listens on tcp://localhost:port2 using ZMQ_PULL socket. I am using a broker instead of peer to to peer communication in ZeroMQ to to make the performance comparison fair to other message queue implementation that uses brokers.
  3. Qpid C++ message broker: I used a "fanout" type exchange and a queue with default configuration. I used the Qpid C++ client library.

Quyidagi natijalar:

  1. RabbitMQ: it takes about 1 second to receive 10,000 messages.
  2. ZeroMQ: It takes about 15 milli seconds to receive 10,000 messages.
  3. Qpid: It takes about 4 seconds to receive 10,000 messages.

Savollar:

  1. Har bir kishi, xabar kuyrukları orasida shu kabi ishlash taqqoslashini çalıştırıyor kerakmi? Keyin o'z natijalarimni siz bilan solishtirishni yaxshi ko'raman.
  2. Ijobiy ishlash uchun RabbitMQ yoki Qpid ni sozlashim mumkinmi?

Eslatma:

Testlar ikkita ajratilgan protsessorli virtual mashinada amalga oshirildi. Natijada turli xil qurilmalar uchun farq bo'lishi mumkin, lekin men asosan MQ mahsulotlarining nisbatan ishlashiga qiziqaman.

68
har bir xabar, bu testni amalga oshirganingizda necha bayta bo'ldi?
qo'shib qo'ydi muallif arsenal, manba
nanomsg - boshqa bir avlodni sinab ko'ring, Martin Sustrik, ZeroMQ hamkasbi tomonidan ishlab chiqilgan. O'qishni boshlash uchun yaxshi joy >>> nanomsg.org/documentation-zeromq.html
qo'shib qo'ydi muallif user3666197, manba
2013 yil 10 aprelda berilgan yaxshi taqqoslash: x-aeon.com/wp/2013/04/10/…
qo'shib qo'ydi muallif Daniel F, manba
RabbitMQ, Kafka, HornetQ, SQS va Mongo bazasida takrorlanadigan kuyruklarning ishlashini taqqoslash: warski.org/blog/2014/07/…
qo'shib qo'ydi muallif adamw, manba
RabbitMQ, Kafka, HornetQ, ActiveMQ, SQS va Mongo ishlash taqqoslashlarining yangilangan versiyasi endi bu erda: softwaremill.com/mqperf
qo'shib qo'ydi muallif adamw, manba
Shu oy natijalari bilan oddiy sinovlarni o'tkazdim. Va men RabbitMQ yoki Qpid bilan ishlayotgan tizimning juda bandligini sezdim. Menimcha, biror narsa noto'g'ri bo'lishi kerak.
qo'shib qo'ydi muallif Gary Shi, manba
"RabbitMQ: 10 000 xabarni olish uchun taxminan 12 soniya kerak bo'ladi." - Bizning testlarimizda muntazam ravishda CPU uchun 20-25,000/soniyani ko'rishimiz mumkin. Ya'ni, siz noto'g'ri ish qilyapsiz yoki sekin mijozlardan foydalanmoqdasiz. Savol-javoblar bilan rabitmq-e-pochtani jo'natishga harakat qildingizmi?
qo'shib qo'ydi muallif user1021067, manba

8 javoblar

RabbitMQ, ehtimol, bu xabarlarda qat'iylik qilmoqda. Xabarlarda xabarning ustuvorligini yoki boshqa variantni qat'iylik qilmaslik uchun belgilashingiz kerak. Ishlash 10 marta yaxshilanadi. AMQP brokeridan kamida 100 K xabarni kutishingiz kerak. OpenAMQ da biz 300 soniyadan oshiq ishni bajardik.

AMQP tezligi uchun mo'ljallangan (masalan, ularni yo'naltirish uchun xabarlarni ochmasdan), lekin ZeroMQ oddiy usullarda ishlab chiqilgan. Masalan, u tugunlarni brokersiz bog'lash yo'li bilan hopni o'chiradi; AMQP mijozlarining har qanday qismidan ko'ra yaxshiroq asinxron I/O ni amalga oshiradi; u ko'proq tajovuzkor xabarni to'ldirishni amalga oshiradi. Ehtimol, ZeroMQ qurilishi uchun sarflangan vaqtning 60 foizi ishlashni sozlashga o'tdi. Bu juda og'ir ish edi. Bu tasodifiy emas.

Men bir narsani qilishni xohlayman, lekin juda bandman, ZeroMQ-ning yuqori qismida AMQP o'xshash brokerini yaratish. Bu erda birinchi qavat mavjud: http://rfc.zeromq.org/spec15 . Butun stack TransportMS va TEMAs kabi ikkita qatlamga bo'lingan semantika bilan ishlaydi. AMQP/0.9.1 (va semantik bilan birgalikda ishlashi mumkin) bilan bir xil funktsional imkoniyatlarni beradi, lekin juda tezroq.

84
qo'shib qo'ydi
RIP jufti, siz ajoyib narsalar qurdingiz
qo'shib qo'ydi muallif RPGillespie, manba
biz birovga yaxshi echim kelgunga qadar rabitmqdan foydalanishni davom ettiramiz, keyin @pieter btw. u menga buyuk patentlarni hikoya qilib beradi [1]. [1] youtube.com/watch?v=5QqbDyZ8Eu4
qo'shib qo'ydi muallif Kunthar, manba

Hmm, of course ZeroMQ will be faster, it is designed to be and does not have a lot of the broker based functionality that the other two provide. The ZeroMQ site has a wonderful comparison of broker vs brokerless messaging and drawbacks & advantages of both.

RabbitMQ Blog:

RabbitMQ va 0MQ xabar almashishning turli jihatlariga e'tibor qaratmoqda. 0MQ xabarlarni simga qanday uzatilayotganiga nisbatan ko'proq e'tibor qaratadi. Boshqa tomondan, RabbitMQ xatlarni saqlash, filtrlash va monitoring qilish haqida o'ylaydi.

(Shuningdek, yuqoridagi RabbitMQ lavozimini yaxshi ko'raman, chunki u shuningdek RabbitMQ bilan ZeroMQ dan foydalanish haqida gapiradi)

So, what I'm trying to say is that you should decide on the tech that best fits your requirements. If the only requirement is speed, ZeroMQ. But if you need other aspects such as persistence of messages, filtering, monitoring, failover, etc well, then that's when u need to start considering RabbitMQ & Qpid.

31
qo'shib qo'ydi
Ha, men hech qanday broker yo'qligini va brokeri va boshqalar bilan ishlaydigan bir maqola bilan bog'liqligini aytdim. Bu aniq emasmi? Bundan tashqari, 2011 yilda ushbu javobni e'lon qilganimda, 2014 yil oktyabr oyida paydo bo'lgan Malamute yo'q edi
qo'shib qo'ydi muallif Steve Casey, manba
ZeroMQda broker yo'q. Siz brokerni ilovaning umumiy dizayni tarkibiga kiritdingiz va sizning brokeringiz zeromqda tinglashadi, maqsadga muvofiq xabarlarni yo'naltirishadi. ZeroMQ faqat bitta ishni bajaradi va juda yaxshi ishlaydi: xabarlar kuyrug'i. ZeroMQ-larni ZeroMQ uchun yaratilgan brokerlik dasturi Malamute bor, lekin ZeroMQ ning qutisidan tashqarida emas. ZeroMQ-ni o'z jarayonida yoki xabarlar brokeringga bag'ishlangan alohida qutidagi (es) o'rnatishingiz mumkin bo'lgan xizmatdir. Bu o'z loyihasi. github.com/zeromq/malamute
qo'shib qo'ydi muallif user356540, manba

ZeroMQ-dagi muloqotni peer-to-peerdan foydalanib, brokerlardan foydalanadigan boshqa xabarlar quyruq dasturiga ishlash taqqoslashni adolatli qilish uchun foydalanaman.

Ishonchim komilki, nima uchun buni qilishni istaysiz - agar siz g'amxo'rlik qiladigan yagona narsa ishlash bo'lsa, o'yin maydonini yaratish kerak emas. Agar qat'iylik, filtrlash, va hokazo haqida qayg'urmasangiz, nima uchun narxni to'laysiz?

Men VM'larda ishlaydigan me'yorlarni juda yaxshi bilaman - bu natijalar aniq bo'lmagan ko'rinishda ta'sir qilishi mumkin bo'lgan qo'shimcha qatlamlar mavjud. (Agar haqiqiy tizimni VM-da ishga tushirmoqchi bo'lsangiz, albatta, bu holda bu juda to'g'ri usul).

4
qo'shib qo'ydi

C ++/qpid kodini sinab ko'rdim

Ikki xil mashinalar orasida sekundiga 50000 xabar yubordim.

Men fransuzdan foydalanmadim, faqat oddiy almashinuv (doimiy bo'lmagan xabarlar)

Doimiy xabarlardan foydalanyapsizmi? Siz xabarlarni tahlil qilyapsizmi?

Ehtimol, yo'q, chunki 0MQda xabarlar tarkibi yo'q.

Agar broker asosan bo'sh bo'lsa, ehtimol jo'natuvchiga va resiverlaringizga oldindan tuzilgan dasturni tuzmagan bo'lasiz. Bu juda ko'p xabarlarni yuborish juda muhim.

3
qo'shib qo'ydi
Uzoq muddatli bo'lmagan navbat bilan foydalanaman, xabarni ajrim qilmayman, aslida men uchta qator navbatdagi tajribalar uchun xabarlar yaratish uchun bir xil koddan foydalanaman. Ayirboshlash turini to'g'ridan to'g'ri almashtirish ishlashga ta'sir qilmadi. Bundan tashqari, jo'natuvchi oqimini boshqarishdan keyin (api sender.SetCapaclity (8)), Vaqt yanada yomonlashdi. jo'natuvchining oqimini nazorat qilmasdan turib, navbat bilan chegaralanmagan ko'rinadi. Vaqtni o'lchash vaqtida siz barcha xabarlarni qabul qilishni kutib turdingiz va navbat to'ldirildi?
qo'shib qo'ydi muallif ahsankhan, manba
Men qpid-perftest dasturining Qpid-ning "oldingi xabarlari Apis" dan foydalanayotganini topdim. Eski Apisga o'tish men sinovdan 10 marotaba oshirdi.
qo'shib qo'ydi muallif ahsankhan, manba

Agar siz seldereydan foydalansangiz, Rabbitmqning ishlashi yaxshilanadi deb o'ylayman

3
qo'shib qo'ydi
OP o'yinga pythondan baho bermaydi va siz katta kutubxona, selderey qora sehr emasligini va undan foydalanibgina rabbitmqni tezroq qilmasligini bilishingiz kerak.
qo'shib qo'ydi muallif gawry, manba

Biz RabbitMQ-ni SocketPro bilan taqqosladik ( http://www.udaparts.com/ ). saytiga kiring http://www.udaparts.com/document/articles/fastsocketpro.htm Barcha manba kodlari bilan. RabbitMQ uchun olingan natijalar:

Xuddi shu mashina enqueue va dequeue:

"Salom dunyo" -
  Enqueue: soniyada 30000 ta xabar;   Dequeue: sekundiga 7000 ta xabar.

     

1024 baytli matn - Asosiy   Enqueue: soniyada 11000 ta xabar;   Dequeue: sekundiga 7000 ta xabar.

     

10 * 1024 baytli matn - Asosiy   Enqueue: soniyada 4000 ta xabarlar;   Dequeue: soniyada 4000 ta xabar.

Tarmoqli tarmoqli kengligi 100 mbit/s bo'lgan chuqurlikda bo'lgan chuqurlikdagi enqueue va dequeue:

"Salom dunyo" -
  Enqueue: soniyada 28000 ta xabarlar;   Dequeue: soniyada 1900 ta xabar.

     

1024 baytli matn - Asosiy   Enqueue: soniyada 8000 ta xabar;   Dequeue: soniyada 1000 ta xabar.

     

10 * 1024 baytli matn - Asosiy   Enqueue: sekundiga 800 ta xabar;   Dequeue: soniyada 700 ta xabar.

1
qo'shib qo'ydi

Biz ZeroMQ ustiga o'rnatilgan ochiq manba kodli avtobusni ishlab chiqdik - dastlab Qpid o'rnini bosdi. Bu butunlay adolatli taqqoslash uchun brokersiz, biroq u vositachilik echimlari bilan bir xil funktsionallikni ta'minlaydi.

Our headline performance figure is 140K msgs per second between two machines but you can see more detail here: https://github.com/Abc-Arbitrage/Zebus/wiki/Performance

0
qo'shib qo'ydi

Yuboruvchi va retseptorlardan prefetchni 100 ga teng qiymatga moslashni harakat qilib ko'ring. Yuborganni oldindan tanlash yetarli emas

0
qo'shib qo'ydi
Fro qpid, Receiver.setCapacity (100) qabul qilgich uchun prefetchni o'rnatadigan taassurot qoldirdi. "Yangi qpid api" dan foydalanib, ishlash uchun kod 10 barobarga oshirildi va ishlash qobiliyati Qipd oldingi xabarlar Apiga o'xshash edi. Natijada xabarni yangiladim. Ammo qpid hali ham rabbitmqdan 4 marta sekinroq ko'rinadi.
qo'shib qo'ydi muallif ahsankhan, manba