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

时间:2014-11-07 17:33:18

标签: ruby-on-rails apache http tcp disconnect

假设以下情况:

  1. 客户端正在向服务器发送HTTP POST
  2. 请求有效且 已由服务器处理。数据已插入数据库。
  3. Web应用程序正在响应客户端
  4. 客户端遇到超时 并且没有看到HTTP响应。
  5. 在这种情况下,我们遇到以下情况: - 客户不知道他的数据是否有效并且是否正确插入 - web服务器(rails 3.2应用程序)不会显示任何异常,无论它是否在apache代理之后

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

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

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

2 个答案:

答案 0 :(得分:5)

HTTP is a stateless protocol:根据定义,您无法在客户端知道http-verb POST成功与否。

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

然而,这些都不会对您的问题有所帮助。当我在过去遇到这些类型的问题时,几乎总是the server taking too long to process the web request 的结果。

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

  

“网络请求是一个可怕的地方,你想快速进出   你可以“ - 瑞克布兰森

您希望在100 - 500毫秒内进出Web请求。您满足这些数字,您将拥有一个能够很好地/与Web服务器一起运行的Web应用程序。

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

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

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

  1. 将部分数据插入dbms(甚至更快一些NoSQL解决方案)
  2. 将昂贵的处理交给后台任务。
  3. 返回用户/网络客户端。 (即使在后台任务仍在运行)
  4. 用(polling, streaming or websockets)听取最后的回答这一步不是一项微不足道的工作,但最终结果非常值得付出努力。
  5. 收紧这些网络请求,这将是您客户未收到回复的罕见日子。

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

    This answer涵盖了您可以使用的一些轮询/流媒体/ websockets技术。

答案 1 :(得分:-1)

您可以使用ajax和jQuery处理此问题,因为完整回调的文档说明如下:

<强>完整

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

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

Jquery ajax API

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

  1. http://socket.io/
  2. websocket-rails