本文引用的文件
本文件系统性阐述 Cosmoe 服务端 API 的数据同步机制,覆盖以下方面:
该项目为 Cloudflare Workers 应用,采用模块化组织:
KV 命名空间:分别存储用户凭证与应用状态(如最新事件 ID)。
graph TB
A["入口: src/index.ts"] --> B["命令系统: src/command/index.ts"]
A --> C["计划任务: src/scheduler/index.ts"]
B --> D["客户端: src/client/cosmoe.ts"]
C --> D
B --> E["KV 会话存储<br/>COSMOE_STORAGE"]
A --> F["KV 凭证存储<br/>COSMOE_CREDENTIALS"]
C --> F
图表来源
章节来源
章节来源
下图展示从用户交互到服务端 API 的调用链路,以及计划任务的增量推送流程。
sequenceDiagram
participant U as "用户"
participant Bot as "Telegram Bot"
participant Cmd as "命令处理器"
participant KV as "KV 存储"
participant API as "Cosmoe API"
participant Sch as "计划任务"
U->>Bot : "/events" 或 "/event_<id>"
Bot->>Cmd : 路由到对应处理器
Cmd->>API : 查询事件/详情/历史
API-->>Cmd : 返回数据
Cmd-->>U : 发送消息
U->>Bot : "/login" 进入会话
Bot->>Cmd : 进入登录对话
Cmd->>API : 获取令牌
API-->>Cmd : 返回令牌
Cmd->>KV : 写入凭证
Sch->>API : 拉取全部事件
API-->>Sch : 返回事件列表
Sch->>KV : 读取 latestEventId
Sch->>Sch : 过滤新增事件
Sch->>Bot : 向所有已注册用户发送通知
Bot-->>U : 推送新活动
Sch->>KV : 更新 latestEventId
图表来源
批量同步
计划任务遍历 COSMOE_CREDENTIALS 中的所有键,向每个已注册用户发送通知。
flowchart TD
Start(["开始"]) --> Pull["拉取全部事件"]
Pull --> Compare["与 latestEventId 比较"]
Compare --> HasNew{"有新增事件?"}
HasNew --> |否| End(["结束"])
HasNew --> |是| Iterate["遍历所有已注册用户"]
Iterate --> Notify["逐个发送通知"]
Notify --> Update["更新 latestEventId"]
Update --> End
图表来源
章节来源
幂等性:KV 写入按用户 ID 键覆盖,避免重复登录导致的数据不一致。
sequenceDiagram
participant U as "用户"
participant Conv as "登录会话"
participant API as "Cosmoe API"
participant KV as "COSMOE_CREDENTIALS"
U->>Conv : 输入用户名/密码
Conv->>API : getToken
API-->>Conv : 返回 user_id/token
Conv->>KV : put(telegramUserId, 凭证JSON)
Conv-->>U : 登录成功
图表来源
章节来源
取消流程:二次确认键盘,确认后调用取消接口。
sequenceDiagram
participant U as "用户"
participant Bot as "Bot"
participant Cmd as "命令处理器"
participant API as "Cosmoe API"
U->>Bot : "/event_<id>"
Bot->>Cmd : 解析事件ID
Cmd->>API : getEventDetail
API-->>Cmd : 返回事件详情
Cmd-->>U : 展示时间槽与预约链接
U->>Bot : "/book_<event>_<slot>"
Bot->>Cmd : 解析事件ID与槽位
Cmd->>API : getAvailableCoupons
API-->>Cmd : 返回可用优惠券
Cmd->>API : bookEvent
API-->>Cmd : 返回结果
Cmd-->>U : 成功/失败消息
图表来源
章节来源
幂等与一致性:KV 写入保证 latestEventId 原子更新,避免重复推送。
flowchart TD
Tick["计划任务触发"] --> Load["读取 latestEventId"]
Load --> Fetch["获取全部事件"]
Fetch --> Filter["筛选新增事件"]
Filter --> Empty{"有新增?"}
Empty --> |否| Done["结束"]
Empty --> |是| ForEach["遍历已注册用户"]
ForEach --> Send["发送通知"]
Send --> Update["更新 latestEventId"]
Update --> Done
图表来源
章节来源
章节来源
章节来源
章节来源
潜在循环依赖
当前结构清晰,无明显循环导入。
graph LR
Cmd["命令系统"] --> Client["CosmoeClient"]
Sch["计划任务"] --> Client
Cmd --> KV["KV 存储"]
Sch --> KV
Client --> API["Cosmoe API"]
图表来源
章节来源
章节来源
Cosmoe 项目的同步机制以“KV + 计划任务 + 显式增量”为核心,实现了事件的准实时推送与用户侧的按需查询。通过 KV 的原子写入与命令系统的幂等设计,系统在无复杂分布式锁的情况下保持了基本的一致性。未来可在 KV 层引入更强的一致性保障(如 CAS)与更细粒度的缓存策略,以进一步提升可靠性与性能。
章节来源