sfsEdgeStore 技术文档
项目概览
sfsEdgeStore 是专为工业物联网边缘场景设计的轻量级数据存储适配器,作为 EdgeX Foundry 和 sfsDb 数据库之间的桥梁,提供高效的本地数据读写和缓存能力。
核心特性
- 纯 Go 实现:无 CGO 依赖,跨平台编译简单
- 极轻量:资源占用极低,可在任何边缘设备上运行
- 高可靠:本地存储,网络中断不影响数据采集
- 易集成:与 EdgeX Foundry 原生集成,开箱即用
- 高性能:LevelDB 底层,本地查询毫秒级响应
- 开源免费:完整功能,无限制使用
快速开始
项目结构
sfsEdgeStore/
├── main.go # 主程序入口
├── agent/ # 管理代理
├── alert/ # 告警通知
├── analyzer/ # 数据分析引擎
├── auth/ # 认证授权
├── common/ # 通用工具
├── config/ # 配置管理
├── database/ # 数据库封装
├── edgex/ # EdgeX Foundry 集成
├── logger/ # 日志
├── monitor/ # 监控指标
├── mqtt/ # MQTT 客户端
├── queue/ # 数据队列
├── resource/ # 资源监控
├── retention/ # 数据保留策略
├── server/ # HTTP 服务器
├── simulator/ # 数据模拟器
├── sync/ # 数据同步
└── time/ # 时间序列分析
主程序入口
主程序 main.go 展示了系统的启动流程:
// main.go
package main
import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
"sfsEdgeStore/agent"
"sfsEdgeStore/alert"
"sfsEdgeStore/analyzer"
"sfsEdgeStore/auth"
"sfsEdgeStore/config"
"sfsEdgeStore/database"
"sfsEdgeStore/monitor"
"sfsEdgeStore/mqtt"
"sfsEdgeStore/queue"
"sfsEdgeStore/resource"
"sfsEdgeStore/retention"
"sfsEdgeStore/server"
"sfsEdgeStore/simulator"
"sfsEdgeStore/sync"
)
var appConfig *config.Config
var dataQueue *queue.Queue
var monitorInstance *monitor.Monitor
var agentInstance *agent.Agent
var analyzerInstance *analyzer.Analyzer
var retentionManager *retention.RetentionManager
var alertNotifier *alert.Notifier
var syncManager *sync.SyncManager
var resourceMonitor *resource.ResourceMonitor
var simulatorInstance *simulator.Simulator
func main() {
// 加载配置
var err error
appConfig, err = config.Load()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// 初始化监控
monitorInstance = monitor.NewMonitor()
// 初始化告警通知器
alertNotifier = alert.NewNotifier(appConfig)
monitorInstance.SetNotifier(alertNotifier)
if err := alertNotifier.Start(); err != nil {
log.Printf("Failed to start alert notifier: %v", err)
}
// 初始化分析引擎
analyzerInstance = analyzer.NewAnalyzer(appConfig)
if appConfig.EnableAnalyzer {
log.Println("Analyzer enabled")
} else {
log.Println("Analyzer disabled")
}
// 连接 sfsDb
if err = database.Init(appConfig.DBPath, appConfig.DBUseEncryption, appConfig.DBEncryptionKey, appConfig.DBEncryptionAlgorithm); err != nil {
log.Fatalf("Failed to initialize database: %v", err)
}
// 启动认证清理任务
authManager := auth.NewAuthManager()
authManager.StartCleanupTask(24 * time.Hour)
// 初始化数据队列
dataQueue, err = queue.NewQueue("./data_queue")
if err != nil {
log.Fatalf("Failed to initialize data queue: %v", err)
}
var mqttClient *mqtt.Client
if !appConfig.EnableSimulator {
mqttClient, err = mqtt.NewClient(appConfig, dataQueue, monitorInstance, analyzerInstance)
if err != nil {
log.Fatalf("Failed to initialize MQTT: %v", err)
}
defer mqttClient.Disconnect()
if err := mqttClient.Subscribe(); err != nil {
log.Fatalf("Failed to subscribe to EdgeX messages: %v", err)
}
} else {
log.Println("Simulator enabled, skipping MQTT connection")
}
log.Println("sfsDb EdgeX adapter started successfully")
// 启动队列处理 goroutine
dataQueue.ProcessQueue(func(data interface{}) error {
records, ok := data.([]*map[string]any)
if !ok {
return fmt.Errorf("invalid data type in queue")
}
return database.BatchInsertWithRetry(database.Table, records, 3, 2*time.Second)
})
// 初始化并启动极简管理Agent
agentInstance, err = agent.NewAgent(appConfig, monitorInstance)
if err != nil {
log.Printf("Failed to initialize agent: %v", err)
} else {
if err := agentInstance.Start(); err != nil {
log.Printf("Failed to start agent: %v", err)
}
}
// 初始化并启动数据保留策略管理器
retentionManager = retention.NewRetentionManager(database.Table, appConfig)
if err := retentionManager.Start(); err != nil {
log.Printf("Failed to start retention manager: %v", err)
}
// 初始化并启动数据同步管理器
syncManager, err = sync.NewSyncManager(appConfig)
if err != nil {
log.Printf("Failed to initialize sync manager: %v", err)
} else {
if err := syncManager.Start(); err != nil {
log.Printf("Failed to start sync manager: %v", err)
}
}
// 初始化并启动资源监控器
resourceMonitor = resource.NewResourceMonitor(appConfig, monitorInstance)
if err := resourceMonitor.Start(); err != nil {
log.Printf("Failed to start resource monitor: %v", err)
}
// 启动 HTTP 服务器
serverInstance := server.NewServer(database.Table, appConfig, monitorInstance, retentionManager, alertNotifier, syncManager, resourceMonitor)
if err := serverInstance.Start(); err != nil {
log.Fatalf("Failed to start HTTP server: %v", err)
}
// 等待中断信号以优雅地关闭服务器
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutting down adapter...")
// 停止各个组件
if agentInstance != nil {
agentInstance.Stop()
}
if retentionManager != nil {
retentionManager.Stop()
}
if alertNotifier != nil {
alertNotifier.Stop()
}
if syncManager != nil {
syncManager.Stop()
}
if resourceMonitor != nil {
resourceMonitor.Stop()
}
time.Sleep(5 * time.Second)
log.Println("Adapter exited")
}
启动流程
- 加载配置:从配置文件或环境变量加载配置
- 初始化监控:设置监控指标和告警通知
- 连接数据库:初始化 sfsDb 数据库连接
- 初始化队列:创建数据队列用于故障恢复
- 连接 MQTT:连接到 EdgeX Foundry 的 MQTT Broker
- 启动队列处理:后台处理队列中的数据
- 启动各个组件:Agent、保留策略、同步、资源监控等
- 启动 HTTP 服务器:提供 RESTful API
- 等待中断信号:优雅关闭
编译和运行
# 编译
go build -o sfsedgestore main.go
# 运行
./sfsedgestore
依赖
项目使用的主要依赖:
// go.mod
module sfsEdgeStore
go 1.25.3
require (
github.com/eclipse/paho.mqtt.golang v1.5.1
github.com/edgexfoundry/go-mod-configuration/v2 v2.3.0
github.com/liaoran123/sfsDb v1.9.3
)