繁体   English   中英

请求和响应处理之间的HTTP断开/超时

[英]HTTP disconnect/timeout between request and response handling

假设以下场景:

  1. 客户端正在向服务器发送HTTP POST
  2. 请求有效且已由服务器处理。 数据已插入数据库。
  3. Web应用程序正在响应客户端
  4. 客户端满足超时并且看不到HTTP响应。

在这种情况下,我们遇到以下情况: - 客户端不知道他的数据是否有效并且插入正确 - web服务器(rails 3.2应用程序)没有显示任何异常,无论它是否在apache代理后面

我找不到如何在HTTP文档中处理这种情况。 我的问题是:

a)客户应该期望他的数据可以处理吗? (然后尝试例如GET请求来检查数据是否已经提交)

b)如果不是(a) - 应该服务器检测到它吗? 是否有可能在铁轨中做到这一点? 在这种情况下,可以改变变化。 在这种情况下,我希望从铁路应用中得到一些预期,但没有......

HTTP是一种无状态协议 :根据定义,您无法在客户端知道http-verb POST是否成功。

Web应用程序使用一些技术来克服此HTTP“功能”。 他们包括。

但是 ,这些都不会对您的问题有所帮助。 当我在过去遇到这些类型的问题时,它们几乎总是服务器花费太长时间处理Web请求的结果

有一个非常好的引用,我在不眠之夜耳语:

“网络请求是一个可怕的地方,你想尽可能快地进出” - 里克布兰森

您希望在100 - 500毫秒内进入和退出Web请求。 您满足这些数字,您将拥有一个表现良好/与Web服务器良好协作的Web应用程序。

为此, 我建议你调查你的帖子花了多长时间,并弄清楚如何缩短这些请求 如果您在进行dbms插入之前在服务器端进行了一些严肃的处理,那么您应该考虑将它们交给某种任务/排队系统。

“严肃处理”的一个例子可能是某种图像上传,可能在上传后进行一些图像处理。 任务和排队解决方案的一个例子是: RabbitMQCelery

您的问题的示例解决方案可能是:

  1. 将一部分数据插入dbms(甚至更快一些NoSQL解决方案)
  2. 将昂贵的处理交给后台任务。
  3. 返回用户/ Web客户端。 (即使在后台任务仍在运行)
  4. 用( 轮询,流媒体或websockets )听取最终的回应这一步不是一项微不足道的工作,但最终的结果是非常值得的。

收紧这些网络请求,这将是您客户未收到回复的罕见日子。

在那个罕见的日子里,客户端没有收到数据 :你如何防止多个帖子......我对你的数据一无所知。 但是,您可以执行一些与架构相关的操作来唯一标识您的帖子。 即如果数据是updatecreate ,则在服务器端计算出来。

这个答案涵盖了一些您可以使用的轮询/流媒体/ websockets技术。

您可以使用ajax和jQuery来处理这个问题,因为完整回调的文档解释如下:

完成

类型:函数(jqXHR jqXHR,String textStatus)

请求完成时要调用的函数(执行成功和错误回调之后)。 该函数传递两个参数:jqXHR(在jQuery 1.4.x,XMLHTTPRequest)对象和一个字符串,用于对请求的状态进行分类(“成功”,“未修改”,“错误”, “超时” ,“中止”或“parsererror”)。

Jquery ajax API

至于你的第二个问题,是他们通过rails来处理这个问题,答案是否定的,因为超时是来自客户端而不是服务器端然而要恢复更改我建议使用以下之一来检测用户是否还在线或不

  1. http://socket.io/
  2. WebSocket的护栏

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM