我在页面上有一个汽车表和一个名为refresh的按钮。当用户点击刷新按钮时。控制器操作首先为经销商1和类型1以及类型2等启动API调用,直到类型30.然后它为经销商2调用API ..
所以最后它会调用300个请求(10 * 30)。然后我用jquery填充下表。
Car |Dealer 1| |Dealer 2| |Dealer 3| |..| |Dealer 10|
Type 1
Type 2
Type 3
..
..
Type 30
所以问题是需要花费太多时间。我正在考虑使用cron作业。但据我所知,我无法从那里获得回报价值。所以我可以成像,我必须每10分钟左右将数据保存到我的数据库,然后当用户点击刷新时。它从数据库中获取。
实际上,我不需要将数据保存到我的数据库,这个想法只是填补了表格。
另一个想法是,当用户点击刷新然后ruby启动cron作业。每次API调用后都会保存数据。但那我怎么能刷新视图呢?
PS:我没有开始编码,这就是我无法共享任何代码的原因。但我找不到有效地做到这一点的方法。
修改 好吧,我明白了。但每个经销商都有不同的api url和不同的类型结构。例如;
Dealer 1;
api.dealer1/get_prices?type1
Dealer 2;
api.dealer2/fetch_prices?type_1
Dealer 3;
api.dealer3/prices?TYPE1
..
这就是为什么我想为每个经销商编写10个lib模块并循环遍历类型数组。然后返回将返回的数据推送到数组并用jquery(ajax)填充表。最后,我每秒可以发送1个Api呼叫。
编辑2:
我在batch api requests上观看了有关视频的视频。 他用架子中间;
class BatchRequests
def initialize(app)
@app = app
end
def call(env)
if env["PATH_INFO"] == "/batch"
request = Rack::Request.new(env.deep_dup)
responses = JSON.parse(request[:requests]).map do |override|
process_request(env.deep_dup, override)
end
[200, {"Content-Type" => "application/json"}, [{responses: responses}.to_json]]
else
@app.call(env)
end
end
def process_request(env, override)
path, query = override["url"].split("?")
env["REQUEST_METHOD"] = override["method"]
env["PATH_INFO"] = path
env["QUERY_STRING"] = query
env["rack.input"] = StringIO.new(override["body"].to_s)
status, headers, body = @app.call(env)
body.close if body.respond_to? :close
{status: status, headers: headers, body: body.join}
end
end
但是我怎么能在这里插入不同的网址呢?
答案 0 :(得分:0)
这与cron工作无关。您需要减少正在进行的API调用的总数,而不是关注如何最好地在后台进行调用"。
最佳解决方案是在单个API调用中获取多个(甚至所有)数据。这个原则被称为"批量查询",这是一个基本的设计原则,以避免像你最初提出的那样进行数百个单独的调用。
例如,它看起来像:
GET /api/v1/car_prices?types[]=1&types[]=2&...&types[]=30&dealers[]=1&...&dealers[]=10
# Response:
[
{
type: 1,
dealer: 1,
price: 3000
},
{
type: 1,
dealer: 2,
price: 2500
},
# ...
{
type: 30,
dealer: 10,
price: 12000
}
]