KoderKoder.ai
प्राइसिंगएंटरप्राइज़शिक्षानिवेशकों के लिए
लॉग इनशुरू करें

उत्पाद

प्राइसिंगएंटरप्राइज़निवेशकों के लिए

संसाधन

हमसे संपर्क करेंसपोर्टशिक्षाब्लॉग

कानूनी

प्राइवेसी पॉलिसीउपयोग की शर्तेंसुरक्षास्वीकार्य उपयोग नीतिदुरुपयोग रिपोर्ट करें

सोशल

LinkedInTwitter
Koder.ai
भाषा

© 2026 Koder.ai. सर्वाधिकार सुरक्षित।

होम›ब्लॉग›PostgreSQL LISTEN/NOTIFY: लाइव अपडेट्स के लिए कब यह पर्याप्त है
21 अग॰ 2025·8 मिनट

PostgreSQL LISTEN/NOTIFY: लाइव अपडेट्स के लिए कब यह पर्याप्त है

PostgreSQL LISTEN/NOTIFY न्यूनतम सेटअप से लाइव डैशबोर्ड और अलर्ट चला सकता है। जानिए यह किस जगह उपयुक्त है, इसकी सीमाएँ क्या हैं, और कब ब्रॉकर जोड़ना चाहिए।

PostgreSQL LISTEN/NOTIFY: लाइव अपडेट्स के लिए कब यह पर्याप्त है

LISTEN/NOTIFY किस समस्या को हल करने की कोशिश करता है

प्रोडक्ट UI में “लाइव अपडेट” आमतौर पर मतलब होता है कि कुछ घटित होते ही स्क्रीन जल्द बदल जाती है, बिना यूज़र के रिफ्रेश किए। किसी डैशबोर्ड पर संख्या बढ़ती है, इनबॉक्स पर लाल बैज दिखाई देता है, एडमिन को नया ऑर्डर दिखाई देता है, या एक टोस्ट पॉपअप कहता है “Build finished” या “Payment failed”। कुंजी समय है: यह तात्कालिक महसूस होता है, भले ही असल में एक या दो सेकंड का अंतर हो।

कई टीमें शुरुआत में पोलिंग से शुरू करती हैं: ब्राउज़र सर्वर से हर कुछ सेकंड में पूछता है “कुछ नया है?”। पोलिंग काम करता है, लेकिन इसके दो आम नुकसान हैं।

पहला, यह धीरे-धीरे महसूस होता है क्योंकि यूज़र्स बदलाव सिर्फ अगले पोल पर देखते हैं।

दूसरा, यह महंगा हो सकता है क्योंकि आप बार-बार जांच कर रहे होते हैं भले ही कुछ बदला न हो। इसे हजारों यूज़र्स से गुणा करें तो यह शोर बन जाता है।

PostgreSQL LISTEN/NOTIFY एक सरल मामला हल करने के लिए मौजूद है: “मुझे बताओ जब कुछ बदला।” बार-बार पूछने के बजाय, आपकी एप्लिकेशन इंतज़ार कर सकती है और जब डेटाबेस छोटा सा सिग्नल भेजे तो प्रतिक्रिया दे सकती है।

यह उन UIs के लिए अच्छा फिट है जहाँ एक हल्की सूचनाएँ काफी हैं। उदाहरण के लिए:

  • किसी डैशबोर्ड टाइल को रिफ्रेश करना क्योंकि टोटल बदला है
  • बैज काउंट अपडेट करना क्योंकि नया आइटम आया है
  • एक आंतरिक अलर्ट दिखाना क्योंकि जॉब स्टेटस बदल गया है

ट्रेडऑफ सरलता बनाम गारंटी है। LISTEN/NOTIFY जोड़ना आसान है क्योंकि यह पहले से Postgres में है, पर यह एक पूरा मैसेजिंग सिस्टम नहीं है। नोटिफिकेशन एक संकेत है, न कि एक टिकाऊ रिकॉर्ड। अगर एक listener डिस्कनेक्ट है तो वह सिग्नल मिस कर सकता है।

एक व्यावहारिक तरीका यह है: NOTIFY से अपनी ऐप को जगाएँ, फिर आपकी ऐप टेबल्स से सत्य (truth) पढ़े।

PostgreSQL LISTEN/NOTIFY साधारण शब्दों में कैसे काम करता है

PostgreSQL LISTEN/NOTIFY को अपनी डेटाबेस में लगे एक सरल दरवाज़ा घंटी की तरह सोचें। आपकी ऐप घंटी बजे का इंतज़ार कर सकती है, और सिस्टम का कोई और हिस्सा इसे तब बजा सकता है जब कुछ बदले।

एक नोटिफिकेशन के दो भाग होते हैं: एक चैनल नाम और एक वैकल्पिक पेलोड। चैनल एक टॉपिक लेबल जैसा है (उदाहरण के लिए, orders_changed)। पेलोड एक छोटा टेक्स्ट संदेश है जो आप जोड़ते हैं (उदाहरण के लिए, एक order id)। PostgreSQL किसी स्ट्रक्चर को लागू नहीं करता, इसलिए टीमें अक्सर छोटे JSON स्ट्रिंग्स भेजती हैं।

घंटी कौन बजाता है?

नोटिफिकेशन एप्लिकेशन कोड से ट्रिगर किया जा सकता है (आपका API सर्वर NOTIFY चलाता है) या डेटाबेस में खुद से ट्रिगर का उपयोग करके (एक ट्रिगर insert/update/delete के बाद NOTIFY चलाता है)।

  • एप कोड का पालन करना और टेस्ट करना आसान होता है।
  • जब कई राइटर्स एक ही तालिका को छूते हैं और आप सुसंगत व्यवहार चाहते हैं तो ट्रिगर मदद करते हैं।

रिसीविंग साइड पर, आपका ऐप सर्वर एक डेटाबेस कनेक्शन खोलता है और LISTEN channel_name चलाता है। वह कनेक्शन खुला रहता है। जब NOTIFY channel_name, 'payload' होता है, PostgreSQL उन सभी कनेक्शनों को संदेश पुश कर देता है जो उस चैनल पर सुन रहे होते हैं। आपकी ऐप तब प्रतिक्रिया देती है (कैश अपडेट करे, बदला हुआ रो पढ़े, ब्राउज़र को WebSocket इवेंट पुश करे, आदि)।

NOTIFY क्या करता है (और क्या नहीं)

NOTIFY को एक सिग्नल के रूप में समझना सबसे अच्छा है, न कि एक डिलिवरी सर्विस के रूप में:

  • यह लिसनरों को बताता है कि “कुछ अभी हुआ”।
  • यह हर संदेश के प्राप्त होने की गारंटी नहीं देता (एक डिस्कनेक्टेड लिसनर मिस कर सकता है)।
  • यह एक कतार नहीं है (messages बाद में स्टोर नहीं होते)।
  • पेलोड आकार सीमित होता है और छोटा ही रखना चाहिए।
  • यह डेटा की ओर इशारा करना चाहिए, उसे बदलना नहीं (ids भेजें, फिर विवरण क्वेरी करें)।

इस तरह इस्तेमाल करने पर, PostgreSQL LISTEN/NOTIFY बिना अतिरिक्त इन्फ्रास्ट्रक्चर के लाइव UI अपडेट चला सकता है।

कब LISTEN/NOTIFY लाइव UI अपडेट्स के लिए काफी है

LISTEN/NOTIFY तब चमकता है जब आपकी UI को सिर्फ इतना संकेत चाहिए कि कुछ बदला — न कि पूरा इवेंट स्ट्रीम। सोचें “इस विजेट को रिफ्रेश करो” या “एक नया आइटम आया” बजाय “हर क्लिक को क्रम में प्रोसेस करो।”

यह सबसे अच्छा काम करता है जब डेटाबेस पहले से आपका स्रोत-ए-ट्रूथ है और आप चाहते हैं कि UI इसके साथ सिंक रहे। एक आम पैटर्न है: रो लिखो, एक छोटा नोटिफिकेशन भेजो जिसमें ID हो, और UI (या API) लेटेस्ट स्टेट को फेच कर ले।

LISTEN/NOTIFY आमतौर पर तब पर्याप्त होता है जब इन में से ज़्यादातर सच हों:

  • संदेश एक छोटा “कुछ बदला” सिग्नल है, पूरा पेलोड नहीं।
  • इवेंट वॉल्यूम कम से मध्यम है (बर्स्ट्स ठीक हैं, लगातार उच्च थ्रूपुट नहीं)।
  • अगर यूज़र नोटिफिकेशन मिस करता है तो UI रीलोड या थोड़ी पोलिंग से रिकवर कर सकता है।
  • आप सादगी को परफेक्ट डिलीवरी गारंटी से अधिक महत्व देते हैं (अक्सर शुरुआत के प्रोडक्ट और आंतरिक टूल्स के लिए)।
  • आपका एक प्राइमरी डेटाबेस है और आप कम मूविंग पार्ट्स चाहते हैं।

एक ठोस उदाहरण: एक आंतरिक सपोर्ट डैशबोर्ड “open tickets” और “new notes” बैज दिखाता है। जब एक एजेंट नोट जोड़ता है, आपका बैकएंड उसे Postgres में लिखता है और ticket_changed पर ticket ID के साथ NOTIFY करता है। ब्राउज़र WebSocket के जरिए इसे प्राप्त करता है और केवल उस एक टिकट कार्ड को फिर से फेच कर देता है। कोई अतिरिक्त इन्फ्रास्ट्रक्चर नहीं, और UI अभी भी लाइव लगता है।

कहाँ LISTEN/NOTIFY टूटने लगता है

LISTEN/NOTIFY शुरू में अच्छा लग सकता है, पर इसकी कुछ सख्त सीमाएँ हैं। ये सीमाएँ तब दिखती हैं जब आप नोटिफिकेशन्स को एक संदेश प्रणाली की तरह मानने लगते हैं बजाय एक हल्के “कंधे पर थपथपाने” के।

