- 博客(52)
- 资源 (1)
- 收藏
- 关注
原创 第 25 篇:边缘 AI 推理——在边缘网关上部署 TFLite / ONNX 模型
边缘计算不只是数据搬运工。当工厂需要在 50ms 内识别出传送带上的缺陷产品时,云端的 AI 模型来不及——网络延迟就让实时检测化为泡影。本文讲解如何在边缘网关(特别是 ARM 设备)上部署和运行轻量级 AI 推理模型,让智能决策发生在数据产生的第一现场。
2026-07-29 14:27:51
332
原创 第 24 篇:自建框架 vs 云原生边缘——三大方案选型对比
读完前面的系列文章,你可能会问一个问题:“你花了这么大篇幅讲自建边缘平台,但社区已经有 KubeEdge、K3s、Baetyl 这些云原生边缘方案了。我到底该自建还是直接用现成的?” 本文不站队,只做客观对比——帮你做出符合自己场景的选择。
2026-07-26 18:01:31
409
原创 第 23 篇:OTA 升级与网络配置——边缘节点免现场运维的最后一环
第 19 篇讲了指标采集、SSH 远程终端和日志采集这三个"诊断"能力。但诊断完了,最终还是要"修复"。本文聚焦两个"治疗"能力:安全的 OTA 升级(让边缘节点远程升级到新版本)和网络配置(远程改 IP、改 DNS、配路由)。
2026-07-25 15:52:51
195
原创 第 21 篇:DataBridge 插件工厂——可扩展的数据外推引擎
边缘不只是把数据送上云。工厂的 MES 系统、本地大屏监控、第三方分析平台都需要实时消费设备数据——走 MQTT、走 InfluxDB、走 Apache IoTDB。如果每加一个外部目标都要改 MessageHub 的代码,那维护成本是指数级的。本文用插件工厂模式实现 DataBridge——加一个新通道只需要实现一个接口、注册一行代码。
2026-07-22 21:50:00
318
原创 第 20 篇:EdgeRuntimeSDK 内部架构——多客户端、连接流程与回调分发
你接了一个活——开发一个 Modbus 协议驱动,让边缘网关能读取 PLC 控制器的数据。你的代码需要:如果让业务开发者自己去完成这一堆基础设施的对接(MQTT 连接管理、令牌刷新、Topic 注册、回调路由),他可能花两周在"接入"上,只剩两天写真正的 Modbus 协议解析。EdgeRuntimeSDK 的目标:把"接入平台"的成本从两周降到三行代码。二、架构分层——四层模型为什么是四层? 因为每层的职责和变化频率不同:不是所有模块需要同样的能力。一个数据采集驱动跟一个数据分析模块需要的能力完
2026-07-22 09:51:28
420
原创 第 19 篇:远程运维体系——指标、SSH、日志与 OTA 升级
边缘节点的宿命就是"出事时你不在现场"。本文设计一套完整的远程运维代理——采集系统指标、提供 SSH 远程终端、采集业务日志、执行 OTA 升级——让你坐在办公室里就能诊断和修复千里之外的边缘节点。
2026-07-21 19:02:33
227
原创 第 18 篇:设备管理全链路——从认证到拓扑到影子的完整方案
边缘网关上的活不只是"跑几个模块"。成百上千的设备(传感器、PLC、摄像头)要接入、要认证、要状态追踪、要命令下发。更复杂的是——设备可能通过多级网关嵌套接入。本文设计一套从设备认证到多级网关路由到设备影子的完整设备管理体系。
2026-07-19 09:06:46
200
原创 第 17 篇:离线缓存设计——多文件循环队列保障断网不丢数据
前端流控挡住了"能丢的"和"能慢的",但当网络彻底断开时,所有发往云端的消息都必须落地存下来。为什么不用 SQLite?为什么不用内存队列?本文设计一套基于自定义文件格式的循环队列——追加写入、指针移动即删除、TPS 限速消费、带容量预警。
2026-07-17 21:13:09
214
原创 第 16 篇:背压机制——用慢 ACK 实现优雅的流量反压
延迟效果10ms最多 100 TPS——对于严重过载来说压不够100ms最多 10 TPS——有效压降,又不会让客户端超时断连500ms最多 2 TPS——太慢,客户端可能超时断连重发,反而增加流量100ms 是工程实践的黄金值:够慢(把 100 TPS 压到 10 TPS),又不至于让客户端 MQTT keepalive 超时(通常 30s)。
2026-07-16 21:21:12
336
原创 第 15 篇:令牌桶流控——在 Broker 入口守住系统的命门
200 个设备同时并发上报消息,Broker 瞬间被打满,内存飙升到 OOM,整个边缘节点挂掉。本文用令牌桶在 Broker 入口处做第一道限流——“桶里有令牌才放行,桶空了就触发保护策略”。
2026-07-16 19:00:00
301
原创 第 14 篇:三级可靠性模型——按数据价值分级的消息保障
LOWMEDIUMHIGH发送方式非阻塞协程池缓冲队列 + 限速缓冲队列 + 限速内存缓冲无限速无令牌桶令牌桶MQTT QoS默认QoS 1QoS 1(强制)离线重试3 次后丢弃无限重试无限重试背压策略丢消息 + 回 ACK慢 ACK慢 ACK存储空间占用低(3 次就释放)高(无限等待)高(无限等待)
2026-07-16 09:47:34
329
原创 零拷贝(Zero-Copy)原理详解与 Go 实战:从 4 次拷贝到 0 次 CPU 拷贝
零拷贝的核心思想一句话:让数据尽量在内核态完成流转,消除 CPU 参与的、"仅仅路过用户空间"的无效拷贝。问题根源:传统"read + write"有 4 次拷贝、4 次上下文切换,其中 2 次 CPU 拷贝是纯浪费。三条进化路线:省 1 次 CPU 拷贝(用内存映射共享内核缓冲区)。sendfile:数据不进用户态,上下文切换降到 2 次。splice:0 次 CPU 拷贝,真正的零拷贝。Go 中的应用内核零拷贝几乎"免费"自动 sendfile,自动 splice。关键机制是io.Copy。
2026-07-13 06:30:00
376
原创 第 13 篇:消息路由引擎——用 YAML 规则匹配让每条数据流向正确的地方
同一条设备数据,有的要上云、有的要推给本地 AI 模块、有的要写到外部数据库。如果每次加目标都要改代码重启,开发效率和稳定性都无法保证。本文用 YAML 配置 + 规则匹配引擎,让运维在云端写一条规则、边缘自动生效——不需要解析器生成器,纯 Go 标准库搞定。
2026-07-12 17:00:00
368
原创 第 12 篇:极端场景下的系统韧性——离线退化与主备切换
系统韧性的最高境界不是"永不死机",而是"挂了知道,并且能用最小的代价活下来"。本文设计两个极端场景的应对策略:节点长期断网时如何自动收缩、主节点宕机时备节点如何毫发无伤地接管。
2026-07-12 08:54:01
307
原创 第 11 篇:优雅升级探针——先问“能停吗“,再动手升级
升级一个正在处理业务数据的模块,相当于"给正在比赛的跑车换轮胎"。直接停掉升级会丢数据,但无限等待又永远升不了。本文设计一套三阶段升级探针机制——让模块在"忙完这一段"后安全交接,实现升级过程业务零中断。
2026-07-11 15:00:00
248
原创 第 10 篇:Reconciliation Loop——持续对比期望与实际,自动修复一切偏差
部署清单赋予了模块一个"期望状态",状态机知道怎么把模块从"当前状态"迁移到"期望状态"。但谁来持续检查模块的实际状态是否发生了漂移?答案是 Reconciliation Loop——它是控制面的"免疫系统",5 秒巡检一次,发现异常立即修复。
2026-07-11 09:47:20
198
原创 第 9 篇:状态机实践——状态环 + 步进表替代 if-else 地狱
如果你没接触过状态机,先理解一个生活例子:一台洗衣机有 5 个状态:空闲 → 进水 → 洗涤 → 脱水 → 结束。它不能从"进水"直接跳到"脱水"——中间必须经过"洗涤"。状态之间的跳转是有限且固定的。外部事件(按下按钮)会触发状态变化,但前提是当前状态允许这个变化。你不可能在"洗涤"状态下打开舱门(安全锁限制),这就是 FSM 的规则保护。状态集合——系统可能处于哪些状态(洗衣机:空闲/进水/洗涤/脱水/结束)事件集合——什么信号触发状态变化(洗衣机:按开始/按暂停/定时结束)转换规则。
2026-07-10 20:24:30
25
原创 第 8 篇:部署清单驱动架构——用“期望状态“统一管理边缘节点上的一切
边缘节点上有几十个模块。它们该创建、该删除、该升级——由云端统一决策。但边缘网络不稳定,云端命令随时可能丢失。本文设计一套"主动拉取 + 全量 Diff + 事件分发"的架构,让边缘节点在任何网络条件下都能准确执行云端的意图。
2026-07-10 20:21:00
42
原创 第 7 篇:边缘安全纵深防御体系——从令牌到硬件加密的完整防线
攻击者可能绕过 JWT 认证(窃取合法令牌)、绕过 mTLS(入侵合法模块进程),但他无法绕过内核。在 Linux 5.4+(边缘节点的最低内核版本)上,eBPF 已经成为主流可用的生产级技术。
2026-07-07 21:11:31
28
原创 第 6 篇:模块自升级与自动回滚——空中换引擎
防止网络抖动误判。如果只检查 1 次,HTTP 刚好超时(可能是瞬时高负载),就错误触发回滚,导致不必要的版本切换。
2026-07-06 22:28:37
66
原创 第 5 篇:节点重启自愈——两阶段模块恢复机制
这是一个从血泪中总结的经验。从云端拉取最新部署清单对比上次的清单,生成需要创建/更新/删除的模块列表通过状态机驱动模块生命周期变更如果 DeployMaster 先启动,它正在"拉取清单→对比→决策",而 NodeCore 还在恢复其他模块——两边同时在操作模块,导致状态冲突。所以 NodeCore 先静默恢复所有模块(不动用部署清单,只用 SQLite),最后再启动 DeployMaster 让它接管控制权。
2026-07-06 22:09:46
29
原创 第 4 篇:策略模式实践——用统一接口管理 Docker 容器、原生进程与 K3s Pod
/ 模块管理器接口——所有部署形态都必须实现// 在容器/进程/Pod 内执行命令这个接口是最小能力契约——只定义了"所有部署形态都必须能做"的操作。像这种只有 Docker 支持的操作,不放在接口里,调用方通过类型断言单独处理。
2026-07-05 18:38:07
74
原创 第 3 篇:节点自动化纳管——从裸机到可管理的 7 步安装流水线
preConfig 是写在节点本地的一个 JSON 文件,在出厂时预置。字段作用node_id节点唯一标识,全局唯一,由管理平台生成一次性验证码,用来向云端证明"我是合法的节点",用后失效云端管理 API 的地址和端口project_id项目 ID,用于多租户隔离。
2026-07-05 18:27:00
43
原创 第 2 篇:MQTT 协议深度解析——物联网通信为什么选它
别急着写业务代码。不理解 MQTT,后面所有关于消息路由、流控、离线缓存的设计你都会觉得"为什么这么绕"。本文带你从第一性原理吃透 MQTT,并写一个最小可运行的 Go Broker 嵌入你的边缘系统。
2026-07-04 14:12:50
516
原创 第 1 篇:开篇|物联网边缘计算的真实挑战与云边端架构全景
本文是整个系列的总纲。读完你会理解:为什么需要边缘计算平台、它要解决哪些传统云架构解决不了的问题、以及一个完整的边缘计算平台长什么样。
2026-07-04 13:33:42
201
原创 小白也能懂的 DDD(领域驱动设计):从“写代码“到“设计系统“的思维升级
领域就是一个业务问题域,是你要解决的特定业务范围。系统领域电商系统用户管理、商品管理、订单管理、支付管理、物流管理、营销管理医院系统挂号、诊疗、药品管理、收费、病案管理内容平台创作管理、审核管理、推荐分发、评论互动、数据分析每个领域有自己的规则和语言。在订单领域,“下单”“退款”"发货"有明确含义;在药品领域,“处方”“配药”"发药"又是另一套语言。一句话:领域 = 一个业务问题域,有自己独特的规则、概念和语言。一致性边界。
2026-07-03 18:43:21
236
原创 LangGraph 进阶:ReAct 模式——为什么 LLM 需要“思考+工具调用“?
tool"""执行数学计算并返回结果"""return f"计算结果:from langchain_core . tools import tool @tool def calculator(expression : str) - > str : """执行数学计算并返回结果""" return f"计算结果: {
2026-06-24 19:02:18
290
原创 LangGraph 进阶:Supervisor 模式——让 LLM 当项目经理,动态调度多 Agent 协作
一个 LLM 驱动的 Supervisor 节点,每次审视全局状态,动态决定下一步子 Agent 干完活回到 Supervisor,通过循环边实现"回来报告 → 重新决策"防止死循环——这是不确定性把关的关键子 Agent 接口统一为,新增 Agent 只需加一个节点 + 一条边思考模型别用——手动 JSON 解析三步兜底更可靠从"你定规则,模型执行"到"你定边界,模型决策"——这正是 AI Agent 从工具走向协作者的关键一步。项目地址。
2026-06-24 18:42:50
249
原创 LangGraph 实战 Demo7:反思式多Agent协作 — 让AI学会“自我审视与迭代“
这个模式的核心不是"多Agent"(多角色分工只是手段),而是。
2026-06-24 17:17:37
355
原创 LangGraph 入门实战:6个企业级Demo带你从零搞懂工作流编排
本文通过6个递进式企业级Demo,从零讲解LangGraph框架的核心原理与实践。LangGraph通过流程图式设计,将不可控的大模型应用收敛为可回溯、有状态的标准化流水线。文章首先阐释LangGraph的核心设计理念(状态管理、节点函数、条件路由),随后通过6个由浅入深的案例:客户意图分类路由→串行流水线→人机审批交互→RAG记忆会话→循环纠错→并行Map-Reduce,系统演示如何用StateGraph构建企业级AI工作流。每个案例均提供可运行代码,重点展示状态传递、条件分支、循环控制、并行处理等关键机
2026-06-22 23:15:11
571
原创 Go 企业级工程能力实战(14):一个 Makefile 搞定编译、测试、迁移、交叉编译
本文以开源项目 user-service 为例,探讨如何用 Makefile 管理 Go 项目的全生命周期。文章首先通过新同事的环境配置问题,指出当前 Go 项目构建工具分散的痛点,提出 Makefile 作为统一的解决方案。随后从概念层面解释了 Makefile 的增量构建机制及其对 Go 项目的适用性,并对比了 Makefile 与其他构建工具的优劣势。 文章通过渐进式演进展示了 Makefile 的设计过程:从最简单的 go build 到完整的构建系统,详细拆解了 28 行 Makefile 代码中
2026-06-21 15:10:25
20
原创 Go 企业级工程能力实战(13):GORM 用得好是 ORM,用不好是 ORZ——生产环境避坑指南
本文基于开源项目 user-service 的实际代码,总结了 GORM 在生产环境中的 7 个常见问题和最佳实践。文章从一个慢查询引发的雪崩案例出发,详细分析了 GORM 连接池默认配置的危险性,并给出了合理的参数建议(MaxIdle≈MaxOpen/4、MaxLifetime=1小时)。针对复杂查询场景,作者对比了 GORM Builder 和 Raw SQL 的优劣,指出对于 JOIN 等复杂查询,Raw SQL 在性能可预测性、可读性和维护性上更具优势。文章还分享了连接重试机制、K8s 环境下连接管
2026-06-21 13:43:02
23
原创 Go 企业级工程能力实战(12):服务下线不丢一个请求——优雅关闭从原理到实战
-quit考量点实践代码超时 vs K8s 超时代码 10s < K8s 30s,留出安全余量数据库连接避免连接泄漏日志缓冲区确保日志完整落盘链路追踪flush 未发送的 trace span错误处理区分(预期)和其他错误(异常)服务发现K8s Service 自动摘除 / 外部注册中心需主动 deregister数据库迁移initContainer 独立执行,不参与优雅关闭记住这个公式:捕获信号 → 停止接新 → 等现有完成(设超时)→ 关 DB → sync 日志 → 退出。
2026-06-21 13:19:07
48
原创 Go 企业级工程能力实战(11):一个 JSON 响应的进化史——从 {“ok“:true} 到企业级信封
在开始改造之前,我们先搞明白一个核心概念:什么是我说的"信封"(Envelope)?发现"裸奔"方式无法做日志审计后,我们在统一了结构体定义和日志记录,每次返回都会自动写入日志。使用的是原生,而项目基于 Gin 框架没有与 HTTP 状态码做智能映射(错误时总是返回 200)分页场景没有专门的封装错误日志里没有 trace_id、span_id 等链路追踪信息ok {return err // 已标记的错误,放心返回。
2026-06-21 12:38:22
59
原创 Go 企业级工程能力实战(10):用 Geohash 实现“附近的人“——地理围栏算法实战
Geohash 的设计哲学是"降维"——把一个二维的空间搜索问题,降维成一维的字符串前缀匹配问题。层级做法工程价值编码注册/更新时用生成 8 位 geohash一次计算,永久存储索引LIKE 前缀查询走 B+Tree 索引查询精确到 1.2km 的空间过滤过滤5 个 NOT-IN 子查询在数据库层面完成社交关系过滤精度可调查询精度 1-12 由客户端传入一个接口支持多种搜索半径在。
2026-06-21 12:26:03
180
原创 Go 企业级工程能力实战(9):14 个中间件如何串成一条请求流水线
是 Gin 内置的全局 panic 恢复机制。无论内层哪个中间件或业务函数 panic,它都能兜底。如果 Recovery 放在内层,外层中间件 panic 是无法被捕获的。所以它必须是第一层。我们通过三个例子掌握技巧。14 个中间件,像是请求在进入服务核心之前的 14 道安检。Recovery(兜底)→ Gzip(压缩)→ RequestID(身份证)→ CORS + SecurityHeaders(安全边界)→ ContentType(输入校验)
2026-06-21 11:53:40
224
原创 Go 企业级工程能力实战(8):Redis 不只是缓存——分布式限流、在线心跳与分布式锁从零实现
Redis 在场景Redis 能力关键命令解决什么问题分布式限流原子计数器INCREXPIRE多实例共享限流计数在线心跳带 TTL 的状态存储SETEX高频写入 + 自动过期 + 批量查询分布式锁(扩展)互斥锁SETNXEXPIRE+ Lua 脚本多实例下资源互斥(库存扣减/定时任务去重)接口抽象Limiter接口让内存和 Redis 两种实现无缝切换,调用方完全不感知优雅降级:Redis 不可用时自动回退到内存方案,服务不崩溃,只是限流精度下降做减法。
2026-06-21 11:02:55
286
原创 Go 企业级工程能力实战(7):不只是“加好友“——社交关系系统的表设计与状态机
表设计:friends 双向存储(空间换时间),friend_requests 带状态枚举(软状态机),blacklist 独立表(职责单一)唯一索引:在数据库层面防止重复发送 pending 请求状态机流转:pending → accepted/rejected,每个状态变更前校验"当前是否 pending"反向 pending 自动接受:双向意愿直接建好友,减少用户操作黑名单三拦截点:GetUser、SendFriendRequest、NearbyStrangers 各司其职。
2026-06-21 10:35:20
299
原创 Go 企业级工程能力实战(6):Docker → Compose → K8s → Helm——部署进化四步曲
部署从不是"把代码丢到服务器上"那么简单。它是一个逐步抽象复杂度的过程阶段解决问题工程价值Docker环境一致性“我的机器上能跑"变成"任何机器上都能跑”Compose本地编排一键启动 MySQL+Redis+应用+迁移K8s生产级运维自愈、扩缩、滚动更新、安全隔离Helm配置管理模板化消除环境差异,版本化支持回滚在这条进化之路上,多阶段构建—— 镜像从 800MB 瘦到 20MBmigrate 子命令—— 同一个二进制,跑服务,跑迁移—— 多实例环境下只执行一次数据库迁移三探针分工。
2026-06-21 10:18:43
413
原创 Go 企业级工程能力实战(5):日志、指标、链路追踪——可观测性三件
Prometheus 默认不会暴露数据库连接池的指标。项目在中实现了一个自定义的Collector。在db *sql.DBmaxOpenDesc *prometheus.Desc // 最大连接数配置openDesc *prometheus.Desc // 当前打开的连接数inUseDesc *prometheus.Desc // 正在使用的连接数idleDesc *prometheus.Desc // 空闲连接数。
2026-06-21 10:12:14
270
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