有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java GCM(传统FCM)发送GOAWAY HTTP/2帧

我们的推送后端使用GCM API向Android设备发送通知
端点:https://fcm.googleapis.com/fcm/send
HTTP客户端:Java 11 Http Client(使用HTTP/2设置):

var httpClient = HttpClient.newBuilder()
    .version(HttpClient.Version.HTTP_2)
    // ...
    .build();

问题
有时我们从GCM获得^{}帧。但是java http client hides这些帧的错误代码和有效负载(只是抛出一些通用异常)。所以我们不知道是什么导致了GOAWAY

问题

  1. 这是GCM API的预期行为吗
  2. 是什么引起的
  3. 如何调试它

共 (1) 个答案

  1. # 1 楼答案

    很难说清楚为什么GCM会发送GOAWAY——只有GCM团队才能真正回答这个问题。然而,一些常见的原因是:

    • 您的客户端连接到的服务器正在停机以进行维护。在此之前,它会进入一种消耗模式,允许完成正在进行的请求,同时阻止新的请求。这是通过发送一个GOAWAY来实现的,它通知客户端不应在该连接上启动新请求
    • 服务器希望客户端迁移到其他连接以实现负载平衡

    这意味着服务器发送一个GOAWAY不是一个bug,它只是在云计算环境中应该有的东西

    HTTP/2规范提供了一些关于如何处理GOAWAY:https://www.rfc-editor.org/rfc/rfc7540#section-6.8的进一步信息

    关于处理它:理想情况下,您的HTTP/2客户端可能已经在内部完全做到了:

    • 如果它在没有请求处于活动状态时接收到GOAWAY帧,它应该为下一个请求创建一个新连接
    • 如果在发送请求时收到GOAWAY帧,并且该GOAWAY帧表示请求尚未处理,则可以创建新的客户端并重试请求。即使它是一个非幂等请求(如POST),这也可以工作,因为我们知道服务器尚未处理该请求

    如果JDK11客户机没有自动执行此操作,那么您在这里真正可以做的唯一事情就是在应用程序层上重试

    根据is there any way to handle HTTP/2 Goaway received IOException in HttpClient java?的说法,客户端可能抛出一个IOException,其消息包含GOAWAY received。这可能是重试的好信号