सबसे बड़ी कमी durability है। NOTIFY queued job नहीं है। अगर उस क्षण कोई सुन नहीं रहा है तो संदेश मिस हो जाता है। भले ही कोई लिसनर कनेक्टेड हो, क्रैश, डिप्लॉय, नेटवर्क हिचकी, या डेटाबेस रीस्टार्ट कनेक्शन को ड्रॉप कर सकते हैं। आप अपने आप मिस हुए नोटिफिकेशन्स वापस प्राप्त नहीं करेंगे।

डिस्कनेक्ट्स यूज़र-फेसिंग फीचर के लिए विशेष रूप से कष्टप्रद हैं। एक डैशबोर्ड सोचें जो नए ऑर्डर्स दिखाता है। ब्राउज़र टैब सो जाता है, WebSocket फिर से कनेक्ट करता है, और UI “अटक” सा लगता है क्योंकि उसने कुछ इवेंट्स मिस कर दिए। आप इसका वर्कअराउंड कर सकते हैं, पर तब वर्कअराउंड अब सिर्फ LISTEN/NOTIFY नहीं रहेगा: आप डेटाबेस से स्टेट को फिर से बनाते हैं और NOTIFY को केवल रिफ्रेश के लिए एक संकेत के रूप में रखते हैं।

फैन-आउट भी एक आम समस्या है। एक इवेंट सैकड़ों या हजारों लिसनरों (कई ऐप सर्वर्स, कई यूज़र्स) को जगा सकता है। अगर आप एक शोर चैनल जैसे orders का उपयोग करते हैं, तो हर लिसनर जागेगा भले ही केवल एक यूज़र को ही परवाह हो। इससे CPU और कनेक्शन पर दबाव बढ़ सकता है।

पेलोड साइज और आवृत्ति अंतिम जाल हैं। NOTIFY पेलोड छोटे होते हैं, और उच्च-फ़्रीक्वेंसी इवेंट्स क्लाइंट्स की तुलना में तेज़ी से जमा हो सकते हैं।

इन संकेतों पर ध्यान दें:

  • आपको गारंटीकृत डिलीवरी, retries, या ordering की जरूरत है।
  • क्लाइंट अक्सर reconnect करते हैं और किसी अपडेट को मिस नहीं कर सकते।
  • एक चैनल बहुत सारे लिसनरों को जगा रहा है जो ज्यादातर इवेंट को इग्नोर करते हैं।
  • आप बड़े पेलोड भेज रहे हैं या प्रति सेकंड कई बार इवेंट फायर कर रहे हैं।

ऐसी स्थिति में, NOTIFY को एक “पोके” के रूप में रखें और विश्वसनीयता के लिए किसी तालिका या असली मैसेज ब्रॉकर की ओर बढ़ें।

कदम-दर-कदम: एक सरल पैटर्न जो काम करता है

रोलबैक सुरक्षा जोड़ें
नोटिफिकेशन्स और UI रिफ्रेश लॉजिक पर इटरैट करते समय स्नैपशॉट कैप्चर करें।
स्नैपशॉट उपयोग करें

LISTEN/NOTIFY के साथ एक भरोसेमंद पैटर्न यह है कि NOTIFY को नजेस की तरह ट्रीट करें, स्रोत सत्य डेटाबेस रो हो; नोटिफिकेशन बताता है कि कब देखना है।

1) लिखें, commit करें, फिर notify करें

ट्रांज़ैक्शन के अंदर राइट करें, और सिर्फ़ डेटा चेंज commit होने के बाद नोटिफ़ाइ भेजें। अगर आप जल्दी notify कर देते हैं तो क्लाइंट जाग सकता है और डेटा न मिलने की स्थिति आ सकती है।

एक आम सेटअप एक ट्रिगर है जो INSERT/UPDATE पर फायर करके एक छोटा संदेश भेजता है.

NOTIFY dashboard_updates, '{\\\"type\\\":\\\"order_changed\\\",\\\"order_id\\\":123}'::text;

2) सरल चैनल नाम और छोटे पेलोड चुनें

चैनल नाम तब सबसे अच्छा काम करते हैं जब वे सिस्टम के बारे में सोचने के तरीके से मेल खाते हों। उदाहरण: dashboard_updates, user_notifications, या प्रति-टेनेंट जैसे tenant_42_updates।

पेलोड छोटा रखें। पहचानकर्ता और एक प्रकार डालें, पूरा रिकॉर्ड नहीं। एक उपयोगी डिफ़ॉल्ट रूप इस तरह है:

  • type (क्या हुआ)
  • id (क्या बदला)
  • वैकल्पिक tenant_id या user_id

यह bandwidth कम रखता है और नोटिफिकेशन लॉग में संवेदनशील डेटा लीक होने से बचाता है।

3) reconnects हैंडल करें और हर कनेक्शन पर फिर से subscribe करें

कनेक्शन्स ड्रॉप होते हैं। इसके लिए योजना बनाएं।

