【问题标题】:What will common web servers do when user canceled a request?当用户取消请求时,常见的 Web 服务器会做什么?
【发布时间】:2011-05-09 06:35:55
【问题描述】:

对于一个周期不短的请求,用户取消了连接(即他/她在请求完成之前关闭了浏览器),那么服务器端会发生什么?

不过,它应该取决于服务器。但是常见的方法是什么?

有些请求需要相当长的时间才能完成,例如,一个分布式 DBMS 事务,它会将数据提交到不同国家的多个不同服务器。 (我知道这在银行应用程序中很常见)

有些请求会向客户端发送大量数据,例如,当用户下载大型附件时。

是否应该在特定超时后取消请求线程?

我的网络应用程序是否应该照顾用户活动,并像这样自己取消交易:

service(request, response):
    tx_start();
    do {
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;

        tx_commit();
        return;
    } while (false);
    tx_rollback();
    throw new CanceledException();
}

我应该吗?

【问题讨论】:

  • 我带着同样的问题来到这里。如果用户在长请求期间关闭窗口,IIS 会做什么?我的期望是 IIS 会让线程完成但丢弃输出。否则我们的代码将需要处理中断的逻辑。

标签: http transactions cancellation


【解决方案1】:

问题:

  • 如果 do_some_work() 花费的时间比预期的要长并且客户端连接中断,则当不再需要事务时 do_some_work() 可能会继续。

解决方案:

  • 使用另一个线程分离服务器事务工作和客户端输入。
  • 让客户端中断 do_all_work(),然后抛出 CanceledException。
服务(请求,响应){ 尝试 { 客户端启动(请求); tx_start(); 做所有工作(); tx_commit(); } 捕捉(CanceledException ce){ tx_rollback(); 扔 ce; } 最后 { client_join(); } } 客户端启动(请求){ 客户=新客户(请求); client_thread = new Thread(client).start(); } 客户加入(){ client_thread.join(1000); // 等待 1s 等待客户端线程结束 }

【讨论】:

  • 这不能回答问题。当用户取消请求时,IIS 和 Tomcat 等网络服务器通常会做什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2013-12-21
  • 2013-07-28
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多