पर सिनात्रा/थिन के साथ नहीं मिला है, मैं सीडर स्टैक पर एक सिनात्रा स्ट्रीमिंग एसएसई प्रतिक्रिया आवेदन तैनात करने का प्रयास कर रहा हूं। दुर्भाग्यवश, यह विकास में पूरी तरह से काम करता है, एक बार हेरोोकू पर तैनात किए जाने पर 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 पर बंद कर दिया कनेक्शन कभी नहीं दिखाई देते हैं।
जब आप कहते हैं कि यह स्थानीय रूप से चलाने पर ठीक काम करता है, तो क्या आप 'फोरमैन स्टार्ट' का उपयोग करना सुनिश्चित करते हैं? – Shelvacu
नोड.जेएस स्ट्रीमिंग का उपयोग कर वही बात https://gist.github.com/Funfun/6867167 – CodeGroover