自建埋点为了省请求,前端队列每三十秒 flush 一次,运营在实时看板上看到的数据总比实际晚半分钟到一分钟,活动开始那几分钟几乎是空的。日志里能对上时间点,这种反而好排。
批量队列按时间窗口聚合,事件先在本地排队,窗口没到就不会发出去。实时看板读的是接收时间,队列一延迟,整条曲线就右移。这一点先确认清楚,后面就不用反复试。
const REALTIME = new Set(['purchase', 'sign_up']);
function send(evt) {
if (REALTIME.has(evt.name)) return navigator.sendBeacon('/collect', JSON.stringify(evt));
queue.push(evt);
}
「埋点批量上报延迟」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
处理上按这个顺序:把实时性要求高的事件标成即时发送,比如支付和注册,别进批处理队列;普通浏览事件保留批量,flush 间隔压到五秒以内;网络恢复或页面隐藏时强制 flush,减少尾巴上的空窗。
结果对不对很好判断,活动开始后十秒内实时看板就有数据,曲线和后台订单时间基本对齐。
