2013-06-24 10 views
12

पर सिनात्रा/थिन के साथ नहीं मिला है, मैं सीडर स्टैक पर एक सिनात्रा स्ट्रीमिंग एसएसई प्रतिक्रिया आवेदन तैनात करने का प्रयास कर रहा हूं। दुर्भाग्यवश, यह विकास में पूरी तरह से काम करता है, एक बार हेरोोकू पर तैनात किए जाने पर callback या errback कनेक्शन कहलाते समय कभी भी कॉल नहीं किया जाता है, जिससे कनेक्शन पूल को पुराने कनेक्शन से भरना पड़ता है (जो कभी भी समय समाप्त नहीं होता है क्योंकि डेटा अभी भी उन्हें भेजा जा रहा है सर्वर साइड) Heroku प्रलेखन सेHTTP स्ट्रीमिंग कनेक्शन (एसएसई) क्लाइंट डिस्कनेक्ट हेनोकू

Relvant जानकारी:।

लंबी मतदान और स्ट्रीमिंग प्रतिक्रियाओं

देवदार HTTP लंबी मतदान और स्ट्रीमिंग प्रतिक्रियाओं के रूप में 1.1 सुविधाओं का समर्थन करता। क्लाइंट को एक बाइट बैक के साथ प्रतिक्रिया देने के लिए एक एप्लिकेशन में प्रारंभिक 30 सेकंड विंडो होती है। हालांकि, इसके बाद प्रेषित प्रत्येक बाइट (या तो क्लाइंट से प्राप्त या आपके आवेदन द्वारा भेजा गया) एक रोलिंग 55 दूसरी विंडो रीसेट करता है। यदि 55 सेकंड विंडो के दौरान कोई डेटा नहीं भेजा जाता है, तो कनेक्शन समाप्त कर दिया जाएगा।

यदि आप स्ट्रीमिंग प्रतिक्रिया भेज रहे हैं, जैसे कि सर्वर से भेजे गए ईवेंट के साथ, आपको यह पता लगाना होगा कि ग्राहक कब लटका हुआ है, और सुनिश्चित करें कि आपका ऐप सर्वर तुरंत कनेक्शन बंद कर देता है। यदि सर्वर किसी भी डेटा को भेजे बिना 55 सेकंड के लिए कनेक्शन खोलता रहता है, तो आपको एक अनुरोध टाइमआउट दिखाई देगा।

यह वही है जो मैं करना चाहता हूं - पता लगाएं कि ग्राहक कब लटका हुआ है, और तुरंत कनेक्शन बंद करें। हालांकि, हेरोकू रूटिंग परत के बारे में कुछ ऐसा लगता है कि सिनात्रा को धारा बंद होने की घटना का पता लगाने से रोकना सामान्य रूप से होता है।

कुछ नमूना कोड है कि इस को दोहराने के लिए इस्तेमाल किया जा सकता:

require 'sinatra/base' 

class MyApp < Sinatra::Base 

    set :path, '/tmp' 
    set :environment, 'production' 

    def initialize 
    @connections = [] 

    EM::next_tick do 
     EM::add_periodic_timer(1) do 
     @connections.each do |out| 
      out << "connections: " << @connections.count << "\n" 
     end 
     puts "*** connections: #{@connections.count}" 
     end 
    end 

    end 

    get '/' do 
    stream(:keep_open) do |out| 
     @connections << out 
     puts "Stream opened from #{request.ip} (now #{@connections.size} open)" 

     out.callback do 
     @connections.delete(out) 
     puts "Stream closed from #{request.ip} (now #{@connections.size} open)" 
     end 
    end 
    end 

end 

मैं http://obscure-depths-3413.herokuapp.com/ पर एक नमूना एप्लिकेशन को रख दिया है इस कोड है कि समस्या को दिखाता है का उपयोग कर। जब आप कनेक्ट होते हैं, तो कनेक्शन की मात्रा बढ़ेगी, लेकिन जब आप डिस्कनेक्ट करते हैं तो वे कभी नीचे नहीं जाते हैं। (Gemfile आदि के साथ डेमो का पूरा स्रोत https://gist.github.com/mroth/5853993 पर है)

मैं इस पर डीबग करने की कोशिश कर रहा हूं। किसी को भी पता है कि यह कैसे ठीक करना है?

पीएस ऐसा लगता है कि similar bug in Sinatra रहा है लेकिन यह एक साल पहले तय किया गया था। यह मुद्दा केवल हेरोोकू में उत्पादन पर होता है, लेकिन स्थानीय रूप से चलाने पर ठीक काम करता है।

पीएस.2। यह तब होता है जब कनेक्शन पर पुनरावृत्ति के रूप में अच्छी तरह से वस्तुओं, उदाहरण के निम्नलिखित कोड जोड़ने के लिए:

EM::add_periodic_timer(10) do 
    num_conns = @connections.count 
    @connections.reject!(&:closed?) 
    new_conns = @connections.count 
    diff = num_conns - new_conns 
    puts "Purged #{diff} connections!" if diff > 0 
end 

स्थानीय स्तर पर अच्छा काम करता है, लेकिन जैसा कि Heroku पर बंद कर दिया कनेक्शन कभी नहीं दिखाई देते हैं।

+1

जब आप कहते हैं कि यह स्थानीय रूप से चलाने पर ठीक काम करता है, तो क्या आप 'फोरमैन स्टार्ट' का उपयोग करना सुनिश्चित करते हैं? – Shelvacu

+0

नोड.जेएस स्ट्रीमिंग का उपयोग कर वही बात https://gist.github.com/Funfun/6867167 – CodeGroover

उत्तर

2

एक अद्यतन: सीधे हेरोोकू रूटिंग टीम (जो महान लोग हैं!) के साथ काम करने के बाद, यह अब उनकी नई रूटिंग परत में तय किया गया है, और किसी भी प्लेटफ़ॉर्म में ठीक से काम करना चाहिए।

1

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

कृपया, इस सरल बातचीत कार्यान्वयन को देखें https://gist.github.com/tlewin/5708745 जो इस अवधारणा को दर्शाता है।

एप्लिकेशन एक साधारण JSON प्रोटोकॉल का उपयोग कर क्लाइंट के साथ संचार करता है। जब ग्राहक को alive: true संदेश प्राप्त होता है, तो एप्लिकेशन एक प्रतिक्रिया वापस पोस्ट करता है और सर्वर अंतिम संचार समय संग्रहीत करता है।

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