{
  "id": "communication/http2-goaway-frame-received",
  "signature": "HTTP/2 GOAWAY frame received: last stream ID 0, error code NO_ERROR",
  "signature_zh": "HTTP/2 GOAWAY 帧收到：最后流 ID 0，错误码 NO_ERROR",
  "regex": "GOAWAY|last stream ID 0.*NO_ERROR",
  "domain": "communication",
  "category": "protocol_error",
  "subcategory": null,
  "root_cause": "The HTTP/2 server sent a GOAWAY frame to gracefully shut down the connection, often due to server maintenance, load balancing, or reaching max concurrent streams.",
  "root_cause_type": "generic",
  "root_cause_zh": "HTTP/2 服务器发送 GOAWAY 帧以优雅关闭连接，通常由于服务器维护、负载均衡或达到最大并发流限制。",
  "versions": [
    {
      "version": "nginx 1.25.0",
      "introduced": null,
      "deprecated": null,
      "removed": null,
      "behavior_change": null,
      "status": "active"
    },
    {
      "version": "Node.js 20.11.0",
      "introduced": null,
      "deprecated": null,
      "removed": null,
      "behavior_change": null,
      "status": "active"
    },
    {
      "version": "Envoy 1.28.0",
      "introduced": null,
      "deprecated": null,
      "removed": null,
      "behavior_change": null,
      "status": "active"
    }
  ],
  "os_specific": {},
  "dead_ends": [
    {
      "action": "Disable HTTP/2 entirely and fall back to HTTP/1.1",
      "why_fails": "Disabling HTTP/2 loses performance benefits and doesn't fix the server-side issue; GOAWAY may still occur with HTTP/1.1 connection resets.",
      "fail_rate": 0.6,
      "condition": "",
      "sources": []
    },
    {
      "action": "Increase the client's max concurrent streams limit",
      "why_fails": "The GOAWAY is server-initiated; client-side stream limits don't prevent the server from sending it.",
      "fail_rate": 0.85,
      "condition": "",
      "sources": []
    },
    {
      "action": "Ignore GOAWAY and continue sending requests on the same connection",
      "why_fails": "GOAWAY signals imminent connection closure; continuing to send will result in stream errors or data loss.",
      "fail_rate": 0.9,
      "condition": "",
      "sources": []
    }
  ],
  "workarounds": [
    {
      "action": "Implement client-side reconnection logic that opens a new HTTP/2 connection upon receiving GOAWAY: In Node.js with http2 module, listen for 'goaway' event and create a new session: `session.on('goaway', () => { session.close(); createNewSession(); })`.",
      "success_rate": 0.85,
      "how": "Implement client-side reconnection logic that opens a new HTTP/2 connection upon receiving GOAWAY: In Node.js with http2 module, listen for 'goaway' event and create a new session: `session.on('goaway', () => { session.close(); createNewSession(); })`.",
      "condition": "",
      "sources": []
    },
    {
      "action": "Set a grace period in the server's GOAWAY handling to allow in-flight requests to complete: In nginx, configure `http2_max_concurrent_streams 256;` and `keepalive_timeout 60s;` to reduce GOAWAY frequency.",
      "success_rate": 0.8,
      "how": "Set a grace period in the server's GOAWAY handling to allow in-flight requests to complete: In nginx, configure `http2_max_concurrent_streams 256;` and `keepalive_timeout 60s;` to reduce GOAWAY frequency.",
      "condition": "",
      "sources": []
    },
    {
      "action": "Use connection pooling with multiple HTTP/2 sessions to distribute load: In gRPC, configure `grpc.lb_policy_name` as 'round_robin' with multiple subchannels.",
      "success_rate": 0.75,
      "how": "Use connection pooling with multiple HTTP/2 sessions to distribute load: In gRPC, configure `grpc.lb_policy_name` as 'round_robin' with multiple subchannels.",
      "condition": "",
      "sources": []
    }
  ],
  "workarounds_zh": [
    "Implement client-side reconnection logic that opens a new HTTP/2 connection upon receiving GOAWAY: In Node.js with http2 module, listen for 'goaway' event and create a new session: `session.on('goaway', () => { session.close(); createNewSession(); })`.",
    "Set a grace period in the server's GOAWAY handling to allow in-flight requests to complete: In nginx, configure `http2_max_concurrent_streams 256;` and `keepalive_timeout 60s;` to reduce GOAWAY frequency.",
    "Use connection pooling with multiple HTTP/2 sessions to distribute load: In gRPC, configure `grpc.lb_policy_name` as 'round_robin' with multiple subchannels."
  ],
  "transition_graph": {
    "leads_to": [],
    "preceded_by": [],
    "frequently_confused_with": []
  },
  "official_doc_url": "https://httpwg.org/specs/rfc7540.html#GOAWAY",
  "official_doc_section": null,
  "error_code": "NO_ERROR",
  "verification_tier": "ai_generated",
  "confidence": 0.84,
  "fix_success_rate": 0.78,
  "resolvable": "partial",
  "first_seen": "2024-05-12",
  "last_confirmed": "2024-06-01",
  "last_updated": "2024-06-01",
  "evidence_count": 1,
  "tags": [],
  "locale": "en",
  "aliases": []
}