0

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

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

该过程需要 5-30 秒。

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

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

  1. 创建小部件

  2. 启动小部件

  3. 监控小部件状态

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

我想要做的是有一个变量,比如@status,它包含上述过程的当前执行。“Creating Widget...”等。这会在任务完成时向用户显示。

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

目前,这没有写入数据库,由于负载限制,我想尽可能地让数据库远离这个。

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

有什么想法吗?

4

1 回答 1

0

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

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

更新可以建模为:

  • 日志项(如 syslogd 输出)。
  • 事件(如 syslog 的 win2k 版本)。
  • 更新的文本缓冲区输出。
于 2013-07-14T15:00:06.477 回答