कनेक्ट पर, उन सभी चैनलों के लिए LISTEN चलाएँ जिनकी ज़रूरत है। डिस्कनेक्ट पर, छोटे बैकऑफ़ के साथ फिर से कनेक्ट करें। रीकनेक्ट पर फिर से LISTEN करें (सब्सक्रिप्शन अपने आप नहीं रह जाते)। रीकनेक्ट के बाद, मिस हुए इवेंट्स कवर करने के लिए “हाल के चेंजेज” का छोटा रिफेच करें।

4) UI अपडेट: पहले refetch करें, बाद में patch करें

अधिकांश लाइव UI अपडेट्स के लिए, रिफेच करना सबसे सुरक्षित कदम है: क्लाइंट {type, id} प्राप्त करता है और फिर सर्वर से लेटेस्ट स्टेट माँगता है।

इन्क्रीमेंटल पैचिंग तेज़ हो सकती है, पर इसे गलत करना आसान है (आउट-ऑफ-ऑर्डर इवेंट्स, आंशिक फेलियर)। एक अच्छा मध्य मार्ग है: छोटे स्लाइस को रिफेच करें (एक ऑर्डर रो, एक टिकट कार्ड, एक बैज काउंट) और भारी एग्रीगेट्स को शॉर्ट टाईमर पर रखें।

डैशबोर्ड्स और नोटिफिकेशन्स के लिए स्केलिंग पैटर्न

जब आप एक एडमिन डैशबोर्ड से कई यूज़र्स तक बढ़ते हैं, तो अच्छे अभ्यास और भी मायने रखते हैं। LISTEN/NOTIFY अभी भी अच्छी तरह काम कर सकता है, पर आपको इवेंट्स के फ्लो को डेटाबेस से ब्राउज़र्स तक आकार देना पड़ेगा।

एक सामान्य बेसलाइन यह है: हर ऐप इंस्टेंस एक लंबा कनेक्शन खोलता है जो LISTEN करता है, फिर वह कनेक्टेड क्लाइंट्स को अपडेट्स पुश करता है। यह “एक इंस्टेंस प्रति लिसनर” सेटअप सरल है और अक्सर ठीक रहता है अगर आपके पास ऐप सर्वर्स की संख्या कम हो और आप कभी-कभार के reconnects सहन कर सकें।

अगर आपके पास बहुत सारे ऐप इंस्टेंस (या serverless वर्कर्स) हैं, तो एक साझा लिसनर सर्विस रखना आसान हो सकता है। एक छोटा प्रोसेस एक बार सुनता है और फिर अपडेट्स को बाकी स्टैक में फैन्स आउट करता है। यह बैचिंग, मेट्रिक्स और बैकप्रेशर जोड़ने के लिए एक जगह देता है।

ब्राउज़रों के लिए, आप सामान्यतः WebSockets (दो-तरफ़ा, इंटरएक्टिव UIs के लिए महान) या Server-Sent Events (SSE) (एक-तरफ़ा, डैशबोर्ड्स के लिए सरल) का उपयोग करते हैं। किसी भी तरह, “सब कुछ रिफ्रेश करो” भेजने से बचें। “order 123 बदला” जैसे कॉम्पैक्ट संकेत भेजें ताकि UI केवल वही रिफेच करे जिसकी उसे ज़रूरत है।

UI को थ्राश होने से बचाने के लिए कुछ गार्डरेल जोड़ें:

  • बर्स्ट्स को डिबाउंस करें (उदा. 100–500 ms) क्लाइंट पर पुश करने से पहले
  • डुप्लीकेट्स को कोअलेस कर दें (अगर एक रिकॉर्ड 10 बार बदला है, 1 अपडेट भेजें)
  • पूर्ण पेज रिफ्रेश की बजाय विजेट-स्तर “डर्टी फ़्लैग्स” का उपयोग करें

चैनल डिज़ाइन भी मायने रखता है। एक ग्लोबल चैनल की बजाय टेनेंट, टीम या फीचर से पार्टिशन करें ताकि क्लाइंट्स केवल प्रासंगिक इवेंट्स प्राप्त करें। उदाहरण: notify:tenant_42:billing और notify:tenant_42:ops।

आम गलतियाँ और उनसे बचने के तरीके

LISTEN/NOTIFY सरल लगता है, इसलिए टीमें इसे जल्दी शिप कर देती हैं और फिर प्रोडक्शन में आश्चर्यचकित हो जाती हैं। अधिकांश समस्याएँ तब आती हैं जब इसे एक गारंटीड मैसेज कतार की तरह माना जाता है।

1) नोटिफिकेशन्स को स्थायी संदेश मानना

अगर आपकी ऐप reconnect होती है (डिप्लॉय, नेटवर्क ब्लिप, DB failover), तो उस दौरान भेजा गया कोई भी NOTIFY चला जाएगा। समाधान: नोटिफिकेशन को संकेत मानें, फिर डेटाबेस को फिर से जाँचें।

एक व्यावहारिक पैटर्न: वास्तविक इवेंट को एक टेबल में स्टोर करें (id और created_at के साथ), फिर reconnect पर अपनी last-seen id से नया डेटा फेच करें।

2) पेलोड को ओवरलोड करना

