tally

package
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 5, 2026 License: Apache-2.0 Imports: 4 Imported by: 0

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

type FlushFunc[V Number] func(ctx context.Context, batch map[string]V)

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

func WithFlushInterval(d time.Duration) Option

WithFlushInterval 设置定时刷写间隔(默认 1s)。

func WithFlushOnStop

func WithFlushOnStop(on bool) Option

WithFlushOnStop 设置 Stop 时是否做最后一次刷写(默认 true)。

func WithMaxKeys

func WithMaxKeys(n int) Option

WithMaxKeys 设置累积 key 数阈值:不同 key 累积到此数立即触发刷写(默认 0=不按数量触发,仅定时)。 用于突发高基数场景及时释放内存。

type Tally

type Tally[V Number] struct {
	// contains filtered or unexported fields
}

Tally 高频累计聚合器。零值不可用,用 New 构造。并发安全。

func New

func New[V Number](flush FlushFunc[V], opts ...Option) *Tally[V]

New 创建聚合器并启动后台刷写 goroutine。flush 为批量回调(不可为 nil)。

func (*Tally[V]) Add

func (t *Tally[V]) Add(key string, delta V)

Add 给 key 累加 delta(高频调用路径,只做内存累加)。 若累积 key 数达到 maxKeys 阈值,非阻塞地触发一次刷写。

func (*Tally[V]) Flush

func (t *Tally[V]) Flush()

Flush 主动触发一次异步刷写(非阻塞)。当前有累积则会尽快 flush。

func (*Tally[V]) Pending

func (t *Tally[V]) Pending() int

Pending 返回当前尚未刷写的不同 key 数(近似,用于观测)。

func (*Tally[V]) Stop

func (t *Tally[V]) Stop()

Stop 停止后台刷写(默认做最后一次刷写)。幂等,阻塞直到刷写循环退出。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL