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

dfe*_*ens 12 apache tcp ruby-on-rails http disconnect

假设以下场景:

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

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

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

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

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

Jef*_*eld 5

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

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

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

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

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

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

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

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

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

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

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

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

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