2016-04-05 123 views
0

我有一台服务器,我的客户端向其发送带有一些值的HTTP GET请求。服务器的最后只是将这些值存储到数据库中。关于丢失HTTP请求

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

  1. 不会发送它
  2. 服务器从未收到它
  3. 服务器无法以书面形式向数据库

我最大的疑问,客户端是,原因是2 - 但我无法完全解释它。由于这是一个HTTP请求(意味着下面有TCP),应该保证GET请求的可靠传送,对吧?即使我向服务器发送了一个GET请求 - 它从来没有被服务器接收过吗?如果是,那么TCP在那里做什么?

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

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

+1

无论您使用哪种语言来发出http请求,您都必须检查该操作的结果,并将其打印或记录下来...... – MarcoS

+0

因此,例如,一些网络问题和数据包从未到达服务器(因此我不会得到服务器的任何响应) - 至少这种情况应该由TCP处理 - 即 - 重新发送数据包 - 直到我们得到响应为止? – TheBlueNotebook

+0

是的,最糟糕的是,你会收到一个超时错误... – MarcoS

回答

1

有几件事情你似乎缺少。首先,是的,如果TCP成功完成,你几乎可以保证你的消息(即TCP有效载荷)已经到达另一端:TCP确保它将处理丢失的包和包到达的顺序。然而,这并不是普遍的失败,因为仍然存在超越TCP能力的东西(通过切断以太网电缆想到物理断开)。关于上述协议的句法正确性也没有断言。除了提供完美副本之外,任何检查都不是TCP关心的问题。

因此,您的客户端发出的请求有可能是错误的,或者确实是正确的,但您的服务器没有正确解析。因为Tomcat是一款非常成熟的软件,所以前者更像后者一样引人注目。我认为,如果你能记录和分析你的一些生成的流量,这将大有帮助。 Wireshark

你没有真正提到你使用的数据库。但有一些牺牲兼容有利于提高写入速度。这些数据库的性质使得它永远不能确定实际写入磁盘的内容,或者仍然驻留在内存中的某个缓冲区中。如果你碰巧使用这样一个分贝,这是另一种调查。

编程,我建议你采取以下步骤与HTTP流量打交道时:

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

如果这些失败,你应该真的记录一些东西。

在相关说明中,您正在做的事情并不是要求GET方法,而是要求在更改应用程序状态时使用POST。考虑它是一件好事;)

+0

不幸的是,我目前正在使用其他人写的基础设施,所以我不确定是否可以自由地改变基本的东西将GET调用更改为POST调用。不过,我很好奇你为什么要将GET修改为一个很好的POST。纯粹是因为约定的原因(使用的东西是他们打算使用的)还是在功能上也有一些直接的优势? – TheBlueNotebook

+0

@TheBlueNotebook“POST”更接近HTTP规范,因为“GET”仅用于信息检索,而不是用于更改应用程序状态。在某些情况下,GET允许这样做,但这些不适用于您的用例恕我直言。并没有直接的优势。实际上,'POST'需要更多的努力来建立。面对目前遇到的问题,我认为这很好。 – DaSourcerer

0

不知道具体情况,可以将其分解为两部分。 HTTP请求和数据库写入。当GET请求被确认时,客户端将收到来自服务器的200 OK响应。我已经在Tomcat下编写代码来使用DAO连接到MySQL数据库。在发生故障的情况下,将抛出并记录异常。你正在使用哪种方法,你会想知道如何记录失败。