目前,我正在构建一个应用程序,允许用户对产品和管理员进行投标,以批准他们。“事务”本身发生在应用程序范围之外。目前,用户在交易/新页面上查看资产的价格,并通过提交表单提交投标。管理员点击一个按钮来批准出价。
class TransactionsController < ApplicationController
before_action :get_price
def new
@price = get_price
@tansaction = Transaction.new
end
###
def get_price
@price = <<Some External Query>>
end
def approve
t = Transaction.find(params[:id])
t.status = "Approved"
t.update!
end显然这并不理想。我不想在每次用户想要提交投标时查询API。理想情况下,我可以在后台每5-10秒查询这个API,并以这种方式使用价格。我看过几种运行后台作业的技术,包括delayed_job、sidekiq和resque。例如,在sidekiq中,我可以运行这样的操作:
#app/workers/price_worker.rb
class PriceWorker
include Sidekiq::Worker
def perform(*args)
get_price
end
def get_price
@price = <<Some External Query>>
end
end
#config/initializers/sidekiq.rb
schedule_file = "config/schedule.yml"
if File.exists?(schedule_file) && Sidekiq.server?
Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
end
#config/schedule.yml
my_price_job:
cron: "*/10 * * * * * "
class: "PriceWorker"代码会运行。问题是,我有点不知道如何处理价格变量,并将其从工人那里传回给用户。我已经看过铁道部的插曲,既为旁人,也为雷斯克。我已经编写了后台工作人员和作业,它们可以排队并正常运行,但我想不出如何将它们实现到我的应用程序中。这是我第一次处理背景工作,所以我有很多东西要学。我花了一些时间研究这个问题,似乎更多的后台作业被用于更长时间运行的任务,比如更新db索引,而不是不断地重复作业(比如每5秒请求一次API请求)。
因此,总之,运行一个不断重复的任务(例如在Rails中查询外部API )的适当技术是什么?任何反馈意见,如何正确地做到这一点,将是非常感谢!谢谢。
发布于 2017-11-21 19:55:06
背景工作不是这样工作的。你说得对,你有很多书要读。将运行像Sidekiq这样的异步作业处理器看作是运行一个完全独立的应用程序。它与您的Rails应用程序共享相同的代码库,但它完全独立运行。如果你想让这两个独立的应用程序相互交流,那么你就必须设计和编写这段代码。
例如,我将使用读取器和写入方法定义缓存,然后在必要时填充缓存:
此后,缓存将由Sidekiq填充:
继续从上文第3步开始:
当next客户端加载产品"foo“时,Rails将读取Sidekiq更新(或未更新)的缓存。
对于这种类型的系统,缓存必须是某种类型的外部存储,比如关系数据库(MySQL、Postgres、Sqlite)或NoSQL数据库(Redis,memcache)。您不能使用内部Rails缓存,因为Rails缓存只存在于Rails应用程序的内存空间中,并且是而不是Sidekiq可读的。(因为Sidekiq作为一个完全独立的应用程序运行)
发布于 2017-11-21 18:03:28
我想在这种情况下,您应该使用rails缓存。把这样的东西放在你的控制器里:
@price = Rails.cache.fetch('price') do
<<Some external query>>
end还可以通过设置expires_in参数来配置缓存过期日期,有关详细信息,请参阅https://apidock.com/rails/ActiveSupport/Cache/Store/fetch。
关于使用后台作业来更新“价格”值,您需要以任何方式存储检索到的数据(使用某种数据库),并将其获取到控制器中。
https://stackoverflow.com/questions/47419543
复制相似问题