fix: harden concurrency limits and high-RPM runtime paths

Bound request, stream, queue, and shutdown resource lifetimes. Reduce scheduler and Redis hot-path work and isolate database maintenance. Include regression coverage, load probes, and concurrency audit results.
This commit is contained in:
elky
2026-09-10 08:14:58 +08:00
parent 361952ada9
commit ecc16673eb
149 changed files with 27963 additions and 1926 deletions
+50 -3
View File
@@ -83,11 +83,58 @@ ADMIN_USERNAME=admin123456
# PostgreSQL 连接池配置(默认每核 4 条、总池至少 32 条且最多 100 条;多实例部署应显式分配每实例预算)
# AETHER_GATEWAY_DATA_POSTGRES_MIN_CONNECTIONS=12
# AETHER_GATEWAY_DATA_POSTGRES_MAX_CONNECTIONS=80
# 普通 PostgreSQL 连接默认语句超时 30 秒、锁等待超时 3 秒;0 显式关闭。
# 这是单条 SQL 的期限,不是整个事务总期限;迁移和历史 backfill 使用独立连接放宽。
# AETHER_GATEWAY_DATA_POSTGRES_STATEMENT_TIMEOUT_MS=30000
# AETHER_GATEWAY_DATA_POSTGRES_LOCK_TIMEOUT_MS=3000
# AETHER_GATEWAY_MAX_IN_FLIGHT_REQUESTS=2048
# 所有监听分片共用的入站 TCP 连接上限,包含握手、空闲 keep-alive 和升级后的 WebSocket。
# 未设置或 0 时按请求上限 + WebSocket 上限推导,最大 65536;显式配置也受 FD 余量限制。
# 已知 FD soft limit 时最多 max(1, (FD - 256) / 2),不是整个进程的 FD/内存保证。
# 满额的新连接在 HTTP 解析前关闭,不排队创建任务,也不会返回 HTTP 429/503。
# AETHER_GATEWAY_MAX_HTTP_CONNECTIONS=4096
# 停机先等待 HTTP 请求,再排空本地用量写入;以下期限单位为毫秒。
# 进程管理器的强杀期限应覆盖两阶段之和,再预留至少 10 秒收尾。
# AETHER_GATEWAY_HTTP_SHUTDOWN_TIMEOUT_MS=30000
# AETHER_GATEWAY_USAGE_SHUTDOWN_TIMEOUT_MS=30000
# 每客户端、每 origin 的上游空闲连接缓存;不限制活动请求或流持续时间。
# AETHER_GATEWAY_UPSTREAM_POOL_MAX_IDLE_PER_HOST=32
# AETHER_GATEWAY_UPSTREAM_POOL_IDLE_TIMEOUT_MS=15000
# AETHER_GATEWAY_REQUEST_BODY_BUFFER_BUDGET_MB=256
# 请求体完整读取总超时默认关闭;确需限制时配置 1000-600000 毫秒的非零值
# AETHER_GATEWAY_REQUEST_BODY_READ_TIMEOUT_MS=0
# 单请求解压后 Payload 上限(MiB),默认 256;显式设为 0 才表示不限制。
# 请求体按实际缓冲增长申请额度,解压同时计入输入和输出;额度不足返回 503
# 请求体完整读取总超时默认 120000 毫秒;非零值限制在 1000-600000,显式 0 关闭。
# AETHER_GATEWAY_REQUEST_BODY_READ_TIMEOUT_MS=120000
# 上游流首包后空闲超时默认 300000 毫秒;执行配置 read_ms 优先,显式 0 关闭。
# AETHER_GATEWAY_UPSTREAM_STREAM_IDLE_TIMEOUT_MS=300000
# 流式响应诊断捕获共享预算默认 128 MiB,包含 provider/client 分配;不足时截断审计副本。
# 显式 0 关闭此类捕获;不限制协议解析、终态编码和 usage 队列的总内存。
# AETHER_GATEWAY_STREAM_CAPTURE_MEMORY_BUDGET_BYTES=134217728
# usage 诊断正文共享预算,按 JSON 堆内存估算,默认 128 MiB。
# 覆盖终态队列 seed、Redis 解码事件、数据库写入 DTO 及正文副本;额度随正文释放。
# 不足或显式 0 时先保留计费事实再舍弃正文;已有清空/禁用状态保留,其余标为截断。
# 不包含原始 Redis 批次、解码临时分配、序列化和压缩结果、协议观察缓冲或进程总内存。
# AETHER_USAGE_EVENT_CAPTURE_MEMORY_BUDGET_BYTES=134217728
# 新 usage 队列消息的完整 JSON payload 上限,默认 1 MiB;显式 0 非法。
# 超限先保留计费事实并舍弃诊断字段;仍超限或无法保留计费语义则拒绝入队,终态尝试受限落库,失败即明确失败。
# 不限制存量 Redis 消息、整个读取批次、DLQ 或进程总内存。
# usage_runtime_queue_payload_* 降级/拒绝计数包含入队和重试预校验的编码尝试,不代表唯一事件数。
# AETHER_GATEWAY_USAGE_QUEUE_PAYLOAD_MAX_BYTES=1048576
# usage worker 读取/重领共用的逻辑 payload 预留:全进程默认 128 MiB,单批目标 8 MiB。
# 按当前消息上限推导 COUNT,默认最多 8 条;预留覆盖整批处理和确认,额度不足等待。
# 当前消息上限不能超过总预留额度;单批目标不足一条时仍读一条。0 或非法值回退默认。
# 历史/其他生产者的大消息继续处理并计数,不是 RESP、实际堆内存或 DLQ 的硬上限。
# AETHER_USAGE_QUEUE_READ_PAYLOAD_BUDGET_BYTES=134217728
# AETHER_USAGE_QUEUE_READ_BATCH_PAYLOAD_BYTES=8388608
# DLQ 原文和最坏 JSON 编码独立预留默认 64 MiB,后台编码及写入最多同时 4 个任务。
# 入场前一次预留,额度占满或单条超预算立即失败并保留 pending 原消息,后续重领。
# 编码失败不阻塞同批其余正常消息;批次仍报告失败,只有成功项会被确认。
# JSON 按字符串最多 6 倍转义保守估算;不截原账务字段,不包含 Redis 命令/连接副本或 RSS。
# 0/非法值回退默认;bytes 最大约 4 GiB,jobs 最大 128。超大存量可能需调高额度后恢复。
# AETHER_USAGE_DLQ_ENCODING_BUDGET_BYTES=67108864
# AETHER_USAGE_DLQ_ENCODING_MAX_JOBS=4
# 内置 Redis 死信转移要求 Redis 7+ 及 EVAL/TYPE/XPENDING/XADD/XACK/XDEL 权限。
# stream 与 DLQ 不能同名;Cluster 还要求两键同 slot,现有默认键未自动迁移。
# 单请求解压后 Payload 上限(MiB),默认 256;显式 0 仍受 256 MiB 硬上限保护。
# AETHER_MAX_REQUEST_BODY_MB=256
# AETHER_GATEWAY_SECURITY_CACHE_TTL_MS=1000
# AETHER_MAX_REDACTED_SYNC_RESPONSE_BODY_MB=64