【问题标题】:Rails: sleep until there is data to respond with (streaming + multithreading)Rails:睡眠直到有数据响应(流+多线程)
【发布时间】:2014-04-08 07:19:49
【问题描述】:

我正在构建一个应该支持实时通知的 Rails/Javascript 应用程序。 JavaScript 是:

var chat;

$(document).ready(function(){
    chat = $('#chat');
    chat.append('mmm');
    (function poll(){
        $.ajax({ url: "http://localhost:3000/get_messages", success: function(data){
            //Update your dashboard gauge
            chat.append(data);
        }, dataType: "json", complete: poll, timeout: 30000 });
    })();
});

路线:

match 'get_messages', to: 'real_time_notifs#get_messages', :via => :get

这是控制器的方法:

def get_messages
  # sleep ??? will it stop the whole application?
  render :json => ['message body']
end

我希望 JavaScript 仅在有要显示的内容(例如,数据库表中出现新消息)时才会收到答案,而不会使整个应用程序停止。您能建议如何组织get_messages 方法吗?

我需要在等待时不会阻塞应用程序其余部分的解决方案。

【问题讨论】:

    标签: ruby-on-rails multithreading ruby-on-rails-4 keep-alive ruby-2.0


    【解决方案1】:

    有很多方法可以实现这一点

    虽然我没有丰富的经验,但你应该从另一个角度考虑它(不仅仅是发送 Ajax 投票请求):


    SSE's (Server Sent Events)

    我建议你使用 SSE 的

    发送的更新不在通常的 HTTP 范围内(使用它自己的 mime type -- text/event-stream),我相信这意味着它们是完全异步的(不管你在应用程序中做什么等)

    SSE 基本上是通过前端部署一个 JS listener 来完成的。这会轮询服务器以获取任何更新,但与 Ajax 不同,它只侦听 text/event-stream mime):

    var source = new EventSource("demo_sse.php");
    source.onmessage = function(event) {
      alert(event.data);
    };
    

    高效的部分是您可以在 Rails 中使用 ActionController::Live::SSE 更新它。我对此没有任何经验,但它基本上允许您通过text/event-stream mime 类型发送更新


    WebSockets

    Websockets 基本上打开了与您的服务器的永久连接,允许您接收超出正常 HTTP 范围的内容

    我的经验并没有扩展到“原生”websockets(我们已经成功使用了Pusher,并且正在开发我们自己的 websock 实现);但我可以说它基本上是 SSE 的更深入的版本

    您必须使用 JS 来验证客户端-服务器连接,一旦连接,浏览器将listen 进行更新。我不确定它的 mime 类型,但阅读 ActionController::Live 会让您深入了解它是如何工作的


    这些方法中的任何一种都可以满足您的需要(仅在可用时发送/接收更新)

    【讨论】:

    • SSE 很棒,但是有一个问题:我们仍然需要一个带有动作的控制器,其中是一个写入流的循环。这种写入由一些启动/停止机制控制,该机制通常基于仅 PostgreSQL 支持的connection.raw_connection.wait_for_notify。问题是:这个机制能不能用ActiveSupport::Notifications.subscribe代替。
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多