Javascript 处理长api调用批处理的最佳实践

Javascript 处理长api调用批处理的最佳实践,javascript,jquery,ruby,ajax,ruby-on-rails-4,Javascript,Jquery,Ruby,Ajax,Ruby On Rails 4,我正在设计一个用户界面来上传一个用户列表,包括电子邮件、姓名等。。。在这个过程结束时,每个用户都会被插入我的数据库并收到一封电子邮件 处理此任务的后端api是在RubyonRails中构建的 目前输入的大小没有限制,因此我想为UI用户提供一种方法,在整个上传过程中取消剩余的作业,而不取消已经发送的作业 我还想在GUI上提供正在处理、已经完成的作业的实时状态 此外,我想确保同时处理这些作业所产生的作业数量是有限的,这样服务器上的其他用户就不会受到影响 话虽如此。。。在我有限的后端/javascri

我正在设计一个用户界面来上传一个用户列表,包括电子邮件、姓名等。。。在这个过程结束时,每个用户都会被插入我的数据库并收到一封电子邮件

处理此任务的后端api是在RubyonRails中构建的

目前输入的大小没有限制,因此我想为UI用户提供一种方法,在整个上传过程中取消剩余的作业,而不取消已经发送的作业

我还想在GUI上提供正在处理、已经完成的作业的实时状态

此外,我想确保同时处理这些作业所产生的作业数量是有限的,这样服务器上的其他用户就不会受到影响

话虽如此。。。在我有限的后端/javascript知识的情况下,我想我应该做的是为每个用户生成单独的ajax调用,或者可能是一组多个用户,使用java限制在任何时候只能同时运行X个ajax调用,我希望这是可能的,当每个调用返回时,我将更新UI以反映作业的状态,然后为下一组作业生成另一个,直到整个过程完成。如果UI用户希望取消,则可以保留已完成作业的完整性

这是明智的还是有更好的方法


提前感谢

我使用sidekiq完成这样的任务。它正是你想要的

您在服务器上设置了许多工作线程。然后,当来自UI的帖子或其他请求进入时,您将每个帖子或请求作为作业在sidekiq中排队,并立即将状态返回到浏览器,这样他们就不必等待等待某件事情是否会成功、永久挂起或被web服务器超时

稍后,将异步处理作业。它可以更新数据库中的状态以进行报告

以下是在sidekiq下运行的worker示例:

class PageFetcher
  include Sidekiq::Worker

  def perform page_id
    page = Page.find(page_id)
    path = Page.absolute_path

    # Do some big, long, error-prone thing with external depencies:
    File.binwrite(path, open(page.source_url).read)
    saved_size = File.size(path)

    if page.expected_file_size != saved_size.to_s
      bad_path = path + '.bad'
      File.rename(path, bad_path)

      # Raise an error, and sidekiq will automatically wait a while and try again later:
      raise IOError, "Could not cache #{page.source_url} to #{path}. " +
        "File size is #{saved_size}, expected #{page.file_size}. "
    end


    # update some status field, so this success can be reported:
    page.make_status_cached!

    # do something else that depends on this success:
    page.notify_page_indexer
  end
end
当您收到一个新请求时,创建一个新页面,然后按如下方式排队处理:

Page.perform_async(self.id)

瞧!就这样。

让一个后台工作来处理这个问题是有道理的。像是重新开动脑筋,开玩笑还是推迟工作?用户可以上传整个列表,这不会花费太多时间,您可以在空闲时处理它们。