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 字节,但它有点慢。