在服务器上优雅地终止基于请求的服务

时间:2012-09-12 09:57:04

标签: web-services webserver

在我们的Web应用程序中,对于每个http请求,后端都会发生很多计算。输出可以从10秒到1小时不等。在计算的平均时间内,网站上会显示“等待......”以供相应的用户使用。

但实际情况是,用户可能会在两者之间削减服务。那么在后端可以做什么,以便可以在两者之间停止计算以节省资源?这里可以应用哪些不同的策略?

如果更好(而不是直接杀死线程),那么优雅的终止策略应该会创造奇迹。

1 个答案:

答案 0 :(得分:1)

我不确定这是否适合您的情况,但以下是我过去处理此问题的方法。我们正在为网络应用生成pdf报告。大多数报告可以在5秒内生成,但有些报告可能需要长达一个小时。

当用户点击生成按钮时,我们会将其重定向到"生成..."对话框屏幕,有一个进度条和一个取消按钮。这也在一个单独的线程中启动服务器上的生成过程(我们有一个工作池)。浏览器然后定期通过ajax轮询服务器以检查进度(更新进度条或完成后重定向到显示页面)。

生成进程和ajax进程之间服务器上的同步是通过进程同步对象完成的。 sync-obj是一个非常简单的类实例,可以通过一些唯一的字符串随时从任何线程快速检索。

这两个进程都可以更新此共享sync-obj。当报告生成时,repgen线程将更新ajax线程将通知浏览器的sync-obj。如果用户单击了取消按钮,则ajax线程将设置"取消"在sync-ob和repgen线程中的标志会选择该标志并从生成循环中退出。

显然,整个过程的响应性很大程度上取决于repgen线程检查sync-obj的频率,而这通常归结为单个报告的编码方式。

最后,要回答你的问题,如果用户感到无聊并且回到"回来"并再次单击生成按钮我们不取消第一个报告并开始一秒,而是意识到它是相同的报告(和相同的sync-obj id),所以只需让报告继续。但是,如果这不适合您的场景,则启动生成过程可能会以与用户通过“取消”按钮相同的方式取消第一个。