202 lines
8.3 KiB
JSON
202 lines
8.3 KiB
JSON
|
|
{
|
|||
|
|
"topic": "keepalive-scenarios",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"schema_version": "1.0.0",
|
|||
|
|
"generated": "2026-09-02T21:20:00+08:00",
|
|||
|
|
"questions": [
|
|||
|
|
{
|
|||
|
|
"id": "fb-001",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 2,
|
|||
|
|
"tags": [
|
|||
|
|
"高频请求",
|
|||
|
|
"Keep-Alive",
|
|||
|
|
"适用场景"
|
|||
|
|
],
|
|||
|
|
"question": "当客户端需要短时间内向同一服务器发起____请求时,Keep-Alive 连接复用的收益最大。",
|
|||
|
|
"answer": [
|
|||
|
|
"大量",
|
|||
|
|
"多个",
|
|||
|
|
"高频"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "any",
|
|||
|
|
"explanation": "Keep-Alive 的核心价值在于复用已建立的 TCP 连接,避免反复握手。当客户端需要在同一服务器上获取大量资源(如页面加载、API 批量调用)时,复用一条连接比每次都新建连接节省大量 RTT 和 CPU 开销。高频请求是 Keep-Alive 最典型的应用场景。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "fb-002",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 3,
|
|||
|
|
"tags": [
|
|||
|
|
"移动端",
|
|||
|
|
"高延迟",
|
|||
|
|
"握手开销"
|
|||
|
|
],
|
|||
|
|
"question": "在移动端____网络环境下,TCP 和 TLS 握手的 RTT 开销相对更大,使用 Keep-Alive 省去重复握手尤为重要。",
|
|||
|
|
"answer": [
|
|||
|
|
"高延迟",
|
|||
|
|
"弱网",
|
|||
|
|
"高时延"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "any",
|
|||
|
|
"explanation": "移动网络的典型 RTT 在 50-200ms 甚至更高,TCP 三次握手至少需要 1.5 个 RTT,TLS 1.2 还需额外 1-2 个 RTT。如果每次请求都重新握手,延迟代价非常显著。Keep-Alive 让后续请求在已建立的安全连接上直接发送,省去了宝贵的握手时间。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "fb-003",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 2,
|
|||
|
|
"tags": [
|
|||
|
|
"微服务",
|
|||
|
|
"内部通信",
|
|||
|
|
"Keep-Alive"
|
|||
|
|
],
|
|||
|
|
"question": "微服务架构中,服务间调用频率极高,Keep-Alive 是内部 RPC/HTTP 通信的____。",
|
|||
|
|
"answer": [
|
|||
|
|
"标配",
|
|||
|
|
"默认配置",
|
|||
|
|
"基础能力"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "any",
|
|||
|
|
"explanation": "微服务之间通常有大量高频的内部调用(如订单服务调用库存、用户、支付等),每次调用都新建连接的开销不可接受。gRPC、Dubbo 等微服务框架默认就使用 HTTP/2 或自定义协议的长连接,Keep-Alive 是服务间通信的基本配置。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "fb-004",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 2,
|
|||
|
|
"tags": [
|
|||
|
|
"低频请求",
|
|||
|
|
"一次性请求",
|
|||
|
|
"Keep-Alive"
|
|||
|
|
],
|
|||
|
|
"question": "对于只发一次请求的客户端(如一次性 Webhook 回调),Keep-Alive 的复用优势____,反而增加了服务器维护空闲连接的负担。",
|
|||
|
|
"answer": [
|
|||
|
|
"几乎为零",
|
|||
|
|
"不明显",
|
|||
|
|
"基本没有"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "any",
|
|||
|
|
"explanation": "Keep-Alive 的优势在于「多次复用」,只发一次请求的场景下建连开销只付出一次,不需要复用。开启 Keep-Alive 反而让服务器多维护一条空闲连接直到超时,浪费内存和文件描述符。对于此类场景,发送 Connection: close 让服务器立即关闭连接更合理。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "fb-005",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 4,
|
|||
|
|
"tags": [
|
|||
|
|
"安全隔离",
|
|||
|
|
"Keep-Alive",
|
|||
|
|
"不适用场景"
|
|||
|
|
],
|
|||
|
|
"question": "在需要严格____的安全隔离场景中(如网关对不可信客户端),不宜使用 Keep-Alive,应每次请求后立即关闭连接。",
|
|||
|
|
"answer": [
|
|||
|
|
"请求隔离",
|
|||
|
|
"连接隔离",
|
|||
|
|
"隔离"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "any",
|
|||
|
|
"explanation": "安全隔离场景要求每个请求使用独立的连接,以防止前一个请求的上下文(如认证状态、缓冲区残留数据)影响后续请求。例如反向代理对不可信客户端通常使用短连接,避免连接被恶意复用导致的安全风险。Keep-Alive 复用连接会模糊请求边界,不利于安全审计和隔离。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "fb-006",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 3,
|
|||
|
|
"tags": [
|
|||
|
|
"大文件传输",
|
|||
|
|
"连接策略"
|
|||
|
|
],
|
|||
|
|
"question": "大文件下载/上传时,应该使用____连接而非 Keep-Alive 连接,避免大体积传输长时间占用连接池资源。",
|
|||
|
|
"answer": [
|
|||
|
|
"独立",
|
|||
|
|
"单独",
|
|||
|
|
"专用"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "any",
|
|||
|
|
"explanation": "大文件传输会长时间占用连接,如果和其他小请求共享 Keep-Alive 连接池,会导致小请求排队等待。正确做法是为大文件传输创建独立的连接(或使用专门的连接池),与业务 API 的连接池隔离,确保小请求的低延迟不受影响。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "fb-007",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 3,
|
|||
|
|
"tags": [
|
|||
|
|
"Nginx",
|
|||
|
|
"keepalive_timeout",
|
|||
|
|
"配置"
|
|||
|
|
],
|
|||
|
|
"question": "Nginx 中 keepalive_timeout 指令控制____,keepalive_requests 指令控制____。",
|
|||
|
|
"answer": [
|
|||
|
|
"空闲连接超时时间,单个连接最大请求数",
|
|||
|
|
"空闲超时时间 单连接最大请求数"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "any",
|
|||
|
|
"explanation": "keepalive_timeout 默认 75s,表示空闲超过此时间后 Nginx 主动关闭连接;keepalive_requests 默认 1000,表示单个连接最多处理 1000 个请求后关闭。在高并发场景下应适当调大 keepalive_requests 以充分发挥连接复用优势,同时 keepalive_timeout 不宜过长以避免空闲连接堆积。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "fb-008",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 3,
|
|||
|
|
"tags": [
|
|||
|
|
"Tomcat",
|
|||
|
|
"keepAliveTimeout",
|
|||
|
|
"单位"
|
|||
|
|
],
|
|||
|
|
"question": "Tomcat 的 keepAliveTimeout 配置单位是____(注意与 Nginx 的秒不同),超时后服务器关闭空闲连接。",
|
|||
|
|
"answer": [
|
|||
|
|
"毫秒"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "all",
|
|||
|
|
"explanation": "Tomcat 的 keepAliveTimeout 单位为毫秒,默认值因版本而异(如 20000 即 20 秒)。这与 Nginx 的 keepalive_timeout 使用秒作为单位不同,配置时需要特别注意,避免因单位混淆导致超时设置偏差 1000 倍。Spring Boot 中通常通过 server.connection-timeout 等属性间接配置。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "fb-009",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 4,
|
|||
|
|
"tags": [
|
|||
|
|
"公共API",
|
|||
|
|
"连接数限制",
|
|||
|
|
"防护"
|
|||
|
|
],
|
|||
|
|
"question": "对外提供的公共 API 服务必须限制客户端的____数量,防止恶意或不当客户端耗尽服务器连接资源,影响其他正常用户。",
|
|||
|
|
"answer": [
|
|||
|
|
"并发连接",
|
|||
|
|
"连接",
|
|||
|
|
"Keep-Alive连接"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "any",
|
|||
|
|
"explanation": "公共 API 面向不可控的外部用户,如果不加限制,某个客户端可能建立大量 Keep-Alive 连接长期占用资源(连接耗尽攻击)。需要通过限流(rate limiting)、最大连接数限制、较短的 keepalive_timeout 等手段进行防护。Nginx 可通过 limit_conn 模块控制单 IP 的并发连接数。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "fb-010",
|
|||
|
|
"type": "fill_blank",
|
|||
|
|
"difficulty": 4,
|
|||
|
|
"tags": [
|
|||
|
|
"连接数瓶颈",
|
|||
|
|
"超时调优",
|
|||
|
|
"运维"
|
|||
|
|
],
|
|||
|
|
"question": "当出现连接数瓶颈时,缩短 Keep-Alive 超时时间可以更快释放空闲连接,但会导致____增加,需要在____和资源释放之间找到平衡。",
|
|||
|
|
"answer": [
|
|||
|
|
"重连开销,连接复用效率"
|
|||
|
|
],
|
|||
|
|
"answer_rule": "all",
|
|||
|
|
"explanation": "缩短 keepalive_timeout 能更快回收空闲连接,缓解连接数不足的问题,但代价是客户端后续请求需要重新建连(三次握手 + 可能的 TLS 握手),增加了延迟和 CPU 开销。最佳实践是:先调大最大连接数,再适当缩短超时时间,同时监控重连率和延迟 P99 来验证效果。",
|
|||
|
|
"source": null,
|
|||
|
|
"related": []
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|