LISTEN/NOTIFY पेलोड बड़े JSON ब्लॉब्स के लिए नहीं बने हैं। बड़े पेलोड्स parsing और सीमाओं के रिस्क बढ़ाते हैं।

पेलोड संकेत के लिए छोटा रखें जैसे "order:123"। फिर ऐप डेटाबेस से ताज़ा स्टेट पढ़े।

3) “सिग्नल” और “डेटा फ़ेच” को मिलाना

एक आम गलती यह है कि UI को पेलोड कंटेंट के आसपास डिजाइन करना, जैसे कि वही सत्य हो। इससे स्कीमा बदलने और क्लाइंट वर्ज़न के साथ परेशानी होती है।

साफ़ विभाजन रखें: notify कि कुछ बदला, फिर सामान्य क्वेरी से वर्तमान डेटा फेच करें।

4) ट्रिगर्स जो बार-बार फायर करते हैं

हर रो चेंज पर NOTIFY करने वाले ट्रिगर्स आपके सिस्टम को भर सकते हैं, खासकर व्यस्त तालिकाओं के लिए।

सिर्फ़ मायने रखने वाले ट्रांज़िशन्स पर notify करें (उदा. status परिवर्तन)। अगर बहुत शोर है, तो बदलावों को बैच करें या notify पाथ से उन अपडेट्स को हटा दें।

5) UI में बैकप्रेशर को नज़रअंदाज़ करना

भले ही डेटाबेस नोटिफिकेशन्स भेज सके, आपकी UI फिर भी घुट सकती है। हर इवेंट पर रेंडर करने वाला डैशबोर्ड फ्रीज़ कर सकता है।

क्लाइंट पर अपडेट्स डिबाउंस करें, बर्स्ट्स को एक में समेटें, और “invalidate and refetch” को छोटे-छोटे डेल्ट्स लगाने पर प्राथमिकता दें। उदाहरण: नोटिफिकेशन बेल तुरंत अपडेट हो सकती है, पर ड्रॉपडाउन सूची हर कुछ सेकंड में अधिकतम रिफ्रेश हो।

त्वरित चेकलिस्ट: तय करें कि LISTEN/NOTIFY फिट बैठता है या नहीं

बिल्ड करते समय क्रेडिट कमाएँ
जो कुछ आप बनाते हैं उसे शेयर करें या दोस्तों को रेफ़र करें और Koder.ai के लिए क्रेडिट पाएं।
क्रेडिट प्राप्त करें

LISTEN/NOTIFY तब शानदार है जब आप चाहते हैं कि एक छोटा “कुछ बदला” सिग्नल ऐप को ताज़ा डेटा लाने के लिए बोले। यह एक पूरा मैसेजिंग सिस्टम नहीं है।

बिल्ड करने से पहले इन सवालों के जवाब दें:

  • अगर एक लिसनर एक मिनट के लिए ऑफ़लाइन है, क्या घटनाएँ मिस होने से कुछ टूट जाएगा? अगर मिस होना अस्वीकार्य है, तो आपको टिकाऊ डिलीवरी और रीप्ले चाहिए।
  • क्या “नज़दीकी वास्तविक समय” पर्याप्त है? अगर यूज़र्स डिप्लॉय या नेटवर्क हिचकी के दौरान संक्षिप्त देरी सहन कर सकते हैं, तो LISTEN/NOTIFY आम तौर पर ठीक है।
  • आपका पीक बर्स्ट रेट क्या है? कुछ इवेंट्स प्रति सेकंड या कभी-कभार स्पाइक्स सामान्य स्वीट स्पॉट होते हैं। लगातार उच्च वॉल्यूम चैनलों को शोरिला और प्रबंधनीय बनाता है।
  • एक ही समय में कितने consumers लिसन करेंगे? एक या कुछ बैकएंड वर्कर्स आसान हैं। सैकड़ों या हजारों कनेक्टेड क्लाइंट्स आमतौर पर फैन-आउट लेयर (आपका सर्वर) चाहते हैं बजाय हर किसी के सीधे लिसन करने के।
  • क्या आपको कई इवेंट प्रकारों में सख्त ordering चाहिए? अगर आपका डैशबोर्ड इस पर निर्भर है कि “A को पहले प्रोसेस होना चाहिए तब B”, तो यह जल्दी जटिल हो जाता है।

एक व्यावहारिक नियम: अगर आप NOTIFY को पेलोड की बजाय नज़ेस (“जाकर रो दोबारा पढ़ो”) के रूप में ले सकते हैं तो आप सुरक्षित ज़ोन में हैं।

उदाहरण: एक एडमिन डैशबोर्ड नए ऑर्डर्स दिखाता है। अगर एक नोटिफिकेशन मिस हो जाता है, अगली पोल या पेज रिफ्रेश सही काउंट दिखा देगी। यह अच्छा फिट है। पर अगर आप "इस कार्ड को चार्ज करो" या "यह पैकेज शिप करो" जैसे इवेंट भेज रहे हैं, तो एक मिस होने पर गंभीर घटना हो सकती है।

