PostgreSQL Advisory Locks वितरित जॉब शेड्युलिंगसाठी

केवळ जॉब शेड्युलिंगसाठी तुमच्या स्टॅक मध्ये Redis किंवा SQS जोडणे थांबवा.

त्याऐवजी तुम्ही PostgreSQL advisory locks वापरू शकता. या दृष्टिकोनामुळे नवीन इन्फ्रास्ट्रक्चरची गरज उरत नाही.

माझ्या चाचण्यांमध्ये, ही सेटअप एका सिंगल डेटाबेस इन्स्टन्सवर प्रति मिनिट १०,००० जॉब्स हाताळू शकते. लॅटन्सीच्या (latency) बाबतीत हे अनेकदा Redis पेक्षा सरस ठरते, कारण तुमचे वर्कर्स आधीच डेटाबेस कनेक्शन्स धारण करतात. यामुळे तुम्हाला अतिरिक्त नेटवर्क हॉप (network hop) टाळता येतो.

याची अंमलबजावणी कशी करावी:

• जॉब क्लेम करण्यासाठी pg_try_advisory_xact_lock वापरा. • रो कंटेंशन (row contention) हाताळण्यासाठी FOR UPDATE SKIP LOCKED वापरा. • लॉक लीक्स (lock leaks) टाळण्यासाठी ट्रान्झॅक्शनल व्हेरिएंट वापरा.

ट्रान्झॅक्शनल लॉक्स का महत्त्वाचे आहेत:

ट्रान्झॅक्शन पूर्ण (commit) झाल्यावर किंवा रोलबॅक (rollback) झाल्यावर ट्रान्झॅक्शनल लॉक्स आपोआप मुक्त होतात. यामुळे तुमचे ॲप्लिकेशन क्रॅश झाल्यास 'ऑर्फनड लॉक्स' (orphaned locks) तयार होण्यापासून बचाव होतो. हे PgBouncer च्या ट्रान्झॅक्शन मोडमध्ये देखील सुरक्षितपणे काम करते.

जर तुम्ही PgBouncer वापरत असाल, तर सेशन लॉक्स (session locks) टाळा. PgBouncer ट्रान्झॅक्शन्स दरम्यान कनेक्शन्स पुन्हा नियुक्त (reassign) करते. यामुळे सेशन-लेव्हल लॉक्समध्ये अडथळा येतो आणि 'सायलेंट फेल्युअर' (silent failures) होऊ शकतात.

जर तुम्हाला सेशन लॉक्सची गरज असेल, तर तुमच्या वर्कर्ससाठी एक वेगळा कनेक्शन पूल तयार करा. वेब ट्रॅफिक आणि जॉब वर्कर ट्रॅफिक एकाच पूलमध्ये मिसळू नका.

कीज (keys) वापरून स्केलिंग करणे:

Advisory locks मध्ये bigint किंवा दोन integers वापरले जातात. दोन integers वापरल्याने नैसर्गिक नेमस्पेसिंग (namespacing) मिळते. जर तुम्ही टेक्स्ट कीजचे (text keys) bigint मध्ये हॅश करत असाल, तर कोलिजनसाठी (collisions) लक्ष ठेवा. जोपर्यंत तुम्ही १,००,००० वेगळे लॉक आयडी (lock IDs) गाठत नाही, तोपर्यंत कोलिजन कमी राहतात. त्यापुढे सुरक्षित राहण्यासाठी दोन-integer फॉरमॅट वापरा.

तडजोड (The Tradeoff):

• साधेपणा आणि कमी ऑपरेशनल कॉस्टमध्ये Advisory locks जिंकतात. • रॉ थ्रूपुट (raw throughput) आणि हॉरिझॉन्टल स्केलिंगमध्ये Redis जिंकते.

बहुतेक टीम्सना प्रति मिनिट १०,००० पेक्षा जास्त जॉब्सची गरज नसते. जर तुम्ही त्या मर्यादेच्या खाली असाल, तर PostgreSQL वापरा. यामुळे तुमचे आर्किटेक्चर स्वच्छ राहते आणि खर्चही कमी होतो.

स्त्रोत: https://dev.to/software_mvp-factory/postgresql-advisory-locks-for-distributed-job-scheduling-15kp