【问题标题】:Interval based API access and processing different DSL基于间隔的API访问和处理不同的DSL
【发布时间】:2016-10-02 21:01:36
【问题描述】:

背景

我目前正在处理一个需要访问和处理外部 API 的小型 Rails 5 项目。有一个可用于 API 的 ruby​​ 包装器 gem,因此访问数据不是问题。

问题描述

我目前缺少等式的两个部分,希望有人可以帮助我。

1:我需要每 15 分钟通过 Rails 调用一次 API。我怎么能意识到这一点?我一直在为此寻找 Active Job,但在没有得到有用的结果后,我的研究有点停滞。

2:与我的应用程序相比,外部 API 具有不同的域模型和不同的域特定语言。如何在不更改 Active Record 的情况下映射不同的模型?

【问题讨论】:

    标签: ruby-on-rails json api


    【解决方案1】:

    1:我需要每 15 分钟通过 Rails 调用一次 API。我怎么能意识到这一点?我一直在为此寻找 Active Job,但在没有得到有用的结果后,我的研究有点停滞。

    您可以使用重复任务解决的第一个问题。主要思想是运行将每 x 分钟(或几天或适合您的问题的任何时间)执行一些操作的过程。

    您可以使用多种工具。其中之一是unix系统内置的,它是cron。您可以在系统手册中阅读有关它的信息。您可以使用whenever gem 轻松管理它。主要缺点是您需要访问系统的 cron,这在非裸机(例如 Heroku 等平台即服务主机)上可能很重要。

    您还应该看看clockwork,它不依赖于系统的cron。它使用的方法是让您始终运行一个单独的进程,并密切关注已定义的任务。

    在第二种方法(具有单独的进程)中,您需要记住耗时的指令可能会“锁定”进程并推迟其他任务。在这种情况下,您可能需要使用后台处理,例如 sidekiqdelayed_job。这个想法是使用一个进程在特定时间安排任务,而另一个进程在这些任务出现在队列中时立即处理它们。

    2:与我的应用程序相比,外部 API 具有不同的域模型和不同的域特定语言。如何在不更改 Active Record 的情况下映射不同的模型?

    您需要创建一个客户端,该客户端将使用 API 并将其响应映射到您在应用程序中拥有的模型中。这样,您不需要使模型的方案依赖于 API 方案。看看resource_kit gem - 这是一个使用这种方法的示例解决方案。

    【讨论】:

    • 嘿@smefju,任务 我选择了“rufus-scheduler”作为我的工作/调度系统。我只运行一项任务,每 15 分钟一次。锁定应该不是问题。这个 API 的处理不是很繁重。该作业主要检查数据是否有变化。如果有更改,则应进行处理。到目前为止,我已经实现了它,并且效果很好。 模型 我从外部 API 返回的 JSON 被我处理的 gem 解析,所以我的结果数据是一个带有哈希的 ruby​​ 数组。我目前正在寻找只提取我想要的数据并从那里创建一个新对象。
    • 我现在只是想弄清楚如何让它看起来整洁。无论如何,谢谢@smefju!
    【解决方案2】:

    你好,hdauven,

    1. 每 15 分钟处理一次 API 会影响您的服务器性能,所以使用 sidekiq 完成它,它是一个后台作业,使用 sidetiq 它将帮助您每 15 分钟自动执行一次任务

    2. 您正在访问 API,那您为什么还要担心不同的域。

    【讨论】:

    • API 在其 JSON 方案中有一些怪癖,这使得它们难以映射到我的模型。有些数据需要丢弃,有些需要重组。
    • sidetiq/sidekiq 组合似乎不适用于我的 Ruby 和 Rails 版本。相反,我选择了 rufus-scheduler 或 Crono。
    • 处理任务不会影响服务器性能。它可能会在任务正在处理时锁定进程。主要问题不是使用后台处理,而是使用重复任务。
    • 是的 rufus-scheduler 基于内部时钟系统,优于 cron
    • 您想将 json 数据映射到您使用的 somparsers 中,例如 1)a=JSON.parse(json data) 2)a.map (|k,v| k.to_sum: vto_s) 像这样
    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 2021-05-22
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多