sfsEdgeStore 技术文档

4 阅读3分钟

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")
}

启动流程

  1. 加载配置:从配置文件或环境变量加载配置
  2. 初始化监控:设置监控指标和告警通知
  3. 连接数据库:初始化 sfsDb 数据库连接
  4. 初始化队列:创建数据队列用于故障恢复
  5. 连接 MQTT:连接到 EdgeX Foundry 的 MQTT Broker
  6. 启动队列处理:后台处理队列中的数据
  7. 启动各个组件:Agent、保留策略、同步、资源监控等
  8. 启动 HTTP 服务器:提供 RESTful API
  9. 等待中断信号:优雅关闭

编译和运行

# 编译
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
)