作者:mobiledu2502877697 | 来源:互联网 | 2023-05-26 18:12
我正在使用Ruby on Rails 4.1,使用ActionController :: Live从Sidekiq进程传输数据.在开发中,我的流媒体工作非常棒.在生产中(使用Nginx/Puma),它并不是很好.这是正在发生的事情.
在制作中,参考我的Firebug下面的图像,"/ events"被多次发射.为什么我EventSource
会被反复解雇而不是等待我的数据呢?这在开发中不会发生.
![Firebug EventSource](https://img.php1.cn/3cd4a/1eebe/cd5/b428d8f746fb8d47.webp)
只要我的Sidekiq进程正在运行,它将以随机间隔重复触发.一旦我的sidekiq进程完成,它将挂起并且不再启动.然后最后一个将最终超时(见图中的红色文字)
这是我的coffeescript:
source = new EventSource('/events')
source.addEventListener 'my_event', (e) ->
console.log 'Got a message!'
# Add the content to the screen somewhere
参考Firebug图像,它几乎就像我在Sidekiq过程中超时一样.我是从工人那里发帖到redis的.
初始化
REDIS = Redis.new(url: 'redist://localhost:6379')
Sidekiq工人
REDIS.publish('my_event', 'some data')
然后我有连接EventSource的控制器动作:
def events
response.headers["Content-Type"] = "text/event-stream"
redis = Redis.new(url: "redist://localhost:6379")
# blocks the current thread
redis.subscribe(['my_event', 'heartbeat']) do |on|
on.message do |event, data|
if event == 'heartbeat'
response.stream.write("event: heartbeat\ndata: heartbeat\n\n")
elsif event == 'my_event'
response.stream.write("event: #{event}\n")
response.stream.write("data: #{data.to_json}\n\n")
end
end
end
rescue IOError
logger.info 'Events stream closed'
ensure
logger.info 'Stopping events streaming thread'
redis.quit
response.stream.close
end
再次,这在开发中100%出色.来自Sidekiq的数据完全流向浏览器.上面的心跳是因为这个答案(我有同样的问题)
有人看到我做错了吗?我是否错过了ActionController::Live
使用Nginx/Puma在生产中工作的某种形式的设置?
重要的提示
在每个来自图像的请求(它似乎超时并尝试执行下一个请求)的非常结束时,我成功获得了一行数据.所以一些工作似乎.但是单曲EventSource
并没有保持开放并且足够长时间地监听数据,它只是不断重复.
1> 小智..:
我最近的一个项目遇到了类似的问题.我发现这是我的nginx配置.
将以下内容添加到位置部分:
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
此信息来自以下Stack Overflow讨论:
通过Nginx发送EventSource/Server-Sent事件
希望这可以帮助.