Ruby on rails 3 轮询连续API调用的状态

Ruby on rails 3 轮询连续API调用的状态,ruby-on-rails-3,jquery,Ruby On Rails 3,Jquery,我正在构建一个简单表单的应用程序。将查询放置在多个表单元素中,然后单击“提交” 这会向第三方API提交(相当)大量API调用,以在第三方应用程序中创建必要的对象,执行它们,然后将结果返回给我的应用程序 这个过程需要5-30秒 我想让它做的是在一个部分中呈现结果(想想SQLIDE,比如SSMS或TOAD或其他什么——顶部的输入,在下面返回结果)。我希望在流程中的每个步骤之后都能刷新此部分,并向用户显示任务的状态。目前,该应用程序只是坐着旋转,直到所有这些复杂且IO繁重的业务逻辑完成,这将导致糟糕的

我正在构建一个简单表单的应用程序。将查询放置在多个表单元素中,然后单击“提交”

这会向第三方API提交(相当)大量API调用,以在第三方应用程序中创建必要的对象,执行它们,然后将结果返回给我的应用程序

这个过程需要5-30秒

我想让它做的是在一个部分中呈现结果(想想SQLIDE,比如SSMS或TOAD或其他什么——顶部的输入,在下面返回结果)。我希望在流程中的每个步骤之后都能刷新此部分,并向用户显示任务的状态。目前,该应用程序只是坐着旋转,直到所有这些复杂且IO繁重的业务逻辑完成,这将导致糟糕的用户体验

因此,假设通过第三方API采取的步骤是:

  • 创建小部件

  • 启动小部件

  • 监视小部件状态

  • 完成后,将最终结果返回给用户

  • 我想做的是有一个变量,比如@status,它包含上述进程的当前执行。“创建小部件…”等。当任务完成时,它会向用户显示

    当其中一个任务完成时,我如何重新渲染部分?它应该轮询服务器吗?在上述步骤完成之前,如何在没有线程锁定的情况下轮询运行服务器端的进程

    目前,这并没有写入到数据库中,由于负载限制,我希望尽可能地将数据库排除在外

    现在,我知道了轮询一个操作的不同方法(通过jquery的AJAX),主要使用setinterval/timeout来调用控制器操作并重新渲染,但是如果在该操作中引用了我的API调用方法,它只需等待,直到所有操作都完成为止


    有什么想法吗

    作为草图解决方案/算法:

    • 需要一个共享数据资源,默认情况下谈论memcache,尽管可以使用SHM等。我以前已经通过内部套接字实现了这一点,但这是针对固定工作人口的
    • 主活动请求会像现在一样发送到服务器。
      • 服务器创建一个memcache句柄
      • 返回对客户端的引用(快速)
    • 客户端事件循环在POST上启动(通过jQueryAjax猜测)。
      • 每X一次,都会轮询服务器的当前请求状态(JSON?)
      • 用户界面已更新
      • 服务器完成第三方操作
      • 下一次民意测验将返回更多信息(结果)
      • 服务器破坏memcache句柄
    • 添加一个中止按钮
    更新可以建模为:

    • 日志项(如syslogd输出)
    • 事件(如syslog的win2k版本)
    • 正在更新的文本缓冲区输出