PgQ का उपयोग कर PostgreSQL संदेश कतारें



संदेश कतार का उपयोग प्रदर्शन करने के लिए किया जाता है: लंबित संचालन, सेवाओं के बीच बातचीत, "बैच प्रसंस्करण", आदि। इस तरह की कतारों के आयोजन के लिए विशेष समाधान हैं, जैसे: RabbitMQ, ActiveMQ, ZeroMQ, आदि, लेकिन अक्सर ऐसा होता है कि वे बहुत जरूरत के नहीं होते हैं, और उनकी स्थापना और समर्थन से अधिक दर्द और पीड़ा होगी और लाभ मिलेगा। मान लीजिए कि पंजीकरण करते समय आपके पास एक सेवा है, जिसमें उपयोगकर्ता को पुष्टि के लिए एक ईमेल भेजा जाता है, और यदि आप पोस्टग्रेज का उपयोग करते हैं, तो आप भाग्य में हैं - पोस्टग्रेज में, लगभग बॉक्स से बाहर, एक PgQ एक्सटेंशन है जो आपके लिए सभी गंदे काम करेगा।

इस लेख में मैं PgQ एक्सटेंशन का उपयोग करके PostgreSQL में संदेश कतारबद्ध (कार्यों) के बारे में बात करूंगा। यह लेख उपयोगी होगा यदि आपने PgQ का उपयोग नहीं किया है या पोस्टग्रेज के शीर्ष पर स्व-लिखित कतारों का उपयोग कर रहे हैं।

आपको PgQ की आवश्यकता क्यों है, यदि आप सिर्फ एक टैबलेट बना सकते हैं और वहां कार्य लिख सकते हैं? यह संभव प्रतीत होगा, लेकिन आपको कार्यों के समानांतर पहुंच, संभावित त्रुटियों (कार्य के गिरने की प्रक्रिया क्या होगी?), साथ ही साथ प्रदर्शन (PgQ बहुत तेज है, और स्व-लिखित समाधान आमतौर पर नहीं होते हैं, विशेष रूप से लेन-देन में है, तो क्या होगा? डेटाबेस कार्य के पूरे निष्पादन के दौरान बंद नहीं होता है), लेकिन मेरी राय में PgQ का उपयोग करने के लिए आवश्यक सबसे महत्वपूर्ण कारण यह है कि PgQ पहले से ही लिखित और काम करता है, और स्व-लिखित समाधान को अभी भी लिखा जाना चाहिए (यूपीडी के बारे में, कि यह स्व-लिखित कतारों का उपयोग करने के लायक क्यों नहीं है) , आप पढ़ सकते हैं, उदाहरण के लिए, यहाँ )।
(UPD: चूंकि PgQ पोस्टग्रेज के शीर्ष पर चलता है, लेन-देन के सभी विलंब इसमें भी उपयोग किए जा सकते हैं)

लेकिन PgQ का एक बहुत बड़ा ऋण है - प्रलेखन की कमी, मैं इस लेख के साथ इस कमी की भरपाई करने की कोशिश करता हूं।

युक्ति


PgQ में भाग होते हैं (कम से कम 2): 1 - पोस्टग्रेज के लिए pgq एक्सटेंशन, 2 - pgqd डेमॉन (उन्हें थोड़ा बाद में स्थापित करने के बारे में)।

कतार के साथ सभी इंटरैक्शन पोस्टग्रेज के अंदर कार्यों का उपयोग करके किया जाता है।

उदाहरण के लिए, एक कतार बनाने के लिए, आपको दौड़ना होगा

select * from pgq.create_queue({ } text); 

कतार बनने के बाद, आप इसमें संदेश जोड़ सकते हैं।

 select * from pgq.insert_event({ } text, { } text, {  } text); 

अब हमें यह सीखने की जरूरत है कि रिकॉर्ड किए गए संदेशों को कैसे प्राप्त किया जाए। इसके लिए, "उपभोक्ता" (मैं एक उपभोक्ता लिखूंगा) के रूप में ऐसी इकाई है, जो संदेश (ईवेंट) नहीं, बल्कि "बैच" (बैच) प्राप्त करता है। एक बैच लगातार संदेशों का एक समूह है, pgqd का उपयोग करके baches बनाए जाते हैं। समय-समय पर (कॉन्फ़िगरेशन फ़ाइल में "ticker_period" पैरामीटर) pgqd सभी संचित संदेश लेता है और एक नए बैच में लिखता है। यह महत्वपूर्ण है अगर pgqd काम नहीं करता है, तो नए बैच नहीं बनाए जाते हैं, जिसका अर्थ है कि उपभोक्ताओं के पास पढ़ने के लिए कुछ भी नहीं है, भले ही pgqd लंबे समय तक काम नहीं करता है और फिर चालू हो जाता है, यह इस समय के दौरान संचित संदेशों से एक बड़ा bach बनाएगा, इसलिए pgqd नहीं होना चाहिए बस इसे बंद कर दें।

