Tag: rack middleware

在Middleware中运行的线程正在使用旧版本的父实例变量

我使用Heroku教程来实现websockets。 它适用于Thin,但不适用于Unicorn和Puma。 还有一个回应消息实现,它响应客户端的消息。 它在每个服务器上都能正常工作,因此websockets实现没有问题。 Redis设置也是正确的(它捕获所有消息,并执行subscribe块内的代码)。 它现在如何工作: 在服务器启动时,初始化一个空的@clients数组。 然后启动新的Thread,它正在侦听Redis,它旨在从@clients数组向相应的用户发送该消息。 在页面加载时,会创建新的websocket连接,它存储在@clients数组中。 如果我们从浏览器收到消息,我们会将其发送回与同一用户连接的所有客户端(该部分在Thin和Puma上都正常工作)。 如果我们收到Redis的消息,我们也会查找存储在@clients数组中的所有用户连接。 这是奇怪的事情发生的地方: 如果使用Thin运行,它会在@clients数组中找到连接并将消息发送给它们。 如果使用Puma / Unicorn运行,@ client数组总是为空,即使我们按该顺序尝试它(没有页面重新加载或任何东西): 从浏览器发送消息 – > @clients.length为1,传递消息 通过Redis发送消息 – > @clients.length为0,消息丢失 从浏览器发送消息 – > @clients.length仍为1,消息已发送 请问有人请告诉我我错过了什么? Puma服务器的相关配置: workers 1 threads_count = 1 threads threads_count, threads_count 相关中间件代码: require ‘faye/websocket’ class NotificationsBackend def initialize(app) @app = app @clients = [] Thread.new do redis_sub […]