ทำไมเราต้องมีโบรกเกอร์ข้อความอย่าง RabbitMQ บนฐานข้อมูลอย่าง PostgreSQL


215

ฉันใหม่เพื่อโบรกเกอร์ข้อความเช่นRabbitMQที่เราสามารถใช้ในการสร้างงาน / คิวข้อความสำหรับระบบการตั้งเวลาเช่นคื่นฉ่าย

ตอนนี้นี่คือคำถาม:

  • ฉันสามารถสร้างตารางในPostgreSQLซึ่งสามารถผนวกเข้ากับงานใหม่และบริโภคโดยโปรแกรมผู้บริโภคเช่น Celery

  • ทำไมบนโลกนี้ฉันต้องการตั้งค่าเทคโนโลยีใหม่ทั้งหมดสำหรับ RabbitMQ นี้

ตอนนี้ฉันเชื่อว่าการปรับสเกลไม่สามารถตอบได้เนื่องจากฐานข้อมูลของเราเช่น PostgreSQL สามารถทำงานในสภาพแวดล้อมแบบกระจาย

ฉัน googled สำหรับปัญหาใดที่ฐานข้อมูลโพสท่าสำหรับปัญหาเฉพาะและฉันพบ:

  • การสำรวจความคิดเห็นทำให้ฐานข้อมูลไม่ว่างและมีประสิทธิภาพต่ำ
  • การล็อคตาราง -> มีประสิทธิภาพต่ำอีกครั้ง
  • งานหลายล้านแถว -> อีกครั้งการสำรวจมีประสิทธิภาพต่ำ

ทีนี้ RabbitMQ หรือนายหน้าข้อความอื่น ๆ แบบนั้นแก้ปัญหาเหล่านี้ได้อย่างไร

นอกจากนี้ฉันพบว่าAMQPโปรโตคอลเป็นสิ่งต่อไปนี้ มีอะไรที่ยอดเยี่ยมในเรื่องนี้?

สามารถRedisยังสามารถใช้เป็นโบรกเกอร์ข้อความหรือไม่? ฉันพบว่ามันคล้ายกับ Memcached มากกว่า RabbitMQ

กรุณาส่องไฟนี้!


9
ผลกระทบของการล็อกควรน้อยลงมากเมื่อใช้ PostgreSQL เนื่องจากใช้ MVCC ซึ่งผู้อ่านไม่ได้ถูกบล็อกโดยผู้เขียนและในทางกลับกัน บทความส่วนใหญ่ที่ฉันพบว่าวิจารณ์การใช้ฐานข้อมูลเนื่องจากคิวข้อความมี MySQL อยู่ในใจ
— CadentOrange

นายหน้าข้อความย้ายข้อมูลระหว่างโหนดในขณะที่ฐานข้อมูลเก็บข้อมูลไว้ในที่เดียว ความจริงที่ว่าคุณสามารถเข้าถึงข้อมูลในฐานข้อมูลจากหลาย ๆ โหนดไม่ได้ทำให้มันเป็นเครื่องมือที่ดีในการถ่ายโอนข้อมูลระหว่างโหนดอย่างรวดเร็ว
— theMayer

2
"ระบบการตั้งเวลาเหมือนcelery" - ฉันเพิ่งได้เรียนรู้บางสิ่งบางอย่างซึ่งจะเป็นประโยชน์ในการออกแบบของฉันจากคำถาม ตอนนี้เพื่ออ่านคำตอบ ...
— Mark K Cowan

การใช้ผู้ผลิตนายหน้าข้อความและผู้บริโภคแยกออกจากกัน
— giorgi dvalishvili

คุณสามารถดูลิงค์ร้อง มันมีคำอธิบายกว้าง ๆ : stackoverflow.com/a/51377756/3073945
— Md. Sajedul Karim

คำตอบ:


110

คิวของ Rabbit อยู่ในหน่วยความจำและจะเร็วกว่าการนำไปใช้ในฐานข้อมูล คิวข้อความเฉพาะ (ดี) ควรจัดเตรียมคุณลักษณะที่เกี่ยวข้องกับการเข้าคิวที่จำเป็นเช่นการควบคุมปริมาณ / การไหลและความสามารถในการเลือกอัลกอริทึมการจัดเส้นทางที่แตกต่างกัน ขึ้นอยู่กับขนาดของโครงการของคุณคุณอาจต้องการให้ข้อความที่ส่งผ่านส่วนประกอบแยกจากฐานข้อมูลของคุณเพื่อที่ว่าหากองค์ประกอบหนึ่งประสบกับภาระหนักก็ไม่จำเป็นต้องขัดขวางการทำงานของอีกฝ่าย

