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获得^{GOAWAY
问题
- 这是GCM API的预期行为吗李>
- 是什么引起的李>
- 如何调试它李>
# 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
。这可能是重试的好信号