Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ETL ¶
ETL 看板预聚合任务(增量水位,幂等)。
抽取模型:不再按 timestamp 全表扫 message 分片(无该索引),改为按主键 id keyset 分页 流式增量读取,每条消息精确一次累加进 ③;首次运行从 id=0 自动全量回填,之后每次只读新增。 稳定性闸门(created_at ≤ DB_NOW-lag)杜绝"低 id 晚提交被游标越过"的并发漏扫(见 etlLagSeconds)。
口径语义(事件处理时口径 / event-time semantics):③/④ 是按消息处理当时的维表(成员类型、 排除名单、群成员构成)累加的不可变事实。事后变更维表(如 user.category 改 system、系统 bot 名单扩展、robot 更正、群成员增减)只影响**之后**处理的新消息,不回溯已写入的历史行。如需让 维表变更追溯既往,调用 Rebuild() 安全重建(清事实+水位,下轮用当前维表全量重算)。
func (*ETL) Rebuild ¶
Rebuild 安全重建:清空事实表(③/④)、抽取水位与脏日队列,再用**当前**维表从 id=0 全量重算。
用途——口径回溯(event-time 语义的逃生门):当成员类型/排除名单/群成员构成等维度发生历史性 修正,需要让既往统计也按新口径重算时,运行此入口。注意这是一次性重读全部 message 历史的重操作, 应在低峰由运维显式触发(非定时路径)。
运维亦可等价地手工执行:TRUNCATE octo_fact_member_channel_daily / octo_fact_channel_daily / octo_etl_message_cursor / octo_etl_dirty_day,下一次定时 RunIncremental 会自动全量回填。
注意:本方法**不持** scheduler 的 Redis ETL 锁。当前未接任何入口(仅供运维/测试直接调用), 故安全。将来若挂到 ops 端点,必须先获取同一把锁(并暂停 cron),否则与定时跑并发会在清空游标 与增量重算之间互相踩踏。
func (*ETL) RunIncremental ¶
RunIncremental 增量跑一轮:刷新维表 → 逐分片按水位流式抽取并累加 ③ → 标脏日 → 由 ③ 重算 ④。
幂等:游标保证已处理消息不重复计入(精确一次);重复调用在无新消息时为空操作。 崩溃安全:③ 累加与游标推进同事务提交;④ 经持久化脏日队列由本轮或下轮重算,最终一致。
type Scheduler ¶
Scheduler 看板增量 ETL 的每日定时调度器(仿 modules/backup/scheduler.go)。 多副本部署时由 Redis 锁保证同一时刻只有一个实例真正执行(验收④)。
func (*Scheduler) TriggerManualRun ¶
TriggerManualRun 抢同一把 ETL 分布式锁,抢到后异步跑一轮增量 ETL。 返回 (false,nil) 表示已有 cron 或手动任务在运行。