在Heroku上,SSE/长轮询连接是否会占用Unicorn进程?

4
我们有一个运行在Unicorn/Heroku上的Rails应用程序,Unicorn配置为处理3个并发工作进程。
我们还设置了延迟任务,以异步处理一些长时间运行的文件处理任务,这些任务由客户端请求触发。
我们希望在任务完成时更新客户端。我们可以使用传统的轮询来实现,但正在研究使用新的EventSource HQ Heroku附加组件来增加响应性并减少不必要的HTTP轮询请求的开销。
EventSource HQ使用SSE和长轮询的混合方式来确保跨浏览器兼容性。我试图弄清楚的是,EventSource HQ打开的连接是否会在连接的生命周期内占用一个Unicorn工作进程?换句话说,如果我有3个并发的长时间运行的任务通过EventSource HQ连接进行处理,我的Web Dyno是否无法接收新的请求?

你计划使用ActionController:Live吗? - 0bserver07
服务器发送事件(Eventsource)API是基于HTTP的。HTTP也有空闲超时时间。我相信你计划使用Action Controller: Live,然后在调用完成后可以关闭流。但是这可能会破坏一次性通过所有请求的机会,为此需要类似Redis或pgsql nnotify的东西。 - 0bserver07
1个回答

1
如果您使用类似EventSource的东西,那么不会为每个连接的客户端阻塞一个独立的Unicorn进程。这是因为它使用了发布/订阅模型。客户端订阅到一个EventSource套接字(您从服务器创建并将套接字ID传递给客户端),当服务器有事件(如完成作业)时,客户端会收到发布的消息。
现在,如果您想实现自己的发布/订阅API,则使用node.js或非阻塞框架(如Goliath)也相当容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接