处理挂载问题

This commit is contained in:
zlt 2026-07-29 15:28:57 +08:00
parent de9d885b08
commit ca88d8bfe0
4 changed files with 66 additions and 2 deletions

4
.gitignore vendored
View File

@ -12,3 +12,7 @@ logs/
# 本地临时: Cowork 会话搬运产物, 可整目录删除
_to_delete/
# 开发机的挂载覆盖 (由 docker-compose.dev.yml 复制而来)。
# 绝不入库: 它会让容器跑磁盘代码而非镜像代码, 生产机上一旦误带就再也说不清跑的是哪版。
docker-compose.override.yml

View File

@ -477,12 +477,27 @@ class WsRunner:
if r == qmt_repo.PUT_DUP_KEY:
logger.warning("成交 %s 重复推送 (seq=%s), 已占位不入账",
pl.get("trade_no"), seq)
had_pending = bool(self._pending_seq)
self._last_seq, self._pending_seq = wsc.next_watermark(
self._last_seq, self._pending_seq, seq)
self._unacked += 1
if self._pending_seq:
logger.warning("上行乱序: 水位卡在 %s, 暂存 %s 条 (待缺口补齐)",
self._last_seq, len(self._pending_seq))
# **每条都打会把正常的补发刷成告警海。** §6.1 补发期间必然是这个形状:
# hello_ack 自带的 seq 是对端"当前"序号, 跑在补发区间之上, 于是整段补发过程中
# 它一直躺在 pending 里 —— 水位每收一条推进 1 格、暂存恒为 1 条。
# 2026-07-29 实测回退 60 格, 刷了 60 行 WARNING, 而通道其实完全正常。
# 真正的异常是**暂存越堆越多**或**长时间不收敛**, 所以按次数限流, 并在补齐时
# 明确收尾 —— 有始有终才看得出它到底有没有卡住。
self._stat["ooo"] = self._stat.get("ooo", 0) + 1
n, k = self._stat["ooo"], len(self._pending_seq)
if n == 1 or n % 200 == 0:
logger.warning("水位未连续: 卡在 %s, 暂存 %s 条 (第 %s 次)。刚重连的话这是 "
"§6.1 补发的正常形态, 补完自会收敛; 若暂存条数持续增长, "
"才是真乱序", self._last_seq, k, n)
elif had_pending:
logger.info("水位缺口已补齐, 连续到 %s (期间未连续 %s 次)",
self._last_seq, self._stat.get("ooo", 0))
self._stat["ooo"] = 0
if self._unacked >= self._p("ack_batch", 20):
await self._flush_ack()

39
docker-compose.dev.yml Normal file
View File

@ -0,0 +1,39 @@
# 开发/联调机专用: 把源码目录挂进容器, 改完代码不用重新 build。
#
# 为什么不直接写进 docker-compose.yml: 挂载会让容器跑的是**磁盘上的代码**, 而不是镜像里的
# 代码。开发机上这正是想要的 (git pull 完 restart 一下就生效); 生产机上则相反 —— 部署的
# 东西必须等于构建出来的东西, 否则"这台跑的到底是哪版"永远说不清。
#
# 用法 (只在开发/联调机上做一次):
# cp docker-compose.dev.yml docker-compose.override.yml
#
# docker compose 会自动加载 docker-compose.override.yml, 之后:
# git pull && docker compose restart # 改 Python 代码, 秒生效
# ./scripts/deploy.sh # 改了 requirements.txt 才需要重建
#
# override 文件已在 .gitignore 里, 不会被带到生产机。
#
# 注意:
# * 依赖装在镜像的 site-packages 里, 不在 /app —— 挂载不会影响它。改 requirements.txt
# 仍然必须 build。
# * Dockerfile 设了 PYTHONDONTWRITEBYTECODE=1, 不会往你的源码目录里拉 __pycache__。
# * pms-ws 改动**仍需 restart** —— 挂载省掉的是 build, 不是进程重启, 它是常驻连接进程,
# 不会自己重载模块。
services:
pms-web:
volumes:
- .:/app
- ./logs:/app/logs
pms-beat:
volumes:
- .:/app
- ./logs:/app/logs
pms-worker:
volumes:
- .:/app
- ./logs:/app/logs
pms-ws:
volumes:
- .:/app
- ./logs:/app/logs

View File

@ -22,6 +22,12 @@ if [[ "${1:-}" != "--no-pull" ]]; then
git pull --ff-only
fi
if [[ -f docker-compose.override.yml ]]; then
echo "==> 检测到 docker-compose.override.yml (源码已挂载)"
echo " 改 Python 代码不用跑本脚本, 直接 'docker compose restart' 即可。"
echo " 仍然重建一次, 以防你改的是 requirements.txt。"
fi
echo "==> 重建镜像"
"${DC[@]}" build