假设以下情况:

  • 客户端正在将HTTP POST发送到服务器
  • 请求有效且
    已由服务器处理。数据已插入数据库。
  • Web应用程序正在响应客户端
  • 客户端遇到超时
    并且看不到HTTP响应。

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

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

    a)客户应该期望他的数据可能已经被处理了吗? (因此,请尝试例如执行GET请求以检查是否已提交数据)

    b)如果不是(a)-服务器应该检测到它吗?有可能在 rails 上这样做吗?在这种情况下,更改可以撤消。在这种情况下,我会期望从Rails应用中获得某种期望,但是没有...

    最佳答案

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

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

  • server side sessions
  • cookies
  • 形式内的
  • 隐藏变量

    但是,这些都不能真正解决您的问题。过去,当我遇到这些类型的问题时,它们都是,几乎总是the server taking too long to process the web request 的结果。

    在不眠之夜我低声说:



    您想在100-500毫秒内进入和退出网络请求。您达到了这些数字,您将拥有一个Web应用程序,该Web应用程序可以很好地运行/与Web服务器一起玩。

    为此,我建议您调查的时间,并弄清楚如何缩短这些请求。如果在执行dbms插入之前在服务器端进行了认真的处理,则应考虑将这些处理交给某种任务/排队系统。

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

    解决此问题的示例可能是:
  • 将您的部分数据插入dbms(甚至更快一些NoSQL解决方案)
  • 将昂贵的处理交给后台任务。
  • 返回到用户/Web客户端。 (甚至在后台任务仍在运行中)
  • 用(polling, streaming or websockets)监听最终响应。这一步不是一件容易的事,但最终结果值得我们付出努力。

  • 收紧那些Web请求,这将是罕见的一天,您的客户不会收到响应。

    在客户未收到数据的罕见日子:如何防止发布多个帖子...我对您的数据一无所知。但是,您可以执行一些与架构相关的操作来唯一标识您的帖子。即在服务器端确定数据是update还是create

    This answer涵盖了您可以使用的一些轮询/流传输/网络套接字技术。

    关于ruby-on-rails - 请求和响应处理之间的HTTP断开连接/超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26806850/

    10-09 18:12
    查看更多