Documentation
¶
Overview ¶
Package tally 提供高频累计聚合 + 批量刷写:把海量小额增量在内存里按 key 累加, 定时(或攒够阈值)合并成一批交给 flush 回调一次性处理,削平写放大。
解决的问题:直播间点赞、刷礼物、观看时长、埋点计数——每秒成百上千次小额 +1, 逐笔写库/推送会打爆下游。tally 把"高频写"聚合成"低频批量写": N 次 Add 只触发少量 flush,每次 flush 拿到的是合并后的 map[key]delta。
与相邻原语的分工:
- wallet:逐笔精确账本(必须不丢、可审计),适合货币;tally 是可聚合的计数 (点赞/人气/礼物数),容忍进程崩溃丢失最后一个未 flush 窗口;
- counter:窗口内累计用于"读/配额判断",不落地;tally 聚合后"刷写到下游";
- scheduler:通用工作池,tally 专注"累加→合并→批量交付"这一模式。
触发 flush 的两个条件(满足其一):到达 flushInterval、或累积的 key 数达 maxKeys。 flush 在独立 goroutine 串行执行(不重叠),panic 被 pkg/safe 恢复。 Stop 会做最后一次 flush(除非 WithFlushOnStop(false)),确保尾部数据不丢。
泛型 V 为增量的数值类型(如 int64 / float64)。并发安全。零值不可用,用 New 构造。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type FlushFunc ¶
FlushFunc 批量刷写回调。收到的是自上次 flush 以来合并的增量快照(非空)。 回调应尽快返回;其内部错误由回调自行处理(tally 不重试、不回滚累积)。
type Number ¶
type Number interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 |
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 |
~float32 | ~float64
}
Number 约束:可累加的数值类型。
type Option ¶
type Option func(*config)
Option 配置 Tally。
func WithFlushInterval ¶
WithFlushInterval 设置定时刷写间隔(默认 1s)。
func WithFlushOnStop ¶
WithFlushOnStop 设置 Stop 时是否做最后一次刷写(默认 true)。
func WithMaxKeys ¶
WithMaxKeys 设置累积 key 数阈值:不同 key 累积到此数立即触发刷写(默认 0=不按数量触发,仅定时)。 用于突发高基数场景及时释放内存。