ruby-on-rails - 在 ActiveJob 和 Controller 之间共享数据

标签 ruby-on-rails ruby-on-rails-4 ruby-on-rails-4.2 rails-activejob

应用程序每 n 秒请求一个远程 JSON 文件,该文件提供交易系统中证券的实时价格。 JSON 有一个包含我需要的数据的块 ( marketdata ) 和一个包含当前 dataversion 的块( versionseqnum )。

现在我使用 ActionController::Live (在客户端使用 EventSource)将更新的数据推送到浏览器。所有操作都在一种方法中完成:

  • 打开 SSE 连接;
  • 形成动态网址;
  • 从远程服务器拉取新数据;
  • 比较/重新分配 seqnum值(value);
  • 如果需要,更新数据库。

  • 所以我现在的目标是通过将更新的值推送到浏览器( ActiveJob )来分离拉取和更新数据库( ActionController::Live )。为了做到这一点,我需要:
  • 要么存储在服务器端的某个地方 seqnum & version在 Controller 和后台作业之间共享;
  • 或监视数据库以获取 updated_at 中的最新更改领域。

  • 所以基本上我有两个问题:
  • 以上两种选择哪个更有效?还有其他好的方法吗?
  • (如果第一个有权存在)如何实现这种方法?
  • 最佳答案

    例如,考虑到您可能有多个 rails 进程在运行,我相信您很难让 activejob 以某种方式直接与 rails Controller 对话。

    专卖店seqnumversion ,我不会依赖 updated_at无论如何,随机更新它太容易了,因此最终会在没有任何真正原因的情况下向客户端发送内容。同样在这种情况下,它们似乎是非常可靠的字段,可以指出文件是否已更新。

    带轮询

    话虽如此,您想“发出信号”ActionController::Live以某种方式,恐怕在这里轮询是您唯一的选择,除非在您的客户端有特定时刻需要知道文件是否已更新,在这种情况下,您可能想要使用 websockets 或类似的东西。

    所以,像

    cached_request = YourCachedRequest.latest # Assuming it returns a single record
    updated        = true
    loop do
      if updated
        updated = false
        response.stream.write cached_request.serialize_in_some_way
      end
      current_version = cached_request.version # use seqnum too if you need
      cached_request = cached_request.reload
      updated = true if cached_request.version > current_version
      sleep 20.0
    end
    

    没有投票

    如果你想要一个不涉及轮询的选项,我相信你只能选择 websockets。但是,您有一个更有效的选择:

    创建一个迷你应用程序(evenmachine/sinatra/something light),客户端将在其中进行轮询(您可以通过主应用程序将其分发到该迷你应用程序的不同节点),该应用程序的重点只是从您的主应用程序重新路由消息轮询客户端的应用程序。

    现在,您可以为您的主应用程序创建一个内部 API 端点,它仅供延迟作业使用。延迟作业只有在注意到获取的 JSON 相对于当前存储的 JSON 实际更新时才会命中此端点。如果是这种情况,它将命中您的主应用程序 API 端点,后者又会向您的所有小应用程序实例发送一条消息(同样,可能通过 HTTP API 端点,这次是在您的小应用程序上),后者又会发送它们给您的客户。

    通过这种方式,您不会使主服务器过载,而只会使这些迷你节点过载 局部中断 (这是一个很大的优势,而不是有一个大的系统中断)。

    关于ruby-on-rails - 在 ActiveJob 和 Controller 之间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30571044/

    相关文章:

    ruby-on-rails-4 - 上限部署失败, "LoadError: cannot load such file -- sidekiq/capistrano"

    ruby-on-rails - 在 Rails 中使模型不可删除

    ruby-on-rails - 使用 Paperclip 和 AWS S3 自定义 URL

    ruby-on-rails - 如何使用大写列名的 Rails?

    ruby-on-rails - Rails 帮助程序创建有效的 URI(带有转义字符)

    mysql - Rails 查询多个表的关联

    javascript 未在 Rails 编辑页面上执行

    ruby-on-rails - ruby rails : How do you add add zeros in front of a number if it's under 10?

    javascript - 检查 Javascript 是否可用并重定向到另一个页面

    ruby-on-rails - 设计..首次登录后应要求更改密码