उदाहरण: लाइव डैशबोर्ड प्लस यूज़र नोटिफिकेशन्स

एक छोटी सेल्स ऐप का कल्पना करें: एक डैशबोर्ड आज की आय, कुल ऑर्डर्स, और "हाल के ऑर्डर्स" सूची दिखाता है। साथ ही, हर सेल्सपर्सन को एक छोटा नोटिफिकेशन मिलना चाहिए जब उनका कोई ऑर्डर पे या शिप हुआ हो।

सरल तरीका यह है कि PostgreSQL को स्रोत-ए-ट्रूथ मानें, और LISTEN/NOTIFY को केवल कंधे पर थपथपाने के रूप में उपयोग करें कि कुछ बदला।

जब एक ऑर्डर बनता है या उसकी स्थिति बदलती है, तो आपका बैकएंड एक ही रिक्वेस्ट में दो काम करता है: वह रो लिखता/अपडेट करता है और फिर एक छोटा NOTIFY भेजता है (अक्सर सिर्फ ऑर्डर ID और इवेंट टाइप)। UI पूरी तरह से NOTIFY पेलोड पर निर्भर नहीं रहती।

एक व्यावहारिक फ्लो कुछ ऐसा दिखता है:

  • ट्रांज़ैक्शन में ऑर्डर चेंज लिखें।
  • कमिट के बाद, {\\"type\\":\\"status_changed\\",\\"order_id\\":123} के साथ orders_events पर NOTIFY करें।
  • एक बैकएंड लिसनर इवेंट्स प्राप्त करता है और उन्हें जुड़े ब्राउज़रों को पुश करता है (WebSocket या SSE)।
  • डैशबोर्ड ज़रूरत के अनुसार फेच करता है: ID से हालिया ऑर्डर रो और 2–5 सेकंड के छोटे टाइमर पर टोटल्स, हर इवेंट पर पूरा री-कैल्कुलेशन न करें।
  • यूज़र नोटिफिकेशन्स लक्षित हैं: केवल उस सेल्सपर्सन को जो ऑर्डर का मालिक है, उसे “paid” या “shipped” टोस्ट मिलता है।

यह NOTIFY को हल्का रखता है और महंगी क्वेरीज़ को सीमित करता है।

जब ट्रैफ़िक बढ़ता है, दरारें दिखती हैं: इवेंट्स का स्पाइक एक लिसनर को ओवरव्हेल्म कर सकता है, reconnect पर नोटिफिकेशन्स मिस हो सकती हैं, और आपको गारंटीड डिलीवरी और रीप्ले की ज़रूरत पड़ सकती है। तब आप आमतौर पर एक अधिक विश्वसनीय लेयर जोड़ते हैं (एक आउटबॉक्स टेबल प्लस वर्कर, फिर ज़रूरत पड़ने पर ब्रॉकर) जबकि Postgres को स्रोत-ए-ट्रूथ बनाए रखते हैं।

कब समर्पित ब्रॉकर की ओर बढ़ें

बिना अतिरिक्त इन्फ़्रास्ट्रक्चर के शिप करें
Postgres को स्रोत सच्चाई के रूप में उपयोग करें और UI फैन-आउट लेयर Koder.ai में बनाएं।
नि:शुल्क आज़माएँ

LISTEN/NOTIFY शानदार है जब आपको एक त्वरित “कुछ बदला” संकेत चाहिए। यह एक पूरा मैसेजिंग सिस्टम बनने के लिए नहीं बनाया गया। जब आप इवेंट्स पर स्रोत-ए-ट्रूथ की तरह निर्भर करने लगते हैं, तो ब्रॉकर जोड़ने का समय आ गया है।

स्पष्ट संकेत कि आपने LISTEN/NOTIFY से आउटग्रोन कर लिया है

यदि इनमें से कोई भी दिखाई दे, तो ब्रॉकर आपको दर्द से बचाएगा:

  • आपको durability चाहिए: अगर ऐप रिस्टार्ट हो या DB failover हो तो घटनाएँ खोनी नहीं चाहिए।
  • आपको retries और dead-letter handling चाहिए: अगर कंज्यूमर फेल हो तो संदेश को दोबारा आज़माया और ट्रैक किया जाना चाहिए।
  • आपको consumer groups चाहिए: कई वर्कर्स लोड साझा करें बिना डबल प्रोसेसिंग के।
  • आपको auditing और replay चाहिए: “पिछले घंटे में क्या हुआ” दिखाना या "इवेंट्स से व्यू को फिर से बनाना"।
  • आपको नियंत्रित बैकप्रेशर चाहिए: producers धीमे कंज्यूमर्स को ओवरव्हेल्म नहीं करें।

LISTEN/NOTIFY संदेशों को बाद में स्टोर नहीं करता। यह एक पुश सिग्नल है, परसिस्टेड लॉग नहीं। यह “इस डैशबोर्ड विजेट को रिफ्रेश करो” के लिए परफेक्ट है, पर "बिलिंग ट्रिगर" या "इस पैकेज को शिप करो" जैसे कामों के लिए जोखिम भरा है।