สำหรับปัญหาที่คุณพูดถึง:

  • การสำรวจความคิดเห็นรักษาฐานข้อมูลที่มีประสิทธิภาพและมีประสิทธิภาพต่ำ : การใช้ Rabbitmq ผู้ผลิตสามารถผลักดันการอัปเดตให้ผู้บริโภคซึ่งมีประสิทธิภาพมากกว่าการสำรวจ ข้อมูลจะถูกส่งไปยังผู้ใช้เมื่อจำเป็นต้องใช้โดยไม่จำเป็นต้องมีการตรวจสอบที่สิ้นเปลือง

  • การล็อคตาราง -> มีประสิทธิภาพต่ำอีกครั้ง:ไม่มีตารางสำหรับล็อค: P

  • งานหลายล้านแถว -> การสำรวจอีกครั้งมีประสิทธิภาพต่ำ:ดังที่ได้กล่าวไว้ข้างต้น Rabbitmq จะทำงานได้เร็วขึ้นเมื่ออยู่ใน RAM และให้การควบคุมการไหล หากจำเป็นก็สามารถใช้ดิสก์เพื่อเก็บข้อความชั่วคราวได้หาก RAM ไม่เพียงพอ หลังจาก 2.0, Rabbit ได้ปรับปรุงการใช้ RAM อย่างมีนัยสำคัญ ตัวเลือกการจัดกลุ่มนอกจากนี้ยังมี

เกี่ยวกับ AMQP ฉันจะบอกว่าคุณสมบัติที่ยอดเยี่ยมจริงๆคือ "การแลกเปลี่ยน" และความสามารถในการกำหนดเส้นทางไปยังการแลกเปลี่ยนอื่น ๆ สิ่งนี้จะช่วยให้คุณมีความยืดหยุ่นมากขึ้นและช่วยให้คุณสร้างประเภทของการกำหนดเส้นทางที่ซับซ้อนซึ่งมีประโยชน์มากเมื่อปรับขนาด สำหรับตัวอย่างที่ดีโปรดดู:


(แหล่งที่มา: springsource.com )

และ: http://blog.springsource.org/2011/04/01/routing-topologies-for-performance-and-scalability-with-rabbitmq/

ในที่สุดเกี่ยวกับ redis ใช่มันสามารถใช้เป็นนายหน้าข้อความและสามารถทำได้ดี อย่างไรก็ตาม Rabbitmq มีคุณสมบัติการจัดคิวข้อความมากกว่า redis เนื่องจาก Rabbitmq ถูกสร้างขึ้นจากพื้นดินจนเป็นคิวข้อความเฉพาะระดับองค์กรที่มีคุณสมบัติครบถ้วน ในทางกลับกัน Redis ถูกสร้างขึ้นเป็นหลักเพื่อเป็นที่เก็บคีย์ - ค่าในหน่วยความจำ (แม้ว่ามันจะทำอะไรได้มากกว่านั้นในตอนนี้; มันยังเรียกว่ามีดกองทัพสวิส) ถึงกระนั้นฉันได้อ่าน / ฟังผู้คนจำนวนมากบรรลุผลลัพธ์ที่ดีด้วย Redis สำหรับโครงการขนาดเล็ก แต่ไม่เคยได้ยินเรื่องนี้ในแอปพลิเคชันขนาดใหญ่

นี่คือตัวอย่างของการใช้ Redis ในการติดตั้งแชทแบบโพลยาว: http://eflorenzano.com/blog/2011/02/16/technology-behind-convore/


2
ฉันใช้งาน JMS (เช่นระบบส่งข้อความ) ที่ด้านบนของฐานข้อมูล ฉันสามารถบอกคุณได้ว่ามันเป็นไปได้ แต่มันไม่สนุกและมันมักจะไม่จ่ายเงินให้ทำ ปัญหาบางอย่างที่คุณพูดถึงสามารถแก้ไขได้ แต่มันเพิ่มความซับซ้อนได้มากทีเดียว ทั้งหมดที่ฉันยอมรับ: ใช้ระบบ MQ เฉพาะถ้าคุณต้องการ อย่างไรก็ตามสำหรับภาระงานต่ำคุณสามารถหลีกเลี่ยงการมีมันไว้ในฐานข้อมูลได้
— โจอาคิมซาวเออร์

1
คุณเพียงแค่ครอบคลุมข้อสงสัย / ข้อสงสัยทั้งหมด คำตอบที่ยอดเยี่ยม!
— Yugal Jindle