एक उपभोक्ता का पंजीकरण ( महत्वपूर्ण! एक उपभोक्ता अपने पंजीकरण के बाद ही रिकॉर्ड की गई घटनाओं को प्राप्त करेगा, इसलिए आपको पहले एक उपभोक्ता बनाना चाहिए, और उसके बाद ही ईवेंट का आयोजन करना चाहिए):

 select * from pgq.register_consumer({ } text, { } text); 

(pgq.unregister_consumer के समान)
प्रत्येक उपभोक्ता को इसके निर्माण के बाद होने वाली सभी घटनाएं प्राप्त होंगी (यहां तक ​​कि किसी अन्य उपभोक्ता द्वारा संसाधित), जिसका अर्थ है कि सबसे अधिक संभावना है कि आपको एक मोड़ के लिए केवल एक उपभोक्ता की आवश्यकता है। आगे मैं आपको बताऊंगा कि कई सर्वरों पर लोड को कैसे विभाजित किया जाए।

बाख पाने के लिए, आपको सबसे पहले इसकी आईडी का पता लगाना होगा:

 select * from pgq.next_batch({ } text, { } text); 

यदि उपभोक्ता ने सभी बैचों को संसाधित किया है तो फ़ंक्शन NULL वापस आ सकता है। इस मामले में, आपको बस तब तक इंतजार करना होगा जब तक pgqd एक नया बैच नहीं बनाता है।

इस मामले में, जबकि बाख संसाधित नहीं होता है, यह फ़ंक्शन समान मान लौटाएगा।
आप का उपयोग कर बैच में सभी घटनाओं को प्राप्त कर सकते हैं:

 select * from pgq.get_batch_events({id } bigint); 

(बाख खाली हो सकता है।)

यदि उनमें से किसी एक को संसाधित करते समय कोई त्रुटि हुई, तो आप बाद में इस ईवेंट को संसाधित करने का प्रयास कर सकते हैं:

 select * from pgq.event_retry({id } bigint, {id } bigint, {   } integer); 

बाख के अंत के बारे में सूचित करने और एक नई शुरुआत करने का अवसर प्राप्त करने के लिए, इसका उपयोग किया जाता है

 select * from pgq.finish_batch({id } bigint); 

बेशक, ये विस्तार में सभी कार्य नहीं हैं, मैं pgq.imtqy.com/extension/pgq/files/external-sql.html और github.com/pgq/pgq/tree/mree/functions पढ़ने की सलाह देता हूं। (प्रत्येक फ़ाइल में एक परिभाषा और विवरण है) इसी समारोह)।

लोड साझा करना


कई हैंडलर द्वारा एक साथ घटनाओं को संभालने के लिए, pgq_coop एक्सटेंशन है, जो pgq की तरह काम करता है और "उप उपभोक्ता" नामक एक नई इकाई जोड़ता है, जो कि पहले से ही संसाधित किए गए को छोड़कर, मूल उपभोक्ता के पंजीकरण के क्षण से सभी घटनाओं को प्राप्त करेगा।

 select * from pgq_coop.register_subconsumer({ } text, { } text, { } text); 

 select * from pgq_coop.next_batch({ } text, { } text, { } text); 

 select * from pgq_coop.next_batch({ } text, { } text, { } text, {        ,      } interval); 

 select * from pgq_coop.finish_batch({id } bigint); 

सभी सुविधाओं के बारे में यहां पढ़ें।

स्थापना


Pgq एक्सटेंशन और pgqd डेमन PGDG रिपॉजिटरी में शामिल हैं और बहुत ही वितरण में बहुत सरल रूप से स्थापित हैं, उदाहरण के लिए, डेबियन में:

sudo apt install postgresql-XX-pgq3 pgqd (XX संस्करण संख्या है)।

pgqd एक छोटा सा प्रोग्राम है जो pgqd --help का उपयोग करने के बारे में पाया जा सकता है, इसे ऑटोरन ( sudo systemctl enable pgqd.service जोड़ना न भूलें, और डिफ़ॉल्ट कॉन्फ़िगेशन /etc/pgqd.ini )।

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

 create extension if not exists pgq; 


Pgq_coop के साथ, सब कुछ थोड़ा अधिक जटिल है, यह भंडार में नहीं है, लेकिन इसे स्रोतों से संकलित करना मुश्किल नहीं है (उदाहरण के लिए डेबियन):

 sudo apt install postgresql-server-dev-XX git clone https://github.com/pgq/pgq-coop.git cd pgq-coop sudo make install 

और एक्सटेंशन का उपयोग करके कनेक्ट करें

 create extension if not exists pgq_coop; 

उपयोगी लिंक


Pgq प्रलेखन
Pgq कार्य करता है
Pgq_coop फ़ंक्शन
Pgqd स्रोत कोड
github सभी संबंधित परियोजनाओं के साथ खाता है
विकी ने पोस्टग्रेट किया

Source: https://habr.com/ru/post/hi483014/


All Articles