本卡屬 FR-181(母卡 FR-181 母案(同清單上一張)),卡 P-0,批 1。只改 主 repo。依賴:無。

這張卡做什麼(白話)

本案要讓 Agent 常駐一條「長輪詢」請求掛在主系統上(最多吊 30 秒,有事立刻回)。問題是出貨的主系統走 gunicorn 預設 sync worker,一個 worker 同時只能服務一個請求,worker 數是 CPU 核數封頂 4——2 核客戶機就 2 個 worker,1 台 Agent 吊著就佔掉 1 個,使用者按「測試連線」再佔 1 個,那 2 秒主系統對所有人都不回應;第 2 台 Agent 上線就整個吊死。這張卡不做產品功能,只做一件事:用數字證明問題存在、證明解法(改 gthread 多執行緒+配額)有效。結論直接決定整案走「長輪詢」還是退回「每 10~15 秒問一次」,所以要在其他卡之前做完、數字要可信。本機 DEV 看不出這個問題(DEBUG=true 的 dev server 本來就多執行緒),一定要用 USE_GUNICORN=true 起。

reuse/extend/new

new:scripts/dev/longpoll_bench.py(純驗證腳本,不進產品)——開 N 條去打一支吊 30 秒的假端點、同時用 20 並發打 GET /api/1.0/health 量 p50/p95;假端點掛在 core/plugins/_bench_longpoll.py 只在 DEBUG 或 BENCH_LONGPOLL=1 時掛。extend:main.py gunicorn options 加 worker_class/threads 兩個 env(GUNICORN_WORKER_CLASS 預設 sync 不變、GUNICORN_THREADS 預設 16)——本卡只加設定入口不改預設,E-1 才翻預設。禁:不動 installer、不動 compose

在哪裡

repo:~/Projects/Billows/Audit-Manager/compliance-manager-be
改既有:main.py 280(gunicorn options 加 worker_class/threads)
新開:scripts/dev/longpoll_bench.py
新開:core/plugins/_bench_longpoll.py
新開:docs/features/FR-181-2611-agent-outbound-only-channel/evidence/bench-longpoll.md

怎麼做

驗收(首腦照這個驗)

DEV 以 USE_GUNICORN=true GUNICORN_WORKERS=2 DEBUG=false 起:①sync:開 2 條吊著 → health p95 > 25 秒(重現卡死,寫進證據);②gthread 16 執行緒:開 20 條吊著 → health p95 與 0 條時差 < 50 ms;③gthread 下 pytest test/ 紅的只能是基準就紅的(先跑 sync 留基準);④DEBUG=true dev server 不受影響。證據檔寫三組數字+結論「走長輪詢/退定時輪詢」,首腦據此定 D2

必讀