完善提取处理流程,解决提取并发问题

This commit is contained in:
2026-05-13 16:17:57 +08:00
parent d273731e31
commit ccbc6f0b67
6 changed files with 361 additions and 287 deletions

View File

@@ -1,13 +1,67 @@
## TODO
- 解决提取成功率问题
- 提交代理端口配置后,并非同步将节点标记为占用状态,导致后续提取请求仍然会选中该节点,直到下一个提取请求才会发现该节点已满,导致提取失败?
### 接口并发问题
#### 找可用网关 & 找可用端点
*(注:找端点依赖于网关状态,二者先后执行,但在并发控制上统一处理)*
**下线并发问题**
* 提供指定网关的可重入读写锁A。
* 整个提取期间锁定A直到提取结束。
* 网关可以并发下线但是不允许在锁A清空前进行删除或修改。
#### 找可用节点
##### 找本地
**并发筛选问题**
多个提取请求筛选到同一个节点,只有一个请求可以占用该节点,其他请求会直接失败。
**处理方案:**
* 提供占用锁,持续到提交配置后。
* 筛选出节点后,锁定该节点,如果锁定失败说明该节点已被占用(包括云端节点)。
* 如果被占用则等待占用结束后重新筛选(如果在结束前就重新筛选,可能还是会筛选到同样的节点,再次导致失败)。
* 提取时可能要求多个节点,因此锁定节点时,需要一个 lua 脚本同步锁定同一批节点。
##### 找云端
**重复筛选问题**
云端接口不会自动过滤已连接的节点,有可能筛选到已经连接甚至配置的节点。
**处理(缓解)方案:**
* 优先筛选今日未分配的节点,如果没有可用节点,再分配已用节点,这个方案暂时缓解问题。
#### 整理配置信息
* 该环节**不会有并发问题**。
#### 开通通道
*(注:包含以下三个独立操作,主要关注其执行的原子性与最终一致性保证)*
##### 提交异步关闭任务
**后续失败问题:**
* 不考虑回滚,执行时需要考虑后续数据不全的情况。
* 提交需要 `proxy``batch` 参数,端口取用是独占的,因此在归还端口前,一定不会有其他连接使用端口。任务信息中需要包含足够的信息以在没有数据库信息时解除配置。
* 解除连接与归还端口全部成功才算成功。
##### 提交配置到云端
* 该环节**不会有并发问题**。
##### 保存到数据库
**一致性处理:**
* 保存失败后,只会存在孤立占用。异步任务会自动重试,能够实现最终一致性。
---
- 并发扣减问题
- 代理选择通过查 redis 实现
- 重新考虑取用流程设计,是否可以分离端口归还与通道断开。端口归还后通道即使没有断开,未来也会被其他请求占用,能够实现最终一致性
---
- otel 没有正确记录接口失败信息
筛选和关联展示功能扩展
channel 管理逻辑优化,需要携带 proxy 信息,考虑到 channel 没有成功创建的情况,或者保证创建操作的原子性
错误提示增强,展示整链路信息
ip 提取频率限制,在 ensure 函数加逻辑,通过 redis 或者 pg 计算分钟内提取次数,只允许每分钟提取 30 次