นั่นดูน่าสนใจ. สิ่งที่เกี่ยวกับความสอดคล้องโดยวิธี? เกิดอะไรขึ้นถ้ามีงานหลายร้อยรายการในคิวและโหนดที่เก็บไว้ใน RAM ล่มหรือไม่
— Mahn

22
จริงๆแล้วด้วย PostgreSQL ไม่มีการสำรวจ (ดู NOTIFY) และไม่มีการล็อคตาราง (ดู MVCC) แม้ว่า PostgreSQL จะยังไม่ได้ออกแบบมาสำหรับการจัดคิวข้อความ แต่ก็ไม่เหมาะสมอย่างสมบูรณ์
— jkj

3
ชอบ @jkj พูดว่ามี NOTIFY และไม่มีตารางล็อค ปัญหาเดียวดูเหมือนว่าแบนด์วิธสูงของข้อความ คุณไม่สามารถมีอินสแตนซ์ PostgreSQL โดยเฉพาะแทนที่จะรักษาระบบใหม่ทั้งหมดเช่น Rabbit หรือไม่? คุณสามารถ 1) ใช้อินสแตนซ์ PostgreSQL เดียวจนกระทั่งถึงคอขวดจากนั้น 2) ใช้ Postgres เฉพาะจากนั้น 3) สลับไปใช้ Rabbit เป็นนายหน้าของคุณได้อย่างง่ายดาย ดูเหมือนว่าการเริ่มต้นกับ Rabbit นั้นเป็นการเพิ่มประสิทธิภาพล่วงหน้า
— Joe

72

PostgreSQL 9.5

PostgreSQL 9.5 SELECT ... FOR UPDATE ... SKIP LOCKEDประกอบด้วย การดำเนินการนี้จะทำให้การทำงานของระบบการเข้าคิวมากง่ายและง่าย คุณอาจไม่ต้องการระบบการจัดคิวภายนอกอีกต่อไปเพราะตอนนี้มันง่ายที่จะดึงแถว 'n' ที่ไม่มีเซสชั่นอื่นถูกล็อคและล็อคพวกเขาไว้จนกว่าคุณจะยืนยันว่างานเสร็จแล้ว มันยังทำงานร่วมกับธุรกรรมสองเฟสเมื่อเมื่อต้องการการประสานงานภายนอก

ระบบการจัดคิวภายนอกยังคงมีประโยชน์ให้ฟังก์ชั่นบรรจุกระป๋องประสิทธิภาพที่ได้รับการพิสูจน์แล้วการผสานรวมกับระบบอื่น ๆ ตัวเลือกสำหรับการปรับสเกลแนวนอนและการรวมกลุ่ม ฯลฯ อย่างไรก็ตามสำหรับกรณีง่าย ๆ

รุ่นเก่ากว่า

คุณไม่ต้องการเครื่องมือดังกล่าว แต่การใช้งานอาจทำให้ชีวิตง่ายขึ้น การจัดคิวในฐานข้อมูลดูง่าย แต่คุณจะค้นพบในทางปฏิบัติว่าประสิทธิภาพสูงการจัดคิวพร้อมกันที่เชื่อถือได้นั้นยากมากที่จะทำในฐานข้อมูลเชิงสัมพันธ์

นั่นเป็นเหตุผลว่าทำไมเครื่องมืออย่างPGQ จึงมีอยู่

คุณสามารถกำจัดการลงคะแนนใน PostgreSQL โดยใช้LISTENและNOTIFYแต่นั่นจะไม่แก้ปัญหาในการส่งรายการออกไปด้านบนของคิวให้กับผู้บริโภครายหนึ่งอย่างแน่นอนในขณะที่รักษาการดำเนินการพร้อมกันสูงและไม่ปิดกั้นการแทรก วิธีแก้ปัญหาที่ง่ายและชัดเจนที่คุณคิดว่าจะแก้ปัญหานั้นจริง ๆ แล้วไม่ได้อยู่ในโลกแห่งความเป็นจริงและมีแนวโน้มที่จะลดลงในการดึงคิวงานเดี่ยวที่มีประสิทธิภาพน้อยกว่า

หากคุณไม่ต้องการการดึงคิวหลายคนพร้อมกันสูงการใช้ตารางคิวเดี่ยวใน PostgreSQL นั้นสมเหตุสมผลมาก


11
บรรทัดreliably handing out entries off the top of the queue to exactly one consumer while preserving highly concurrent operation and not blocking inserts. สรุปมัน - ใช่ไหม
— Yugal Jindle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.