Postgres ฟัง / แจ้งเตือนเป็นคิวข้อความ


17

มีวิธีใช้ฟีเจอร์ Postgres Listen / Notify เพื่อส่งข้อความไปยังช่องและมีผู้ฟังเพียงคนเดียวที่ใช้ข้อความนี้หรือไม่?

จุดประสงค์นี้คือฉันมีแอพ 'คนงาน' หลายคนที่ฟังช่อง Postgres เดียวกันทั้งหมด แต่ฉันต้องการให้งานทำเพียงครั้งเดียวต่อข้อความที่ได้รับผ่านช่องทางแจ้งเตือน

หาก Listen / Notify ไม่ใช่คุณสมบัติที่ถูกต้องใน Postgres ฉันควรใช้คุณสมบัติแยกต่างหากหรือไม่?

โดยหลักการแล้วฉันต้องการทำสิ่งนี้โดยไม่ใช้ส่วนขยายเพิ่มเติมใด ๆ

คำตอบ:


23

ตามเอกสารของ PostgreSQL เกี่ยวกับNOTIFY :

คำสั่ง NOTIFY ส่งเหตุการณ์การแจ้งเตือนพร้อมกับสตริง "payload" ที่เป็นตัวเลือกให้กับแต่ละแอปพลิเคชันไคลเอนต์ที่ได้ดำเนินการช่อง LISTEN ก่อนหน้านี้สำหรับชื่อช่องที่ระบุในฐานข้อมูลปัจจุบัน การแจ้งเตือนจะปรากฏต่อผู้ใช้ทุกคน

(เน้นที่เหมือง)

ซึ่งหมายความว่าคุณไม่สามารถทำสิ่งที่คุณต้องการเพียงกับ LISTEN/NOTIFYอย่างไรก็ตามคุณสามารถมีทั้งตารางในการจัดเก็บข้อความที่ถูกจัดคิวLISTEN/NOTIFYเพื่อแจ้งเตือนแอปพลิเคชันภายนอกว่า "มีสิ่งใหม่ในคิวข้อความ" และใช้ตรรกะพิเศษบางอย่างจากแอปพลิเคชันภายนอกเหล่านี้

กลยุทธ์ดังที่อธิบายไว้ในบทความการล็อคข้ามไปใน PostgreSQL 9.5 คืออะไร อาจเป็นวิธีที่ปลอดภัยที่สุด / ง่ายที่สุดในการใช้คิวข้อความภายใน PostgreSQL ให้ความสนใจเป็นพิเศษกับส่วน "วิธีที่ SKIP LOCKED ช่วย" อ่านอย่างระมัดระวังหนึ่งในคำเตือนของพวกเขา:

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

สิ่งนี้สำคัญเป็นพิเศษหากปริมาณคิวสูง


1
ฉันหวังว่าฉันจะมอบรางวัลแก่ผู้เขียนบทความนั้น มีประโยชน์มากจริงๆ
สัญลักษณ์แทน

3

ฉันทำบางสิ่งเช่นนี้มาระยะหนึ่งแล้วประสบความสำเร็จฉันใช้ RabbitMQ และปลั๊กอินนี้https://github.com/gmr/pgsql-listen-exchange

โดยทั่วไป RabbitMQ เชื่อมต่อกับ PostgreSQL และฟังเหตุการณ์แจ้งเตือนจากนั้นคุณสามารถใช้ RabbitMQ เพื่อรวมข้อความนั้นเข้ากับคิวได้มากเท่าที่ต้องการและมีแอปที่ใช้งานแต่ละคิว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.