ब्रॉकर क्या जोड़ता है (साधारण शब्दों में)

एक ब्रॉकर आपको असली मैसेज फ़्लो मॉडल देता है: कतारें (काम करने के लिए), टॉपिक्स (कई लोगों को प्रसार), रिटेंशन (संदेश मिनटों से दिनों तक रखें), और acknowledgments (कंज्यूमर प्रोसेसिंग की पुष्टि करे)। इससे आप “डेटाबेस बदला” को “उस बदलाव की वजह से जो कुछ भी होना चाहिए” से अलग कर सकते हैं।

आपको सबसे जटिल टूल चुनने की ज़रूरत नहीं है। सामान्य विकल्पों में Redis (pub/sub या streams), NATS, RabbitMQ, और Kafka शामिल हैं। सही चयन इस पर निर्भर करता है क्या आपको सरल वर्क कतार, कई सर्विसेज़ को फैन-आउट, या history रीप्ले करने की ज़रूरत है।

क्रमिक माइग्रेशन प्लान

आप बिना बड़े री-राइट के आगे बढ़ सकते हैं। एक व्यवहारिक पैटर्न यह है कि NOTIFY को जगाने वाले संकेत के रूप में बनाए रखें जबकि ब्रॉकर डिलिवरी का स्रोत बनता है।

शुरुआत में अपने बिज़नेस चेंज के साथ ही एक “इवेंट रो” लिखें, फिर एक वर्कर उसे ब्रॉकर पर प्रकाशित करे। संक्रमण के दौरान, NOTIFY आपकी UI लेयर को "नए इवेंट्स के लिए चेक करो" बताता रहता है, जबकि बैकग्राउंड वर्कर्स ब्रॉकर से retries और auditing के साथ consume करते हैं।

इस तरह, डैशबोर्ड स्नैपी रहते हैं, और महत्वपूर्ण वर्कफ़्लोज़ अब केवल best-effort नोटिफ़ायन्स पर निर्भर नहीं रहते।

अगले कदम: एक छोटा वर्शन शिप करें और सुरक्षित रूप से इटरैट करें

एक स्क्रीन चुनें (एक डैशबोर्ड टाइल, एक बैज काउंट, एक "नया नोटिफिकेशन" टोस्ट) और इसे end-to-end वायर करें। LISTEN/NOTIFY के साथ आप जल्दी उपयोगी परिणाम पा सकते हैं, बशर्ते आप स्कोप छोटा रखें और असली ट्रैफिक में मापें कि क्या होता है।

सबसे सरल विश्वसनीय पैटर्न से शुरू करें: रो लिखें, commit करें, फिर एक छोटा सिग्नल emit करें कि कुछ बदला। UI सिग्नल पर प्रतिक्रिया कर के लेटेस्ट स्टेट (या जो स्लाइस चाहिए) फ़ेच करे। यह पेलोड्स को छोटा रखता है और जब मैसेज आउट-ऑफ़-ऑर्डर आते हैं तब होने वाली बारीक बग्स से बचाता है।

शुरू में बेसिक ऑब्ज़र्वेबिलिटी जोड़ें। बड़ी टूलिंग ज़रूरी नहीं, पर जब सिस्टम शोरिला हो जाए तब उत्तर चाहिए होते हैं:

  • reconnects और subscription starts (कारण सहित) को लॉग करें
  • notify दर और पिक बर्स्ट्स ट्रैक करें
  • नोटिफिकेशन्स से ट्रिगर होने वाली fetch दर ट्रैक करें
  • “मिस हुआ अपडेट” के लक्षण देखें (यूज़र्स को मैन्युअल रिफ्रेश की ज़रूरत पड़ना)

कॉन्ट्रैक्ट्स को उबाऊ और लिखित रखें। चैनल नाम, इवेंट नाम, और किसी भी पेलोड का आकार तय करें (भले ही वह सिर्फ ID हो)। रेपो में छोटा “इवेंट कैटलॉग” drift को रोकता है।

अगर आप जल्दी बनाना चाहते हैं और स्टैक को सरल रखना चाहते हैं, तो एक प्लेटफ़ॉर्म जैसे Koder.ai (koder.ai) आपकी मदद कर सकता है: पहला वर्शन React UI, Go बैकएंड, और PostgreSQL के साथ शिप करने में, फिर ज़रूरत बढ़ने पर इटरेट करें।

अक्सर पूछे जाने वाले प्रश्न

PostgreSQL LISTEN/NOTIFY वास्तव में किसके लिए अच्छा है?

Use LISTEN/NOTIFY जब आपको सिर्फ यह संकेत चाहिए कि कुछ बदला है — जैसे बैज काउंट या डैशबोर्ड टाइल को रिफ्रेश करना। नोटिफिकेशन को डेटा के रूप में न मानें; इसे तालिकाओं से वास्तविक डेटा रीड करने के लिए एक नजेस के रूप में इस्तेमाल करें।

मैं पॉलिंग की बजाय LISTEN/NOTIFY क्यों इस्तेमाल करूँ?

