2014-07-23 13 views
8

मेरे पास एनजीआईएनएक्स और प्यूमा के साथ होस्ट किए गए रेल ऐप हैं। हर 10 घंटे या तो, ऐप अनुपयोगी हो जाता है। जब भी कोई उपयोगकर्ता कनेक्ट करने का प्रयास करता है, तो निम्न त्रुटि संदेश प्रदर्शित होता है:रेल 4 डेटाबेस कनेक्शन पूल त्रुटि

Error during failsafe response: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds) 

यह तब तक जारी रहता है जब तक ऐप पुनरारंभ नहीं होता है।

मैंने पढ़ा है कि ऐसा इसलिए है क्योंकि डेटाबेस कनेक्शन पूल भरा हुआ है, और ऐसे में रेल ऐप में थ्रेड बनाए जा रहे हैं जो समाप्त होने पर डेटाबेस से उनके कनेक्शन को बंद नहीं कर रहे हैं। मेरे ज्ञान के लिए, ऐप कोड में केवल एक ही स्थान है जहां धागे का उपयोग किया जाता है: एक ब्लॉक रूबी टाइमआउट मॉड्यूल का उपयोग करता है, लेकिन यह डेटाबेस तक नहीं पहुंचता है।

के बाद इस गाइड https://devcenter.heroku.com/articles/concurrency-and-database-connections (मैं वास्तव में Heroku उपयोग नहीं कर रहा) मैं निम्नलिखित कॉन्फ़िग फ़ाइल के साथ करने के लिए 5 डेटाबेस कनेक्शन पूल के आकार निर्धारित किया है,:

#config/initializers/database_connection.rb 
Rails.application.config.after_initialize do 
    ActiveRecord::Base.connection_pool.disconnect! 

    ActiveSupport.on_load(:active_record) do 
    config = ActiveRecord::Base.configurations[Rails.env] || 
       Rails.application.config.database_configuration[Rails.env] 
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds 
    config['pool']    = ENV['MAX_THREADS'] || 5 
    ActiveRecord::Base.establish_connection(config) 
    end 

अंत

साइट रेल 4.0.0 का उपयोग कर होस्ट किया गया है। मैंने पढ़ा है कि यह वास्तव में एक रेल 4.0.0 समस्या हो सकता है, और यह बाद के संस्करणों में तय किया गया था, लेकिन मुझे इस बारे में अनिश्चितता है। ConnectionTimeoutError on Heroku with Postgres

  1. वहाँ कनेक्शन पूल में सक्रिय डेटाबेस कनेक्शन की संख्या पर नजर रखने के कोई तरीका है? यह डीबगिंग को अधिक आसान बना देगा।
  2. इस समस्या के कारण रेल ऐप कोड के भीतर टाइमआउट मॉड्यूल का उपयोग कर रहा है?
  3. क्या यह मेरे ऐप के साथ किसी समस्या की बजाय रेल 4.0.0 समस्या होने की संभावना है?

रेल ऐप उत्पादन वातावरण में चल रहा है। यदि आवश्यक हो तो मैं अपने प्यूमा, एनजीआईएनएक्स कॉन्फ़िगरेशन पर अधिक जानकारी दे सकता हूं।

+0

मैं इनमें से एक टन भी 4.1 ऐप पर देख रहा हूं, जिसे मैंने कभी भी 3.x पर नहीं देखा, इसलिए मुझे लगता है कि समस्या वास्तव में तय नहीं हुई थी। – riffraff

+0

कोई भी इसके लिए एक फिक्स पाता है? मैं भी यह देख रहा हूँ। मेरे पास 'airbrake' मणि और/या 'application_controller.rb' में' current_user' का उपयोग करके एक जुड़ाव है। किसी और को एयरब्रैक मणि का उपयोग करके या application_controller.rb में current_user का उपयोग करके यह त्रुटि है? – Catfish

+0

मेरे विकास सर्वर को Webrick पर स्विच करके मुझे यह त्रुटि दिखाई नहीं दे रही है। मैं सोच रहा हूँ कि अपराधी प्यूमा है। – Catfish

उत्तर

0

मुझे नहीं लगता कि यह रेल 2.0.0 समस्या है।

तो जैसा कि ruby timeout module documentation में उल्लिखित है, यह एक नया धागा है। मुझे लगता है कि एक मौका है कि यह लंबे समय तक चलने वाले थ्रेड चुड़ैल को डीबी कनेक्शन को लाइव रख सकता है। चलने वाले धागे की जांच करने के लिए आप Thread.list विधि का उपयोग कर सकते हैं। यह भी ध्यान रखें कि आपका पूल आकार> = प्यूमा धागे की तुलना में प्यूमा श्रमिकों को गुणा करना चाहिए।

2

तथ्य यह है कि विफलता प्रतिक्रिया डेटाबेस कनेक्शन आवंटित करने का प्रयास कर रही है, एक धूम्रपान बंदूक हो सकती है। यह असफल प्रतिक्रिया में क्या होता है इसका वर्णन करने में आपकी सहायता कर सकता है। जब मूल अनुरोध ने अपवाद को ट्रिगर किया तो असफलता प्रतिक्रिया संभावित रूप से ट्रिगर की गई थी। रेलवे show_exception दिनचर्या जो असफल प्रतिक्रिया को कॉल करती है उसे कनेक्शन प्रबंधक के बाद clear_active_connections कहते हैं! वर्तमान अनुरोध (जो अपवाद के साथ विफल रहा) के लिए, जिसका मतलब है कि असफलता विफल होने के बाद रेल स्वचालित रूप से डेटाबेस कनेक्शन जारी नहीं करेंगे। इसका मतलब है कि असफलता प्रतिक्रिया हैंडलर अपने डेटाबेस कनेक्शन को साफ करने के लिए ज़िम्मेदार है। मुझे यकीन नहीं है कि विफलता प्रतिक्रिया हैंडलर डेटाबेस से कनेक्ट करने का प्रयास करने के लिए यह अच्छा अभ्यास है, लेकिन यदि यह वांछित व्यवहार है, तो आपको clear_active_connections को कॉल करना पड़ सकता है! स्पष्ट रूप से आपके असफलता हैंडलर (एक सुनिश्चित ब्लॉक में) के अंत में।

मैं अपने स्वयं के ऐप में एक ही समस्या की जांच कर रहा हूं और कनेक्शन के काम के लिए यह एक उपयोगी मार्गदर्शिका है: https://bibwild.wordpress.com/2014/07/17/activerecord-concurrency-in-rails4-avoid-leaked-connections/।जबकि यहां संदर्भित कोड में कुछ बदलावों की आवश्यकता हो सकती है, वहां एक अंतर्निहित डेटाबेस कनेक्शन बनाते समय पता लगाने के तरीके के बारे में एक अच्छी रूपरेखा है।

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