从流式日志中检测运行站点——日志顺序推断为何失效,以及一个标记如何修复该问题

发布日期:2026-07-06 10:00:26   浏览量 :5
发布日期:2026-07-06 10:00:26  
5

在一个按顺序对多个站点执行维护任务的界面中,你希望实时显示进度:“当前正在处理的站点”显示蓝色边框,“已完成的站点”显示绿色边框。这是常见的用户界面设计。

我们最初采用的方法是“监控后端发出的流式日志,并推断当前正在处理哪个站点”。结果发现这出乎意料地棘手——经过三轮修复才稳定下来。本文将以设计日志的形式记录这一试错过程。

初始设计——“站点切换,因此标记前一个站点为已完成”

日志以每站一行形式到达,例如 [站点名称] 开始维护。最初的实现很简单:

// 初始实现(后来发现是 bug 的根源)
function _setRunningSiteId(siteId) {
    if (_runningSiteId && _runningSiteId !== siteId) {
        _markCompleted(_runningSiteId);  // 切换到另一个站点 = 前一个站点已完成
    }
    _runningSiteId = siteId;
}

其推断逻辑为:“日志中出现新的站点名称 = 前一个站点已结束。”这在直觉上似乎是合理的。

缺陷 1 —— 日志“回退”导致未开始的站点被标记为已完成

实际测试中出现了这个问题:“选择两个站点并运行,第二个尚未开始的站点却变绿(显示为已完成)。”

原因是流式日志有时会以非单调顺序交错显示多个站点名称。

t1: 日志显示 [站点 A]        → _runningSiteId = A
t2: 日志显示 [站点 B]        → 标记 A 为完成 + _runningSiteId = B
t3: 日志再次显示 [站点 A]    → 标记 B 为完成 + _runningSiteId = A

在 t3 时刻,尚未开始处理的站点 B 被错误地标记为“已完成”。面对日志的非单调排序,“切换即意味着前一个完成”的规则显得非常脆弱。

修复方案 1 —— 使用执行顺序索引拒绝回退

在运行时,我们保存“计划中的站点标识数组(按执行顺序)”,并忽略任何索引倒退的切换

let _runningSiteIdOrder = [];   // 计划中的站点标识数组(执行顺序)
let _runningSiteIdIndex = -1;   // 当前索引

function _setRunningSiteId(siteId) {
    const newIdx = _runningSiteIdOrder.indexOf(siteId);

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据