पॉलिंग एक समयानुसार जाँच होती है, जिससे यूज़र्स को अपडेट देर से दिखता है और सर्वर बिना ज़रूरत के काम कर सकता है। LISTEN/NOTIFY छोटे संकेत को तुरंत पुश करता है जब बदलाव होता है, जिससे अनुभव तेज़ लगता है और अनावश्यक रिक्वेस्ट कम होते हैं।

क्या LISTEN/NOTIFY डिलीवरी की गारंटी देता है?

नहीं, यह best-effort है। अगर listener NOTIFY के दौरान डिस्कनेक्ट था तो वह सिग्नल मिस कर सकता है क्योंकि नोटिफिकेशन बाद में फिर से स्टोर नहीं होते।

NOTIFY पेलोड में क्या डालना चाहिए?

इसे छोटा रखें और संकेत के रूप में व्यवहार करें। एक व्यावहारिक डिफ़ॉल्ट छोटा JSON होता है जिसमें type और id होता है; फिर आपकी एप्लिकेशन Postgres से वर्तमान स्टेट पढ़े।

मुझे ट्रांज़ैक्शन commit से पहले या बाद में notify भेजना चाहिए?

आम पैटर्न यह है कि राइट कमिट होने के बाद ही नोटिफ़ाइ भेजें। अगर आप बहुत जल्दी notify करते हैं, तो क्लाइंट जग सकता है और नया डेटा न मिल पाने की स्थिति आ सकती है।

क्या मुझे application code से NOTIFY भेजना चाहिए या trigger से?

एप्प्लिकेशन कोड आम तौर पर समझने और टेस्ट करने में आसान होता है क्योंकि यह स्पष्ट होता है। ट्रिगर तब उपयोगी होते हैं जब कई अलग-लग राइटर्स वही तालिका बदलते हैं और आप चाहें कि व्यवहार सुसंगत रहे।

मैं reconnects को बिना अपडेट मिस किए कैसे हैंडल करूँ?

Reconnects सामान्य चीज़ समझें। कनेक्ट पर उन सभी चैनलों के लिए LISTEN फिर से चलाएँ और किसी भी मिस हुए इवेंट को कवर करने के लिए हाल के स्टेट की जल्दी से refetch करें।

डेटाबेस नोटिफिकेशन्स को ब्राउज़र तक कैसे पहुँचाऊँ?

हर ब्राउज़र को सीधे Postgres से न जोड़ें। एक सामान्य सेटअप: हर बैकएंड इंस्टेंस एक लंबी-जीवित कनेक्शन खोलता है और LISTEN करता है, फिर वे अपडेट कनेक्टेड ब्राउज़रों को WebSocket या SSE के ज़रिये फॉरवर्ड करता है और UI ज़रूरत के हिसाब से रिफेच करता है।

मैं अनावश्यक रूप से बहुत सारे listeners क्यों न उठाऊँ या UI को फ्लड होने से कैसे बचाऊँ?

चैनलों को संकुचित (narrow) रखें ताकि केवल संबंधित कंज़्यूमर्स जागें, और शोर वाले बर्स्ट्स को बैच करें। कुछ सौ मिलीसेकंड के लिए debouncing और डुप्लिकेट अपडेट्स को coalesce करने से UI और बैकएंड थ्रैशिंग से बचते हैं।

मुझे कब LISTEN/NOTIFY बंद करके ब्रॉकर की ओर जाना चाहिए?

जब आपको durability, retries, consumer groups, ordering या auditing/replay जैसी ज़रूरतें हों तो आप LISTEN/NOTIFY से आगे बढ़ें। अगर किसी इवेंट के मिस होने पर गंभीर परिणाम होते हैं (बिलिंग, शिपिंग आदि), तो आउटबॉक्स टेबल + वर्कर या समर्पित ब्रॉकर उपयोग करें।

विषय-सूची
LISTEN/NOTIFY किस समस्या को हल करने की कोशिश करता हैPostgreSQL LISTEN/NOTIFY साधारण शब्दों में कैसे काम करता हैकब LISTEN/NOTIFY लाइव UI अपडेट्स के लिए काफी हैकहाँ LISTEN/NOTIFY टूटने लगता हैकदम-दर-कदम: एक सरल पैटर्न जो काम करता हैडैशबोर्ड्स और नोटिफिकेशन्स के लिए स्केलिंग पैटर्नआम गलतियाँ और उनसे बचने के तरीकेत्वरित चेकलिस्ट: तय करें कि LISTEN/NOTIFY फिट बैठता है या नहींउदाहरण: लाइव डैशबोर्ड प्लस यूज़र नोटिफिकेशन्सकब समर्पित ब्रॉकर की ओर बढ़ेंअगले कदम: एक छोटा वर्शन शिप करें और सुरक्षित रूप से इटरैट करेंअक्सर पूछे जाने वाले प्रश्न
शेयर करें
Koder.ai
Koder के साथ अपना खुद का ऐप बनाएं आज ही!

Koder की शक्ति को समझने का सबसे अच्छा तरीका खुद देखना है।

मुफ्त शुरू करेंडेमो बुक करें