轮询顺序API调用的状态

时间:2013-07-14 14:15:18

标签: ruby-on-rails-3 jquery

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

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

这个过程需要5-30秒。

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

因此,我们可以说第三方API采取的步骤是:

  1. 创建小部件

  2. 启动小部件

  3. 监控窗口小部件状态

  4. 完成后,将最终结果返回给用户。

  5. 我想要做的是有一个变量,比如@status,它包含上述过程的当前执行。 “创建小部件......”等等。当任务完成时,这将显示给用户。

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

    目前,这不会写入数据库,并且由于负载限制,我希望尽可能多地保留数据库。

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

    有什么想法?

1 个答案:

答案 0 :(得分:0)

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

  • 需要一个共享数据资源,默认情况下讨论内存缓存,虽然可以使用SHM等。我之前已经通过内部套接字实现了这个,但这适用于固定的工作人员。
  • 主要活动请求将立即发送到您的服务器。
    • 服务器创建一个memcache句柄。
    • 返回对客户端的引用(快速)。
  • 客户端事件循环在POST上启动(通过jQuery AJAX猜测)。
    • 每个X,服务器都会轮询当前请求状态(JSON?)。
    • 用户界面已更新。
    • 服务器完成第三方操作。
    • 下一次轮询会返回更多信息(结果)。
    • 服务器销毁内存缓存句柄。
  • 添加中止按钮

更新可以建模为:

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