Tag: 发布 订阅

Redis + ActionController ::活线程不会死亡

背景:我们已经在我们现有的一个Rails应用程序中构build了一个聊天function。 我们使用新的ActionController :: Live模块并运行Puma(在生产中使用Nginx),并通过Redis订阅消息。 我们使用EventSource客户端来asynchronousbuild立连接。 问题摘要:连接终止时,线程永远不会死亡。 例如,如果用户离开,closures浏览器,甚至到应用程序中的不同页面,则会生成一个新线程(如预期的那样),但是旧线程继续存在。 我现在看到的问题是,当发生这些情况时,服务器无法知道浏览器端的连接是否终止,直到试图写入这个断开的stream,而浏览器永远不会发生已经离开原来的页面。 这个问题似乎被logging在github上 ,并且在StackOverflow上也有类似的问题(相当好的问题)和这里(关于获取活动线程的数量) 。 基于这些post,我能够想出的唯一解决scheme是实现一种线程/连接扑克。 试图写入一个断开的连接会生成一个IOError ,我可以捕获并正确closures连接,从而使线程死亡。 这是该解决scheme的控制器代码: def events response.headers["Content-Type"] = "text/event-stream" stream_error = false; # used by flusher thread to determine when to stop redis = Redis.new # Subscribe to our events redis.subscribe("message.create", "message.user_list_update") do |on| on.message do |event, data| # when message is received, write […]