Javascript 处理长api调用批处理的最佳实践
我正在设计一个用户界面来上传一个用户列表,包括电子邮件、姓名等。。。在这个过程结束时,每个用户都会被插入我的数据库并收到一封电子邮件 处理此任务的后端api是在RubyonRails中构建的 目前输入的大小没有限制,因此我想为UI用户提供一种方法,在整个上传过程中取消剩余的作业,而不取消已经发送的作业 我还想在GUI上提供正在处理、已经完成的作业的实时状态 此外,我想确保同时处理这些作业所产生的作业数量是有限的,这样服务器上的其他用户就不会受到影响 话虽如此。。。在我有限的后端/javascript知识的情况下,我想我应该做的是为每个用户生成单独的ajax调用,或者可能是一组多个用户,使用java限制在任何时候只能同时运行X个ajax调用,我希望这是可能的,当每个调用返回时,我将更新UI以反映作业的状态,然后为下一组作业生成另一个,直到整个过程完成。如果UI用户希望取消,则可以保留已完成作业的完整性 这是明智的还是有更好的方法Javascript 处理长api调用批处理的最佳实践,javascript,jquery,ruby,ajax,ruby-on-rails-4,Javascript,Jquery,Ruby,Ajax,Ruby On Rails 4,我正在设计一个用户界面来上传一个用户列表,包括电子邮件、姓名等。。。在这个过程结束时,每个用户都会被插入我的数据库并收到一封电子邮件 处理此任务的后端api是在RubyonRails中构建的 目前输入的大小没有限制,因此我想为UI用户提供一种方法,在整个上传过程中取消剩余的作业,而不取消已经发送的作业 我还想在GUI上提供正在处理、已经完成的作业的实时状态 此外,我想确保同时处理这些作业所产生的作业数量是有限的,这样服务器上的其他用户就不会受到影响 话虽如此。。。在我有限的后端/javascri
提前感谢我使用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)
瞧!就这样。让一个后台工作来处理这个问题是有道理的。像是重新开动脑筋,开玩笑还是推迟工作?用户可以上传整个列表,这不会花费太多时间,您可以在空闲时处理它们。