Postgres Dengarkan / Beri Pemberitahuan Sebagai Antrian Pesan


17

Apakah ada cara untuk menggunakan fitur Postgres Listen / Notify untuk mengirimkan pesan ke saluran dan hanya ada satu pendengar yang menggunakan pesan ini?

Tujuannya adalah saya memiliki beberapa aplikasi 'pekerja' yang semuanya mendengarkan saluran Postgres yang sama. Tapi saya hanya ingin pekerjaan dilakukan sekali per pesan yang diterima melalui saluran notifikasi.

Jika Listen / Notify bukan fitur yang benar di Postgres, apakah ada fitur terpisah yang harus saya gunakan?

Idealnya saya ingin melakukan ini tanpa menggunakan ekstensi tambahan.

Jawaban:


23

Menurut dokumentasi PostgreSQL tentangNOTIFY :

Perintah NOTIFY mengirimkan acara pemberitahuan bersama dengan string "payload" opsional untuk setiap aplikasi klien yang sebelumnya telah mengeksekusi saluran LISTEN untuk nama saluran yang ditentukan dalam database saat ini. Pemberitahuan dapat dilihat oleh semua pengguna .

(penekanan milikku)

Ini berarti Anda tidak dapat melakukan apa yang Anda inginkan hanya dengan LISTEN/NOTIFY . Namun, Anda dapat memiliki kedua tabel untuk menyimpan pesan yang antri, LISTEN/NOTIFYuntuk memberi tahu aplikasi eksternal bahwa "ada hal-hal baru dalam antrian pesan", dan menggunakan beberapa logika tambahan dari aplikasi eksternal ini sehingga hanya satu yang mengkonsumsi pesan tersebut.

Strategi yang digambarkan dalam artikel Apa itu SKIP LOCKED di dalam PostgreSQL 9.5? mungkin cara teraman / termudah untuk mengimplementasikan antrian pesan di dalam PostgreSQL. Berikan perhatian khusus pada bagian "Bagaimana SKIP LOCKED membantu". Baca juga dengan seksama salah satu peringatan mereka:

Antrian yang diterapkan dalam RDBMS tidak akan pernah cocok dengan kinerja sistem antrian yang didedikasikan cepat, bahkan yang membuat atomicity dan jaminan daya tahan yang sama seperti PostgreSQL. Menggunakan SKIP LOCKED lebih baik daripada pendekatan dalam-basis data yang ada, tetapi Anda masih akan lebih cepat menggunakan mesin antrian eksternal yang berdedikasi dan sangat dioptimalkan.

Ini sangat penting jika volume antrian tinggi.


1
Saya berharap saya bisa memberikan hadiah kepada penulis artikel itu. Sangat membantu.
Wildcard

3

Saya melakukan sesuatu seperti ini beberapa waktu lalu dengan kesuksesan yang baik, saya menggunakan RabbitMQ dan plugin ini https://github.com/gmr/pgsql-listen-exchange

Pada dasarnya RabbitMQ Terhubung ke PostgreSQL dan mendengarkan acara pemberitahuan, maka Anda dapat menggunakan RabbitMQ untuk menggabungkan pesan itu ke banyak antrian yang diperlukan dan memiliki aplikasi yang memakan setiap antrian

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.