PATCH API 不适用于 Google Cloud 运行 实例
PATCH API don't work on Google Cloud Run instance
我有云 运行 服务托管实现 gRpc 的 GO OSB 应用程序,但通过使用云 sql 的 grpc 网关公开 http REST api(mysql ) 作为数据库。除了 PATCH 之外,所有 CRUD API 都响应良好。
它抛出以下错误,HTTP 响应代码为 503:
{
"textPayload": "The request failed because either the HTTP response was malformed or connection to the instance had an error.",
"insertId": "6141e984000c63529e7b7afd",
"httpRequest": {
"requestMethod": "PATCH",
"requestUrl": "https://********-********-mr336-qv7hk7cx3a-uc.a.run.app/v2/service_instances/237e80fd-b22e-4df0-b9ed-23c91a4d7f51",
"requestSize": "1102",
"status": 503,
"responseSize": "976",
"userAgent": "PostmanRuntime/7.28.4",
"remoteIp": "********",
"serverIp": "********",
"latency": "0.410343680s",
"protocol": "HTTP/1.1"
},
"resource": {
"type": "cloud_run_revision",
"labels": {
"location": "us-central1",
"revision_name": "********-********-mr336-00001-hop",
"project_id": "********-********-l-app-us-01",
"configuration_name": "********-********-mr336",
"service_name": "********-********-mr336"
}
},
"timestamp": "2021-09-15T12:39:32.811858Z",
"severity": "ERROR",
"labels": {
"instanceId": "00bf4bf02dff6d5f53cff1f1828cafbca265606a996eddff5cb44e3fff674efb77ca51eca7087fb8b8e7acba227b2a3e3e913bdfcc0a487640a2e028"
},
"logName": "projects/********/logs/run.googleapis.com%2Frequests",
"trace": "projects/********/traces/e29e5add9452d171e9eebd26817bb667",
"receiveTimestamp": "2021-09-15T12:39:32.817171397Z"
}
注意事项:
在每次补丁请求之后,我都可以看到实例启动日志,即在上述日志之后,每次我都可以看到容器入口点(服务器)启动日志(如冷启动)。
服务器启动完成后,它会再次在日志中抛出上述相同的错误。
需要注意的重要一点是,我也看不到来自我的应用程序的任何日志,这表明 PATCH api 请求未到达容器实例 运行 宁在云端 运行 服务。
冷启动后我的活动实例也达到理想状态,然后在 1 分钟内缩减为 0。在最后一个请求命中后,但它似乎不会为其他 API 造成问题。这就是它应该如何工作,但找不到任何关于 PATCH 问题的线索。
现在已修复!
面对由于在同一端口上处理多个协议而其中一个协议匹配器导致 PATCH API 的问题 从服务器返回空回复 .因此,对匹配器进行了更改并且它起作用了。
RCA :
Cmux HTTP1Fast Matcher 只匹配 HTTP 请求中的方法。
这个匹配器非常乐观:如果它 returns 为真,并不意味着该请求是一个有效的 HTTP 响应。
一个正确但较慢的 HTTP1 匹配器,使用“HTTP1”代替扫描整个请求,最多 4096 字节,但它有点慢。
我有云 运行 服务托管实现 gRpc 的 GO OSB 应用程序,但通过使用云 sql 的 grpc 网关公开 http REST api(mysql ) 作为数据库。除了 PATCH 之外,所有 CRUD API 都响应良好。
它抛出以下错误,HTTP 响应代码为 503:
{
"textPayload": "The request failed because either the HTTP response was malformed or connection to the instance had an error.",
"insertId": "6141e984000c63529e7b7afd",
"httpRequest": {
"requestMethod": "PATCH",
"requestUrl": "https://********-********-mr336-qv7hk7cx3a-uc.a.run.app/v2/service_instances/237e80fd-b22e-4df0-b9ed-23c91a4d7f51",
"requestSize": "1102",
"status": 503,
"responseSize": "976",
"userAgent": "PostmanRuntime/7.28.4",
"remoteIp": "********",
"serverIp": "********",
"latency": "0.410343680s",
"protocol": "HTTP/1.1"
},
"resource": {
"type": "cloud_run_revision",
"labels": {
"location": "us-central1",
"revision_name": "********-********-mr336-00001-hop",
"project_id": "********-********-l-app-us-01",
"configuration_name": "********-********-mr336",
"service_name": "********-********-mr336"
}
},
"timestamp": "2021-09-15T12:39:32.811858Z",
"severity": "ERROR",
"labels": {
"instanceId": "00bf4bf02dff6d5f53cff1f1828cafbca265606a996eddff5cb44e3fff674efb77ca51eca7087fb8b8e7acba227b2a3e3e913bdfcc0a487640a2e028"
},
"logName": "projects/********/logs/run.googleapis.com%2Frequests",
"trace": "projects/********/traces/e29e5add9452d171e9eebd26817bb667",
"receiveTimestamp": "2021-09-15T12:39:32.817171397Z"
}
注意事项:
在每次补丁请求之后,我都可以看到实例启动日志,即在上述日志之后,每次我都可以看到容器入口点(服务器)启动日志(如冷启动)。
服务器启动完成后,它会再次在日志中抛出上述相同的错误。
需要注意的重要一点是,我也看不到来自我的应用程序的任何日志,这表明 PATCH api 请求未到达容器实例 运行 宁在云端 运行 服务。
冷启动后我的活动实例也达到理想状态,然后在 1 分钟内缩减为 0。在最后一个请求命中后,但它似乎不会为其他 API 造成问题。这就是它应该如何工作,但找不到任何关于 PATCH 问题的线索。
现在已修复!
面对由于在同一端口上处理多个协议而其中一个协议匹配器导致 PATCH API 的问题 从服务器返回空回复 .因此,对匹配器进行了更改并且它起作用了。
RCA : Cmux HTTP1Fast Matcher 只匹配 HTTP 请求中的方法。 这个匹配器非常乐观:如果它 returns 为真,并不意味着该请求是一个有效的 HTTP 响应。 一个正确但较慢的 HTTP1 匹配器,使用“HTTP1”代替扫描整个请求,最多 4096 字节,但它有点慢。