2011-11-24 15 views
6

मेरे पास Postgresql 9.1 डेटाबेस पर एक "आलेख" तालिका है और एक ट्रिगर जो प्रत्येक सम्मिलन पर एक चैनल को सूचित करता है।नोड-पोस्टग्रेस के साथ लिस्टेन क्वेरी टाइमआउट?

मैं एक node.js स्क्रिप्ट बनाना चाहता हूं जो उन आवेषणों को पकड़ता है और Socket.io का उपयोग कर कनेक्ट क्लाइंट को अधिसूचनाओं को धक्का देता है। अब तक मैं चैनल को लिस्ट करने के लिए नोड-पोस्टग्रेस मॉड्यूल का उपयोग कर रहा हूं लेकिन यह लगभग 10-15 सेकंड के बाद लिस्टेन क्वेरी टाइम लगता है और आवेषण को पकड़ने से रोकता है। टाइमआउट होने पर मैं एक नई सुनवाई से पूछताछ कर सकता हूं, लेकिन मुझे यकीन नहीं है कि निरंतरता को सही ढंग से कैसे कार्यान्वित किया जाए।

CREATE FUNCTION article_insert_notify() RETURNS trigger AS $$ 
BEGIN 
    NOTIFY "article_watcher"; 
    RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; 

ट्रिगर:

CREATE TRIGGER article_insert_trigger 
AFTER INSERT ON article 
FOR EACH ROW EXECUTE PROCEDURE article_insert_notify(); 

और Node.js कोड:

var pg = require ('pg'), 
    pgConnection = "postgres://user:[email protected]/db" 

pg.connect(pgConnection, function(err, client) { 
    client.query('LISTEN "article_watcher"'); 
    client.on('notification', function(data) { 
     console.log(data.payload); 
    }); 
}); 

मैं यह कैसे सुनिश्चित कर सकते हैं एक पूर्णकालिक सुनें या कैसे

यहाँ मेरी PostgreSQL अधिसूचना प्रक्रिया है क्या मैं उन टाइमआउट्स को सुनवाई क्वेरी को फिर से जारी करने के लिए पकड़ सकता हूं? या हो सकता है कि नोड-पोस्टग्रेस के अलावा कोई मॉड्यूल ऐसा करने के लिए अधिक उपयुक्त टूल प्रदान करता हो?

+0

का उपयोग करते हुए [पीजी वादा] (https://github.com/vitaly-t/pg-promise) , स्पष्टीकरण के साथ पूर्ण उदाहरण: [LISTEN/NOTIFY] (https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#listen--notify) –

उत्तर

8

मुझे नोड-पोस्टग्रेस रेपो पर मेरे मुद्दे का उत्तर मिला। ब्रायनक को उद्धृत करने के लिए:

pg.connect पूल कनेक्शन बनाने के लिए उपयोग किया जाता है। कनेक्शन का उपयोग करना श्रवण घटनाओं के लिए पूल कनेक्शन वास्तव में समर्थित नहीं है या अच्छा विचार है। [...] परिभाषा के अनुसार एक कनेक्शन सुनने के लिए स्थायी रूप से खुला रहना चाहिए। के लिए स्थायी रूप से खुलने के लिए एक कनेक्शन के लिए इसे कभी भी कनेक्शन पूल पर वापस नहीं किया जा सकता है।

को इस मामले में सुनने सही तरीका एक स्टैंडअलोन ग्राहक का उपयोग करने के लिए है:

var pg = require ('pg'), 
    pgConnectionString = "postgres://user:[email protected]/db"; 

var client = new pg.Client(pgConnectionString); 
client.connect(); 
client.query('LISTEN "article_watcher"'); 
client.on('notification', function(data) { 
    console.log(data.payload); 
}); 
0

LISTEN सत्र जीवनकाल के लिए या UNLISTEN तक नहीं होने तक माना जाता है। इसलिए, जब तक आपका कोड चल रहा है, अधिसूचनाएं वितरित की जानी चाहिए। नोट, कि आईआईआरसी, पोस्टग्रेस्क्ल NOTIFY प्रति एक अधिसूचना देने का कोई वादा नहीं करता है - यदि आपके पास कई प्रविष्टियां हैं तो यह एक NOTIFY वितरित करने का विकल्प चुन सकती है। 9.1 के बारे में निश्चित नहीं है, उन्होंने LISTEN पेलोड पेश किया, इसलिए यह थोड़ा कम समझ सकता है।

+0

फिर 15 सेकंड टाइमआउट क्लाइंट है मुसीबत ? क्या मैं इसे नोड-पोस्टग्रेस के साथ हल कर सकता हूं या क्या मैं बस इतना करना चाहता हूं कि मैं क्या करना चाहता हूं? – lheurt

+0

मैं वास्तव में नोड भाग से परिचित नहीं हूं और मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं कि कोड के बाद पीजी और इस पूरे पर्यावरण के साथ क्या होता है ... –

संबंधित मुद्दे