【问题标题】:Socket timeout but servers logs 200套接字超时但服务器记录 200
【发布时间】:2021-05-06 12:19:41
【问题描述】:

我有一个 Java 客户端,它使用 org.apache.http.impl.client.CloseableHttpClient 调用位于 AWS ELB 后面的 PHP 系统。每天大约有一次或两次,其中一个请求会以java.net.SocketTimeoutException: Read timed out 失败。

服务器收到请求并记录 200,它永远不会超过 2 秒,小于连接请求超时或套接字超时。但是,ELB 和 Java 都没有注册响应,并且在 30 分钟(套接字超时)后,Java 失败并出现套接字超时。

有什么线索知道会发生什么吗?

【问题讨论】:

    标签: java php amazon-elb


    【解决方案1】:
    1. 基本上在SocketTimeout 上,您的客户端有一个传输超时设置,在此期间没有比特流过通道并以SocketTimeoutException 退出。

    2. 服务器不知道它并已成功完成请求,因此它记录200

    3. 如果涉及多个代理,则可能有人行为不端或失去连接并导致客户端出错

    4. 最好添加一些跟踪标头并检查您的不同代理和重定向。

    在没有任何痕迹和整合日志的情况下跟踪请求将几乎没有什么挑战。

    【讨论】:

    • 抱歉,跟踪标头到底是什么。可以在 apache 库中配置吗?
    • @GabrielFurstenheim,不幸的是,在整个网络世界中,追踪从来都不是一等公民。每个应用程序都应构建自定义跟踪解决方案。基本上这是在顶级互联网公司的博客中看到的,1. 确定一个通用的标头参数,2. 为每个请求生成一个唯一的 id 作为此标头的值。 3. 确保一个框架跨服务中涉及的所有组件(代理、应用程序服务器、客户端模块)管理此标头。 4. 将跨这些服务生成的信息绑定到一个通用聚合服务下。
    猜你喜欢
    • 2012-10-08
    • 2011-08-17
    • 1970-01-01
    • 2013-11-30
    • 2015-11-14
    • 2014-07-22
    • 2011-05-05
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多