2011-03-29 8 views
5

यहां एक ओपन-एंड प्रश्न का बिट, इसलिए मैं पहले समस्या की रूपरेखा तैयार करूंगा। हमारे पास Resque कर्मचारी है जो कतार से डेटा-सिंक्रनाइज़ेशन नौकरियों को पॉप करना चाहता है, कारण दो गुना हैं, क्रॉन का उपयोग करके (और रेल पर्यावरण पर्यावरण बूट समय ओवर-एंड-ओवर का भुगतान) बेकार है, और वैकल्पिक कतार, अच्छी तरह से गिथब बनाया गया उनके खिलाफ एक बहुत अच्छा मामला जब वे announced Resque। इसके अलावा, Redis समय श्रृंखला कार्यक्षमता पहले से ही हमारे बुनियादी ढांचे, जहां हम भी RRDTool & आदि में टीएस डेटा शफ़ल की भूमिका अदा करता है ...ActiveRecord फोर्क/थ्रेडेड एप्लिकेशन के अंदर चलते समय पुनः कनेक्ट करने में असमर्थ?

यहाँ समस्या है, नौकरियों के बीच एक आम त्रि-घंटे के साथ (लेकिन कर्मचारी किसी भी समय नौकरियां निर्धारित कर सकते हैं ... इसलिए कतार), PostgreSQL सर्वर चला जाता है। इलाज के लिए काफी आसान है, मुझे उम्मीद है कि संबंधित वातावरण के तहत reconnect: true सेटिंग सुनिश्चित करेगा कि यह अपेक्षित के रूप में काम करे .. मैंने fewplaces में पढ़ा है कि reconnect: truefork() का उपयोग करने वाले अनुप्रयोगों के लिए काम नहीं करेगा। जो, स्वाभाविक रूप से Resque करता है, अपने कर्मचारियों को शुरू करने के लिए ... जिस हिस्से को मैं समझ नहीं पा रहा हूं वह है कि ActiveRecord का पुन: कनेक्ट इन परिस्थितियों में क्यों काम नहीं कर सकता है?

मैं की reconnect!MySQL Adapter और ActiveRecord में PostgreSQL Adapter अलग हैं कार्यान्वयन देखा ... लेकिन किसी भी तरह से मैं ActiveRecord reconnect: true विन्यास काम करने की उम्मीद होगी। एक ऐसे में एक filehandle बंद करने के लिए यह संभव है -

समस्या

(इस प्रकार डेटाबेस के लिए कनेक्शन को फांसी) पर्याप्त, जब बच्चे प्रक्रिया मौजूद है, यह फ़ाइल माता-पिता द्वारा बनाई गई हैंडल बंद कर देता है स्पष्ट हो रहा है जिस तरह से ActiveRecord यह नहीं पहचानता कि कनेक्शन समाप्त कर दिया गया है?

वहाँ भी है, क्या इसके लायक है के लिए, एक ActiveRecord aware fork() जो मैं एक pastie के रूप में, Github पर मिल करने में सक्षम था - यह untested है, लेकिन मैं यह काम करता है मान (वर्तमान रेल के साथ यह प्रयास नहीं किया है ..)

मेरा प्रश्न अधिक है, यदि आप fork() पर स्वचालित रूप से एआर काम में पुन: कनेक्ट नहीं कर सकते हैं? (और, बाद में - मैं अकेला व्यक्ति नहीं हो सकता जो इस समस्या का सामना कर रहा है; मैं इसे पीजीएसक्यूएल का उपयोग रेस्क्यू के साथ करने के लिए तैयार कर रहा हूं!)

उत्तर

6

बिल्कुल जवाब नहीं है कि "यह फिर से कनेक्ट क्यों नहीं हो सकता "है, लेकिन मुझे लगता है कि क्या आप मदद कर सकते हैं आरंभीकरण चरण में कहीं डाल निम्नलिखित कोड है:


Resque.after_fork do |job| 
    ActiveRecord::Base.connection.reconnect! 
end 

अद्यतन: पुनः कनेक्ट के बारे में - ऐसा लगता है कि यह MySQL केवल सुविधा है। इस प्रकार इसका उपयोग mysql एडाप्टर में किया जाता है: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb#L848 जैसा कि आप देख सकते हैं, यह अंतर्निहित ड्राइवर की पुन: कनेक्ट सुविधा का उपयोग करता है। https://github.com/kwatch/mysql-ruby/blob/master/ext/mysql.c#L923

दूसरी ओर, PostgreSQL एडाप्टर reconnect विकल्प के संबंध में कुछ भी नहीं है, आप https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb

भी देख सकते हैं, PostgreSQL साइट में खासतौर पर कहा गया है कि "खुला libpq कनेक्शन के साथ एक प्रक्रिया forking अप्रत्याशित परिणाम का कारण बन सकता है "- http://www.postgresql.org/docs/9.0/interactive/libpq-connect.html और यह भी स्पष्ट है कि सी चालक कोई पुन: कनेक्ट सुविधा प्रदान नहीं करता है।

+0

रोमन, यकीन है - मेरे पास कामकाज है, लेकिन मैं विशेष रूप से पुनः कनेक्ट करने का कारण ढूंढ रहा हूं: सत्य काम नहीं करता है।मैं सोच रहा हूं कि यह समरूपता (activerecord की 'allowconcurrency' ध्वज) के बारे में कुछ है - और यह स्वीकार करना कि पहला कनेक्शन अभी भी जुड़ा हुआ है ... लेकिन मुझे वास्तव में नुकसान हुआ है। –

+0

ठीक है, activerecord कोड को देखकर, मैं क्या कह सकता हूं, यह है कि 'रीकनेक्ट' विकल्प PostgreSQL एडाप्टर के लिए समर्थित नहीं है। – Roman

+0

रोमन, क्या आप अधिक विशिष्ट हो सकते हैं, शायद एक लिंक - वहां कहीं भी एक कार्यान्वयन हुआ था ... (मुझे यकीन है) –