Generic embeddable event-time windowing library: windows, watermarks, UDAFs, triggers and state cleanup, plus a correction layer (retraction rebuild, finality guards, before-image validation) for amended facts. Structured events supported.

| 场景 | Flink 的典型做法 | TideWeave |
|---|---|---|
| 撤回桥接事件后的会话边界 | retract 流交给下游自行消化;窗口边界不会自动重新拆分 | 按连通分量重新拆分会话,输出完整 delete + upsert |
| 已终结窗口被迟到数据改写 | 依赖 allowed lateness 与下游幂等,边界语义分散 | final 窗口与其成员事实显式保护,等 SUM 也无法绕过 |
| 下游漏接或拿到旧值 | 需自建版本校验 | View 原子校验版本连续性、before-image 与行身份 |
| 部署形态 | JVM 集群、状态后端、checkpoint 存储 | 单进程嵌入式,确定性回放,无外部依赖 |
moon add LMK-ai-nb/tideweave@0.2.4import { "LMK-ai-nb/tideweave" @tide }let cfg = @tide.config(@tide.Session(gap=10), lateness=20, value_field=Some("watts")) // 度量取自 fields.watts
let engine = @tide.Engine::new(cfg)
let view = @tide.View::new()
let outcome = engine.apply(@tide.Transact(id="batch-1", changes=[
@tide.Put({ id: "left", key: "device-A", at: 0, value: 20, fields: Some([("watts", "20")]) }),
@tide.Put({ id: "right", key: "device-A", at: 16, value: 35, fields: Some([("watts", "35")]) }),
]))
view.apply(outcome)
let restored = @tide.restore(engine.checkpoint())
assert_true(restored.rows() == engine.rows())| 场合 | 数据库/业务系统的做法 | 为什么不够 |
|---|---|---|
| 设备网关、边缘控制器、桌面工具、CI 测试夹具 | 没有数据库可改 | 现场只有一个进程,既没有 DB 也没有集群;但迟到合并、撤回拆分、窗口边界一样要算对 |
| 广告计费、退款回冲、订单撤改 | 定时全量重算,或 UPDATE 后另补一张报表 | 更正不是一次性动作:无效流量撤回、退款、补传各自成流,乱序且会重复;照命令日志重放会二次扣减 |
| 对账、审计、风控要求"交代改了什么" | 行级 after 值,或翻 binlog | 给不出成员级 before/after,也给不出"这两个会话本该拆开"的拓扑结论;下游没法在应用前拦下旧值 |
cat examples/session-stream.ndjson | node bin/tideweave.mjs stream
node bin/tideweave.mjs stream examples/session-stream.ndjson --checkpoint saved.jsonmoon version --all
moon check --target all --deny-warn
moon test --target wasm-gc,wasm,js --deny-warn
moon build --target wasm-gc,wasm,js --deny-warn
moon fmt --check
moon info
node scripts/check_identity.mjs
moon run cmd/demo
node scripts/build.mjs
node --test tests/cli.test.mjs
node scripts/serve.mjsnode bin/tideweave.mjs run examples/order-amendment.json --checkpoint checkpoint.json
node bin/tideweave.mjs run examples/session-correction.json
node scripts/benchmark.mjs
# 恢复:checkpoint 不能直接喂给 resume,要嵌进请求
node -e "const c=require('./checkpoint.json');require('fs').writeFileSync('resume.json',JSON.stringify({schema_version:1,checkpoint:c,commands:[]}))"
node bin/tideweave.mjs resume resume.json| 主张 | 证据 |
|---|---|
| 撤回后重建会话(不是数值减法) | node scripts/compare_naive.mjs;examples/session-correction.json |
| 终结窗口与成员事实保护 | boundary_wbtest.mbt、engine_wbtest.mbt |
| 自定义聚合(UDAF) | aggregate.mbt、aggregate_wbtest.mbt |
| 水位生成与迟到判定 | watermark.mbt、watermark_wbtest.mbt |
| 触发(Watermark / Count) | trigger_wbtest.mbt |
| 状态封存与确定性回放 | forget_wbtest.mbt;moon run cmd/demo 末行 frozen=2, active=0 |
| NDJSON 流式驱动 | examples/session-stream.ndjson、tests/cli.test.mjs |
| 结构化事件与可配置度量 | structured_wbtest.mbt;examples/structured-events.json;API.mbt.md(随测试编译) |
| 同一引擎跨域通用(设备/订单/广告计费) | examples/session-correction.json、order-amendment.json、ad-billing.json 三个不相干域共用同一套窗口与撤回语义 |
| 提交身份归属 | node scripts/check_identity.mjs |
pub(all) struct Config {
window : WindowSpec
lateness : Int
max_events : Int
max_operations : Int
trigger : Trigger
value_field : String?
} derive(Eq)pub(all) struct Measure {
name : String
identity : Int64
step : (Int64, Int64) -> Int64
finish : (Int64, Int64) -> Int64
}pub(all) struct MeasureWindow {
key : String
start : Int
end : Int
count : Int
measures : Array[MeasureResult]
phase : String
} derive(Eq, ToJson)pub struct WatermarkTracker {
max_time : Int
allowed_lateness : Int
}pub(all) enum WindowSpec {
Tumbling(size~ : Int, offset~ : Int)
Sliding(size~ : Int, slide~ : Int, offset~ : Int)
Session(gap~ : Int)
} derive(Eq)impl ToJson for WindowSpecfn config(window : WindowSpec, lateness? : Int, max_events? : Int, max_operations? : Int, trigger? : Trigger, value_field? : String?) -> Config raise TideErrorfn measure(name~ : String, identity~ : Int64, step~ : (Int64, Int64) -> Int64, finish~ : (Int64, Int64) -> Int64) -> MeasureInstall
Download zipGeneric embeddable event-time windowing library: windows, watermarks, UDAFs, triggers and state cleanup, plus a correction layer (retraction rebuild, finality guards, before-image validation) for amended facts. Structured events supported.