有效处理300个api调用|导轨

时间:2018-01-03 23:37:20

标签: ruby-on-rails ruby cron api-design

我在页面上有一个汽车表和一个名为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

但是我怎么能在这里插入不同的网址呢?

1 个答案:

答案 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
  }
]