Skip to the content.

采集状态机集成指南

概述

采集状态机管理已成功集成到项目中,用于管理设备的通信状态、故障恢复和重试策略。

核心改动

1. node_status.go - 状态机核心实现

新增以下内容:

结构体定义

状态定义

核心方法

2. device_manager.go - 集成采集流程

修改内容:

新增字段

修改的方法

新增方法

3. model/types.go - 数据模型扩展

修改 Device 结构体:

工作流程

设备采集循环:
│
├─ 定时触发采集 (deviceLoop)
│
├─ 查询设备状态 (GetNode)
│
├─ 决定是否采集 (ShouldCollect)
│  ├─ Online/Unstable → 执行采集
│  └─ Offline/Quarantine → 检查退避时间
│
├─ 执行采集 (collect)
│  ├─ 读取数据点
│  ├─ 统计成功/失败数
│  └─ 推送数据到管道
│
└─ 状态机裁决 (finalizeCollect)
   ├─ 评估成功率
   ├─ 更新节点状态
   ├─ 设置重试时间 (退避机制)
   └─ 修改失败/成功计数

采集决策规则

状态转换图

Online (成功) ←─── Unstable ──→ Offline
  ↓ (3-9次失败)         ↓ (10次以上失败)
Unstable ────────→ Quarantine

退避策略

成功率评估

使用示例

添加设备

dm := NewDeviceManager(pipeline)
device := &model.Device{
    ID: "device1",
    Name: "ModBus Device",
    Protocol: "modbus-tcp",
    // ... 其他配置
}
dm.AddDevice(device)
dm.StartDevice("device1")

查询设备状态

state := dm.GetDeviceState("device1")
if state != nil {
    fmt.Printf("设备状态: %v\n", state.State)
    fmt.Printf("失败次数: %d\n", state.FailCount)
    fmt.Printf("下一次重试: %v\n", state.NextRetryTime)
}

日志监控

采集循环会输出以下日志信息:

性能特性

扩展建议

  1. 添加监控指标:采集成功率、状态转换频率
  2. 实现告警机制:设备长期处于 Quarantine 状态时告警
  3. 支持手动干预:允许管理员强制重置设备状态
  4. 持久化状态:保存设备状态到数据库,便于重启后恢复