feat(pymsg): RpcClient 新增 retry_on_refused 阻塞等待模式,解决微服务启动顺序依赖
pymsg 客户端: - MsgClient.call() 新增 retry_on_refused/retry_interval 参数 - retry_on_refused=True 时,ConnectionRefusedError 不抛出,按 retry_interval(默认1s)阻塞重试 - 重试期间每5秒向 stderr 打印等待提示,避免日志刷屏 - 仅对 ConnectionRefusedError 重试;TimeoutError/ConnectionError/RpcError 仍立即抛出 - 默认 retry_on_refused=False,完全向后兼容 - RpcClient 构造函数新增同名关键字参数,call() 支持单次调用覆盖 - 新增 time 模块导入 - 更新 README 文档(新增"启动等待模式"章节和参数表) 各服务(db/dnfs/static): - _fetch_from_confs() 改用 retry_on_refused=True,移除手动 ConnectionRefusedError 捕获和 sys.exit - 保留 RpcError(如配置文件不存在)的友好错误处理和 sys.exit(1) - 启动时不再因 confs 未就绪而退出:pymsg 自动阻塞等待 confs 启动后自动连接成功 - 启动顺序从"刚性要求 confs 先启动"变为"不严格要求启动顺序" - log_client 保持默认 retry_on_refused=False,后台线程不阻塞(fail-safe 丢弃日志) - 更新各服务 README 和 confs README 的启动顺序描述 测试验证: - 基本 call() 正常工作 - retry_on_refused=False 连接拒绝立即抛 ConnectionRefusedError - retry_on_refused=True 阻塞等待(延迟1.5s启动服务后成功连接,重试日志正常输出)
This commit is contained in:
1 parent
0ae107f953
commit
101aed48be
10 files changed
+141
-84
No files matched your search
+5
-5
@@ -125,12 +125,12 @@ confs 自身的连接地址不通过 confs 获取(避免循环依赖),通
|
||||
| `CONFS_HOST` | confs 服务主机名(引导配置,Docker 环境使用服务名) |
|
||||
| `CONFS_PORT` | confs 服务端口(引导配置) |
|
||||
|
||||
### 启动顺序要求
|
||||
### 启动顺序
|
||||
|
||||
**confs 必须先于 static 启动**。若 confs 不可用:
|
||||
- static 打印致命错误到 stderr(包含 confs 地址和具体错误原因),以 exit code 1 终止
|
||||
- 不会静默使用默认值或回退本地配置文件启动
|
||||
- 配置完整性校验:若 static.ini 中缺少必需的 section/key(server.host/port、directory.root、cors.allowed_origins)且无对应环境变量覆盖,同样报错退出
|
||||
static 通过 pymsg `retry_on_refused=True` 自动阻塞等待 confs 就绪,**拉取配置阶段不严格要求启动顺序**:
|
||||
- confs 先启动 → static 立即拉取配置
|
||||
- static 先启动 → pymsg 自动重试(每秒一次,每 5 秒打印等待提示),confs 启动后自动连接成功
|
||||
- 配置完整性校验:若 static.ini 中缺少必需的 section/key(server.host/port、directory.root、cors.allowed_origins)且无对应环境变量覆盖,仍然报错退出
|
||||
- ssl 段为可选项,未配置时默认 `enabled=false`、cert/key 使用默认文件名
|
||||
|
||||
### 历史遗留:本地 config.ini 已删除
|
||||
|
||||
+9
-13
@@ -72,26 +72,22 @@ def _merge_ini(text):
|
||||
|
||||
|
||||
def _fetch_from_confs():
|
||||
"""从 confs 统一配置服务拉取 static.ini 全文,失败直接终止进程。"""
|
||||
"""从 confs 统一配置服务拉取 static.ini 全文。
|
||||
|
||||
使用 retry_on_refused=True:confs 未就绪时 pymsg 自动阻塞重试(每秒一次,
|
||||
每 5 秒打印一次等待提示),直到 confs 启动后自动连接成功。
|
||||
RpcError(如配置文件不存在)仍直接报错退出——这是配置错误而非启动时序问题。
|
||||
"""
|
||||
from pymsg import RpcClient, RpcError # noqa: E402
|
||||
client = RpcClient(_confs_host, _confs_port, 'static', timeout=5,
|
||||
retry_on_refused=True)
|
||||
try:
|
||||
client = RpcClient(_confs_host, _confs_port, 'static', timeout=5)
|
||||
data = client.call('get', {'name': 'static.ini'})
|
||||
return data.get('content')
|
||||
except (ConnectionRefusedError, ConnectionError, OSError) as e:
|
||||
print(f'[static] 致命错误: 无法连接 confs 服务 ({_confs_host}:{_confs_port}): {e}',
|
||||
file=sys.stderr)
|
||||
print(f'[static] 请确认 confs 服务已启动并监听 {_confs_host}:{_confs_port}',
|
||||
file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except RpcError as e:
|
||||
print(f'[static] 致命错误: 从 confs 获取 static.ini 失败: {e}',
|
||||
file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except Exception as e:
|
||||
print(f'[static] 致命错误: confs 配置拉取异常: {e}',
|
||||
file=sys.stderr)
|
||||
sys.exit(1)
|
||||
return data.get('content')
|
||||
|
||||
|
||||
_confs_text = _fetch_from_confs()
|
||||
|
||||
Reference in new issue
Block a user