Postgres Dinle / Mesaj Sırası Olarak Bildir


17

Bir kanala mesaj göndermek ve yalnızca bir dinleyicinin bu mesajı tüketmesini sağlamak için Postgres Dinle / Bildir özelliğini kullanmanın herhangi bir yolu var mı?

Bunun amacı, aynı Postgres kanalını dinleyen birden fazla 'çalışan' uygulamam olması. Ancak, bildirim kanalı üzerinden alınan mesaj başına işin yalnızca bir kez yapılmasını istiyorum.

Postgres'teki Dinle / Bildir özelliği doğru değilse, kullanmam gereken ayrı bir özellik var mı?

İdeal olarak bunu herhangi bir ek uzantı kullanmadan yapmak istiyorum.

Yanıtlar:


24

PostgreSQL belgelerineNOTIFY göre :

NOTIFY komutu , geçerli veritabanında belirtilen kanal adı için daha önce LISTEN kanalı yürüten her istemci uygulamasına isteğe bağlı bir "faydalı yük" dizesi ile birlikte bir bildirim olayı gönderir . Bildirimler tüm kullanıcılar tarafından görülebilir .

(benimkini vurgula)

Bu, sadece istediğiniz şeyi yapamayacağınız anlamına gelir LISTEN/NOTIFY. Bununla birlikte, hem sıradaki iletileri depolamak, LISTEN/NOTIFYharici uygulamalara "ileti kuyruğunda yeni şeyler vardır" bildirmek için bir tablonuz olabilir ve yalnızca bu iletiyi tüketmek için bu harici uygulamalardan bazı ekstra mantık kullanabilirsiniz.

Maddesinde gösterilen strateji PostgreSQL 9.5'te için KİLİTLİ atlamak nedir? muhtemelen PostgreSQL içinde bir mesaj kuyruğu uygulamanın en güvenli / en kolay yoludur . "ATLA KİLİTLİ nasıl yardımcı olur" bölümüne özellikle dikkat edin. Ayrıca uyarılarından birini dikkatlice okuyun:

RDBMS'de uygulanan bir kuyruk, PostgreSQL ile aynı atomisite ve dayanıklılık garantisini bile veren hızlı bir kuyruğa alma sisteminin performansıyla asla eşleşmeyecektir. SKIP LOCKED kullanmak, mevcut veritabanı içi yaklaşımlardan daha iyidir, ancak özel ve yüksek düzeyde optimize edilmiş bir dış kuyruk motoru kullanarak yine de daha hızlı gidersiniz.

Kuyruk hacmi yüksekse bu özellikle önemlidir.


1
Keşke bu makalenin yazarına bir ödül verebilseydim. Çok son derece yararlı.
Joker

3

Bir süre önce iyi bir başarı ile böyle bir şey yaptım, RabbitMQ kullandım ve bu eklenti https://github.com/gmr/pgsql-listen-exchange

Temelde RabbitMQ PostgreSQL'e bağlanır ve notify olayını dinler, daha sonra bu mesajı gerektiği kadar kuyruğa toplamak ve her kuyruğu tüketen bir uygulamaya sahip olmak için RabbitMQ kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.