【问题标题】:Share data between ActiveJob and Controller在 ActiveJob 和 Controller 之间共享数据
【发布时间】:2015-08-14 18:25:32
【问题描述】:

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

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

  1. 打开 SSE 连接;
  2. 形成动态网址;
  3. 从远程服务器拉取新数据;
  4. 比较/重新分配seqnum 值;
  5. 根据需要更新数据库。

所以我现在的目标是通过将更新的值推送到浏览器 (ActionController::Live) 分开拉取和更新数据库 (ActiveJob)。为此,我需要:

  • 要么存储在服务器端 seqnumversion 的某个位置,以便在控制器和后台作业之间共享;
  • 或监视数据库以了解updated_at 字段中的最新更改。

所以基本上我有两个问题:

  • 以上两个选项之间哪个更有效?还有其他好的方法吗?
  • (如果第一个有权存在)如何实现这种方法?

【问题讨论】:

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


    【解决方案1】:

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

    绝对存储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 端点,这次是在您的小应用上),然后再发送它们给您的客户。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多