Skip to content

排名关键词:母本本地化建议流、采集预算治理与调度可靠性 - #302

Merged
wxy merged 3 commits into
masterfrom
feat/rank-keywords-lifecycle
Sep 17, 2026
Merged

wxy merged 3 commits into
masterfrom
feat/rank-keywords-lifecycle

Conversation

@wxy

@wxy wxy commented Sep 17, 2026

Copy link
Copy Markdown
Owner

概述

本 PR 覆盖排名关键词链路的一组治理与可靠性改进:建议流重构、采集预算、iTunes Search 限流熔断、调度 daemon 可靠性(DB 锁 / 平滑停机 / 租约接管)与 AI 用量显示修复。

1. 关键词建议流重构

  • 统一为「en 全局母本 → 各语言本地化 → 建议弹窗确认」:新语言的关键词不再绕过确认直接落库,也不再每种语言重复生成英文短语(此前 8 种语言 × 每次重复生成 8–12 条英文)
  • 新增 projects:localizeKeywords IPC 与引擎层 localizeKeywords;generate / curate / localize 均接入 operationId 取消通道
  • 建议弹窗按语言分 tab(zh-CN 拼音音序);采纳/忽略选择内聚在弹窗内部——点击不再触发整页(矩阵 + 图表)重渲染,消除点击延迟
  • 批量进度改整体口径:阶段 语言 · x/N 文案 + 跨语言字符累计单调递增(此前显示"当前查看语言"的流,跑到后面的语言时数字冻结);支持中途停止,保留已完成语言的建议

2. 采集预算治理(关键词生命周期策略)

  • 成本模型:每日任务数 = 活跃关键词 × 语言覆盖的商店数(en 全局词在每个本地化下都计费,是任务膨胀的主因)
  • 软上限 240 / 硬上限 360 实例每天:软限 UI 黄色提示,硬限拒绝 AI 建议采纳、候选一键加入、恢复暂停词,超限自动裁剪并提示清理
  • 建议弹窗常驻预算提示;排名页常驻预算指示(每日采集 N/360 · 关键词 M)
  • 存量超限不阻断:由既有的「连续 10 次未在榜 → 待复核暂停」管道逐步清理,形成生命周期闭环

3. iTunes Search 限流熔断(403 排查)

  • 根因:唤醒/崩溃后积压排水无节流,实测 45–50 req/min 持续 15 分钟 → 429 → 403 封禁(iTunes 隐性容忍 ~20 req/min)
  • 全局请求节拍 3.2s/请求(≈18.7 req/min),rank 采集与竞品雷达共用
  • 熔断级别化:冷却解除后 15 分钟复发窗口内再次 403 → 冷却翻倍(45→90→180→360min 封顶),打破「解除即全速重试 → 又 403 → 再延 45 分钟」的滚动延期;kv 格式兼容旧 ISO

4. 调度可靠性

  • DB 锁根治:共享库事务改 BEGIN IMMEDIATE(WAL 下 DEFERRED 事务读升写会立即 SQLITE_BUSY,busy_timeout 不介入)+ busy_timeout 10s + 锁错误有界重试
  • 租约接管:lease 记录 leaderPid(schema v16),崩溃主(心跳新鲜但进程已死)立即接管,不再空等 60s TTL 导致 watchdog 连续空转
  • 平滑停机/重启:daemon 停止/重启前先排空在途执行(上限 30s)再拆 socket / 释放租约;任务中心的停止与重启因此不会掐断在途采集
  • 崩溃可观察:daemon 活动日志与未捕获异常落 scheduler-daemon.log(壳以 detached + stdio ignore 拉起,此前崩溃栈全部丢失)
  • 启动竞态修复:租约诊断兼容未迁移库;语言标签按拼音音序;AI 按钮字数统一一位小数

5. AI 用量显示修复

  • 主进程 AI 记账后直连推送渲染层(此前经 data-changed → CustomEvent → 再 IPC 三跳,更新不可见)
  • 顶部胶囊改精确数字(849,312 · 缓存 178,304)并显示累计请求数

测试

  • 新增:采集预算(10 断言)、熔断级别化复发升级、崩溃主跨进程立即接管、drain 等待在途执行/超时放弃
  • 更新:格式化一位小数、语言音序断言、schema v16
  • 全量 npm test 通过(pipefail EXIT 0)、tsc --noEmit 通过

wxy added 2 commits September 17, 2026 13:40
- 生成/整理统一为「en 母本 → 各语言本地化 → 建议弹窗确认」:新语言不再直接
  落库,也不再每种语言重复生成英文短语;新增 projects:localizeKeywords IPC
  (generate/curate/localize 均接 operationId 取消通道)
- 建议弹窗按语言分 tab(zh-CN 拼音音序);采纳/忽略选择内聚弹窗内部,点击
  不再重渲染整个关键词页;确认时统一落库并过滤已删除历史词
- 批量进度改整体口径(x/N + 阶段文案 + 跨语言字符累计单调递增),支持中途
  停止(保留已完成语言的建议)
- 新增采集预算(软 240 / 硬 360 实例每天):成本 = 活跃关键词 × 语言覆盖的
  商店数(en 全局词按全部本地化计费);AI 建议采纳 / 候选一键加入 / 恢复
  暂停词均受硬上限约束,超限自动裁剪并提示
- 语言标签按 zh-CN 拼音音序(不再 en 置顶);AI 按钮字数统一一位小数
- iTunes /search 全局节拍 3.2s/请求(实测 45+/min 持续 5 分钟即 429→403),
  rank 采集与竞品雷达共用;403 熔断级别化:解除后复发窗口(15min)内再次
  403 → 冷却翻倍(45→90→180→360min 封顶),打破「解除即全速重试→又 403」
  的滚动延期;kv 兼容旧 ISO 格式
- 共享库锁根治:事务改 BEGIN IMMEDIATE(WAL 下读升写会立即 BUSY,
  busy_timeout 不介入)+ busy_timeout 10s + 锁错误有界重试;lease 记
  leaderPid,崩溃主(心跳新鲜但进程已死)立即接管,不再空等 60s TTL;
  诊断输出兼容未迁移库
- daemon 平滑停机/重启:停止派发后先排空在途执行(上限 30s)再拆 socket/
  释放租约,SIGTERM/shutdown/自重启同路径;崩溃栈与活动日志落
  scheduler-daemon.log(uncaughtException/unhandledRejection 钩子)
- AI 用量:主进程记账后直连推送渲染层(不再经 data-changed 三跳中转),
  胶囊改精确数字并显示累计请求数
@github-actions

Copy link
Copy Markdown

Appilot CLA v1.0 accepted. Thank you for contributing. / Appilot CLA 1.0 已接受,感谢贡献。
Posted by the CLA Assistant Lite bot.

allowlist 匹配提交的 git author name/email(未关联 GitHub 账号的邮箱不会
解析为登录名),把仓库所有者的常用提交身份加入白名单,自有 PR 直接通过。
@wxy
wxy force-pushed the feat/rank-keywords-lifecycle branch from dee05ad to 20a9c02 Compare September 17, 2026 05:52
@wxy
wxy merged commit 48cb209 into master Sep 17, 2026
4 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 17, 2026
@wxy
wxy deleted the feat/rank-keywords-lifecycle branch September 22, 2026 07:51
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant