最近阅读了https://github.com/honeycombio/dynsampler-go的源码,这个项目主要聚合几种常用的采样策略。
下面前2种平均采样均使用了求对数的方式来平衡低概率和高概率事件让采样更加均衡,避免低概率事件采样过低的情况。
下面所有采样算法在此只做简单分析,还有很多巧妙的细节建议直接跟源码阅读。
策略名:平均采样 前提:假定一个“预期采样倍数”,一个“周期时长” 输入:一组key:count的键值对 计算过程: 预期采样数 = 总数量/预期采样倍数 单位对数预期采样数 = 预期采样数/单key数量对数累加和 单key预期采样数 = 单位对数预期采样数 * 单key数量对数 单key实际采样倍数 = 单key数量/单key预期采样数 输出: 存在输入并且输入中存在该key 则返回 “单key实际采样倍数” 存在输入并且输入中不存在该key 则返回 1倍 不存在输入 则返回 “预期采样倍数” (均为单周期时长) 场景:适用于输入key间数量差距较大的情况
策略名:最低流速平均采样 前提:假定一个“预期采样倍数”,一个“周期时长” 输入:一组key:count的键值对 计算过程: 如果 总数量 < 最低流速 * 周期时长 则所有输入key实际采样倍数为1 计算结束 预期采样数 = 总数量/预期采样倍数 单位对数预期采样数 = 预期采样数/单key数量对数累加和 单key预期采样数 = 单位对数预期采样数 * 单key数量对数 单key实际采样倍数 = 单key数量/单key预期采样数 输出: 存在输入并且输入中存在该key 则返回 “单key实际采样倍数” 存在输入并且输入中不存在该key 则返回 1倍 不存在输入 则返回 “预期采样倍数” (均为单周期时长) 场景:适用于输入key间数量差距较大的情况,且有最低流速控制要求
策略名:唯一采样 前提:假定一个“周期时长” 计算过程: 如果周期时长等于-1 则 全生命周期只采样一倍,后续拉取采样策略均按照10亿倍采样 否则 每个周期时长采样一倍 场景:有唯一采样需求
策略名:静态采样 计算过程:指定采样倍数 场景:均衡稳定数据流场景
策略名:总吞吐采样 前提:假定一个“每秒预期吞吐量”,一个“周期时长” 输入:一组key:count的键值对 计算过程: 周期内预期总吞吐量 =每秒预期吞吐量 *周期时长 预期单key吞吐量 =周期内预期总吞吐量/key个数 单key实际采样倍数 = 单key数量/预期单key吞吐量 输出: 存在输入并且输入中存在该key 则返回 “单key实际采样倍数” 其他情况均返回 1倍 (均为单周期时长) 场景:适用于有吞吐限制的情况
策略名:单key吞吐采样 前提:假定一个“单key每秒预期吞吐量”,一个“周期时长” 输入:一组key:count的键值对 计算过程: 周期内单key预期总吞吐量 =单key每秒预期吞吐量 *周期时长 单key实际采样倍数 = 单key数量/周期内单key预期总吞吐量 输出: 存在输入并且输入中存在该key 则返回 “单key实际采样倍数” 其他情况均返回 1倍 (均为单周期时长) 场景:适用于有吞吐限制的情况并且吞吐需均摊到单key的