我有以下西納特拉應用程式:如何使用sinatra streaming api關閉redis連接?
require 'sinatra'
require 'redis'
require 'json'
class FeedStream < Sinatra::Application
helpers do
include SessionsHelper
def redis
@redis ||= Redis.connect
end
end
get '/feed', provides: 'text/event-stream' do
stream do |out|
redis.subscribe "feed" do |on|
on.message do |channel, message|
event_data = JSON.parse message
logger.info "received event = #{event_data}"
out << "event: #{event_data['event']}\n"
out << "data: #{{:data => event_data['data'],
:by => current_user}}.to_json\n\n"
end
end
end
end
end
基本上,它接收使用redis的發佈訂閱由其他用戶發佈到飼料事件,然後將其發送與特拉流API的那些事件。 問題是,當瀏覽器重新連接到feed時,redis客戶端保持連接,並且它一直在接收事件,所以redis服務器充滿了無用的連接。 一旦broser關閉與web服務器的連接,我怎樣關閉所有這些連接?
你有沒有想過呢?我遇到了Rails中的類似問題,並且[發佈了類似的問題](http://stackoverflow.com/q/18970458/877472)。這個問題包括一個潛在的解決方案,它可以工作,但非常愚蠢。 – 2013-09-25 20:01:57