【问题标题】:About losing HTTP Requests关于丢失 HTTP 请求
【发布时间】:2016-04-05 07:06:11
【问题描述】:

我有一个服务器,我的客户端向它发送一个带有一些值的 HTTP GET 请求。服务器端只是将这些值存储到数据库中。

现在,我观察到有时我没有在数据库中观察到这些值。可能发生以下情况之一:

  1. 客户端从未发送过它
  2. 服务器从未收到它
  3. 服务器写入数据库失败

我最怀疑的是原因是 2 - 但我无法完全解释。由于这是一个 HTTP 请求(这意味着下面有 TCP),应该保证 GET 请求的可靠传递,对吧?是否有可能即使我向服务器发送了一个 GET 请求 - 服务器从未收到它?如果是,TCP 在那里做什么?

或者,我是否可以自信地断言,如果服务器已启动并运行,并且发送到服务器的所有内容都写入数据库,那么数据库中缺少 GET 请求的详细信息意味着客户端从未发送过它?

不确定详细信息是否有帮助 - 但我正在运行一个 tomcat 服务器,我只是通过 get 请求发送一个名称-值对。

【问题讨论】:

  • 无论您使用哪种语言发出 http 请求,您都必须检查该操作的结果,然后打印或记录...
  • 因此,例如,有一些网络问题并且数据包从未到达服务器(因此我不会从服务器得到任何响应)-至少这种情况应该由 TCP 处理-即 - 重新发送数据包 - 直到我们得到响应?
  • 是的,当然...最坏的情况是,您会收到超时错误...

标签: apache http tomcat get


【解决方案1】:

您似乎缺少一些东西。首先,是的,如果 TCP 成功完成,您几乎可以保证您的消息(即 TCP 有效负载)已到达另一端:TCP 确保它将处理丢失的包和包到达的顺序。然而,这并不是万能的,因为仍然有超出 TCP 能力的东西(想想通过切断以太网电缆进行的物理断开连接)。也没有关于“上述”协议的语法正确性的断言。除了提供位完美副本之外的任何检查都不是 TCP 关心的问题。

因此,您的客户端发出的请求有可能是错误的,或者它们确实是正确的,但您的服务器没有正确解析它们。前者让我感到震惊,因为 Tomcat 是一个非常成熟的软件。我认为,如果您通过例如记录和分析一些生成的流量,这将非常有帮助。 Wireshark.

您并没有真正提及您使用的数据库。但是有一些牺牲-compliance 以支持提高写入速度。这些数据库的性质使您永远无法真正确定某些内容是否已实际写入磁盘或仍驻留在内存中的某个缓冲区中。如果您碰巧使用这样的数据库,这是另一条调查线。

以编程方式,我建议您在处理 HTTP 流量时采取以下步骤:

  • 对套接字的写入是否完成且没有错误?
  • 能否从套接字读取响应?
  • 响应是否携带 2xx 范围内的代码(表示操作成功)?

如果其中任何一个失败,你应该记录一些东西。

请注意,当您更改应用程序状态时,您在那里所做的并不需要GET 方法,而是需要POST。认为它是一个很好的拥有;)

【讨论】:

  • 不幸的是,我目前正在使用其他人编写的基础架构,所以我不确定我是否有权更改基本的事情,例如将 GET 调用更改为 POST 调用。但是,我很好奇您为什么称将 GET 修改为 POST 是一件好事。纯粹是出于约定的原因(使用它们是为了使用它们)还是在功能上也有一些直接的优势?
  • @TheBlueNotebook POST 更接近 HTTP 规范,因为 GET 仅用于信息检索,而不是用于更改应用程序状态。在某些情况下允许GET 这样做,但这些不适用于您的用例恕我直言。而且没有直接的优势。事实上,POST 需要更多的努力来设置。面对您目前遇到的问题,我认为它很好。
【解决方案2】:

在不知道具体细节的情况下,您可以将其分为两部分。 HTTP 请求和数据库写入。当客户端的 GET 请求被确认后,客户端将收到来自服务器的 200 OK 响应。我在 Tomcat 下编写了代码以使用 DAO 连接到 MySQL 数据库。在失败的情况下,将引发并记录异常。无论您使用哪种方法,您都需要弄清楚失败是如何记录的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多