第十六章 高并发数据接入:物联网协议解析与百万连接调优

为什么要使用Go语言?Go语言的优势在哪里? 链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 Go语言之所有越来越受到开发者的欢迎,我认为与其超高的实用价值密不可分。要知道Go语言是为了解决现实问题而设计的,而不是为了学术理论和人工智能思想。Go是一个务实的编程语言,对于写一个充分利用并发的高效软件系统,Go的构建并发功能给予你一个令人兴奋的编程体验。 为什么要使用Go语言? 原因很简单:部署简单、并发性好、... 阅读详情

第十六章 高并发数据接入:物联网协议解析与百万连接调优

本章导读:第十章从业务维度讲了OT数据怎么接进来,本章则从纯底层技术视角深入另一个维度——当几十万台IoT终端同时往平台灌数据,网关怎么扛住? 我们从线程模型困境出发,讲清楚为什么选Go语言而非Java来写数据接入网关,如何用epoll+协程实现百万级并发长连接,以及MQTT/OPC UA/Modbus等工业协议的统一解析框架。这是全书技术浓度最高的一章之一,面向有系统编程经验的读者。

​ 在平台的架构蓝图中,如果说业务中台是大脑,那么物联网(IoT)数据接入网关就是整个系统的"咽喉"。每天,来自多个厂区的数万个传感器、数十万个数据测点,都在持续不断地向运营平台发送实时心跳与工艺数据——从反应釜的毫秒级温度波动,到管廊阀门的开关状态,再到可燃气体检测仪的实时读数,这些数据构成了化工生产的"数字脉搏"。

​ 面对如此庞大的数据洪流,传统的 Web 架构如同用普通水管承接洪水,不仅吞吐能力不足,更易因连接管理、协议解析、资源调度等问题引发系统崩溃。我们需要一个极度轻量、高吞吐且坚如磐石的网关底座。在这一章,我们将全面复盘基于 Go 语言构建 MQTT 百万级接入网关的全过程,从架构选型的底层逻辑,到 Linux 内核的极致调优,再到协议解析的性能突破与工业场景的适配落地,拆解这场跨越技术栈与工业现场的硬仗。

一、架构选型:从"线程困境"到"协程红利"

1. 传统架构为何扛不住

​ 在百万级长连接的工业 IoT 场景下,传统架构的短板被无限放大,核心问题集中在三点:

  • 内存的硬上限: 以 Java 为代表的"一线程一连接"模型,线程栈默认占用 1MB 内存。单机要维持 100 万个连接,仅线程栈就需消耗近 1TB 内存——这对于物理内存通常在 256GB 以内的服务器而言,是无法逾越的物理瓶颈。
  • 资源调度的低效: 化工传感器的工作特性具有极强的"非均匀性"——多数设备每分钟仅上报 1-2 次状态,少数高频测点(如反应釜压力)每秒上报数十次。传统线程模型中,即便连接处于"静默期",线程仍会占用 CPU 调度资源,导致大量算力被空耗。
  • 边缘部署的高门槛: 化工园区的边缘网关多部署在嵌入式设备或低配置工控机上,Java 的 JVM 等重型运行时对资源要求太高,无法适配边缘侧的轻量化部署需求。

2. 为什么是 Go

​ 我们最终选择 Go 语言,并非跟风追新,而是其全栈特性与工业 IoT 场景深度契合:

  • Goroutine 的极致轻量: Goroutine 初始栈仅 2KB,且支持动态扩缩容,理论上 1GB 内存可支撑 50 万个以上协程并发。单台 64GB 内存的服务器,仅协程层面就能支撑数百万连接。更关键的是,Goroutine 的调度由 Go 运行时(GMP 模型)自主管理,无需陷入内核态的线程调度开销,在海量轻量任务下的调度效率是传统线程的数十倍。
  • epoll 的静默高效: Go 的 net 包深度封装了 Linux 的 epoll 多路复用机制,实现了"事件驱动"的连接管理。当传感器处于静默期时,对应的 Goroutine 会被挂起,不占用 CPU 时间片;只有当网卡收到数据包时,epoll 才触发事件,调度器精准唤醒对应协程。这种机制让网关在维持 100 万个长连接时,CPU 空闲率仍能保持在 60% 以上。
  • 编译型语言的部署优势: Go 编译为机器码,无需解释器或虚拟机,启动速度毫秒级,运行效率接近 C/C++,且编译后的二进制文件无依赖,可直接部署在边缘网关的嵌入式 Linux 系统中,完美适配"中心-边缘"一体化架构。

二、百万连接的操作系统调优:从内核深处打硬仗

​ 让代码跑起来只是起点,要让单台服务器稳定承载 100 万个 MQTT 长连接,核心在于突破 Linux 内核的默认限制——这些限制是为通用场景设计的,完全无法适配工业 IoT 的极端并发需求。

1. 突破文件描述符的双重限制

​ Linux 中"一切皆文件",TCP 连接、套接字均占用文件描述符(FD),其限制分为两层:

  • 进程级限制: 默认 ulimit -n 为 65535,仅能支撑约 6 万个连接。我们通过修改 /etc/security/limits.conf,将进程级 FD 上限设为 1048576(100 万+),并为网关进程设置专属的 systemd 服务配置,确保进程重启后参数不丢失。
  • 系统级限制: fs.file-max 是内核允许的全局 FD 总数,我们将其修改为 10000000(1000 万),并同步调整 fs.nr_open,确保进程级限制不被内核阻断。

​ 隐藏坑点:nf_conntrack 连接追踪的致命影响

​ Linux 防火墙的 nf_conntrack 模块会追踪所有 TCP 连接状态。在百万 MQTT 连接场景下,连接追踪表会被瞬间填满,表现为"端口可通但新连接建不上"。我们针对 MQTT 端口直接禁用连接追踪:iptables -t raw -A PREROUTING -p tcp --dport 1883 -j NOTRACK,彻底释放内核资源。

2. TCP 内存的精细化管控

​ 百万连接的最大内存压力并非来自应用层,而是 TCP 读写缓冲区。默认情况下,Linux 为每个 TCP 连接分配的缓冲区最大 6MB,100 万个连接的缓冲区总占用可达数 TB,直接触发 OOM。

​ 我们基于化工 MQTT 报文的特性(单报文仅几十至几百字节),进行极致压缩:

# /etc/sysctl.conf
net.ipv4.tcp_rmem = 1024 2048 4096  # 读缓冲区:最小1KB、默认2KB、最大4KB
net.ipv4.tcp_wmem = 1024 2048 4096  # 写缓冲区:同上
net.core.rmem_default = 2048
net.core.wmem_default = 2048
net.ipv4.tcp_moderate_rcvbuf = 0    # 关闭自动调优,防止内核扩容缓冲区

​ 同时调整 net.ipv4.tcp_mem,将其最小值、默认值、最大值分别设为物理内存的 10%、20%、30%,确保 TCP 内存占用不超限。

3. 内核调度与网络参数的协同调优

  • TCP 超时参数: 化工园区网络存在抖动,我们设置 tcp_keepalive_time=60(60秒探活)、tcp_keepalive_intvl=10(10秒重试)、tcp_keepalive_probes=3(3次失败断连),兼顾及时性与稳定性。
  • 调度策略: 网关进程设为 SCHED_RR(实时轮转)优先分配 CPU;关闭 NUMA 交错访问,避免跨节点内存延迟。
  • 关闭干扰项: 禁用 SELinux、关闭 swap 分区、关闭 TCP 时间戳(tcp_timestamps=0),减少内核额外开销。

4. 对抗 Go GC 风暴

​ Go 的 GC 采用"标记-清除"算法,在海量数据高频接入时,频繁创建和销毁协议解析对象会导致 GC 超负荷运转,引发数百毫秒的 STW(Stop The World)停顿——这对于要求毫秒级响应的工业告警来说是致命的。

​ 我们的优化分为三层:

  • sync.Pool 构建对象池: 针对 MQTT 报文结构体、JSON 解析对象等核心对象,通过 sync.Pool 实现循环复用:
var mqttMsgPool = sync.Pool{
    New: func() interface{} {
        return &MQTTMessage{
            Topic:   make([]byte, 0, 128),
            Payload: make([]byte, 0, 512),
            QoS:     0,
        }
    },
}

// 获取对象
msg := mqttMsgPool.Get().(*MQTTMessage)
// 使用后重置并放回
msg.Reset()
mqttMsgPool.Put(msg)
  • 字节切片预分配与复用: 将常用的 512 字节、1024 字节切片提前创建并放入池中,使用时直接取出,用完后清空复用,避免频繁 make([]byte, n) 分配内存。
  • 杜绝隐式分配: 禁用 fmt.Sprintf(隐式创建字符串),改用 bytes.Buffer 拼接;使用值类型而非指针类型传递小对象。最终网关的 GC 触发间隔从"每秒数次"提升至"每分钟 1-2 次",STW 控制在 10 毫秒以内。

三、协议解析:从"能解析"到"高性能 + 标准化"

​ 在集团的工业接入方案中,车间级的边缘网关已做了一层预处理,将底层晦涩的 Modbus/OPC UA 工业协议统一转换为轻量、可读性强的 JSON 格式,再通过 MQTT 推送给中心网关。表面上看,中心网关只需做简单的"JSON 反序列化"即可。但在实际压测中,这个看似不起眼的动作,却成了横亘在百万并发面前的一块巨大暗礁。

1. JSON 解析性能瓶颈:反射的隐形开销

​ Go 标准库 encoding/json 高度依赖反射(Reflection)机制在运行时动态推断数据类型。在每秒几百条消息时毫无问题,但当并发量飙升到十万级时,海量的反射计算会瞬间榨干 CPU,同时产生堆积如山的临时对象,直接引爆 GC 风暴。

​ 我们果断"封杀"了标准库,采用双重替换方案:

  • easyjson(代码生成): 针对固定格式的 JSON 报文,编译期直接生成字段读写逻辑,完全避免反射,解析性能提升 5-10 倍。
  • json-iterator(优化适配): 针对少量动态格式报文,兼容标准库 API,底层优化了反射逻辑,性能提升 3-5 倍。

​ 结合 sync.Pool 的对象复用,我们实现了近乎"零内存分配"的解析流程:从字节切片池取出预分配的切片 → 用预编译的 easyjson 代码将字节流直接映射到复用的内存地址 → 解析完成后清空放回。单条报文的解析时间从"毫秒级"硬生生压榨到了"微秒级"。

2. 数据标准化:从"方言"到统一资产模型

​ 神木煤化工、北元化工等下属企业采购的 DCS/PLC 系统来自不同的供应商(霍尼韦尔、横河、中控)。A 厂上报的锅炉温度字段叫 Boiler_T1,B 厂可能叫 WD_01,C 厂甚至用 Temperature_Reactor_001。如果直接放任这些"方言"进入后台的大数据平台,后续的数据建模将完全无法开展。

​ 我们构建了"三级映射"的协议解析字典:

  • 一级映射(设备标识关联): 基于设备 MAC 地址、MQTT Topic(如 /factory/shenmu/boiler/01)或 SN 码,匹配设备所属园区、车间、设备类型。
  • 二级映射(字段名标准化): 内置集团《技术规范白皮书》的统一资产模型(如 boiler_temperature、reactor_pressure),将原始字段名映射为统一名称。
  • 三级映射(数据格式归一): 统一数据单位(温度℃、压力 MPa)、数据类型(浮点数保留2位小数、布尔值0/1)、时间戳格式(UTC+8 毫秒级)。

​ 映射字典采用"热更新"设计:通过配置中心下发映射规则,网关无需重启即可加载新规则。当新园区接入时,运维人员只需在配置中心添加该设备的字段映射规则,网关即可自动完成"方言"到"普通话"的转换。

3. 异常报文的容错处理

​ 工业现场的传感器可能因硬件故障、网络抖动发送畸形报文。我们设计了"轻量校验 + 降级处理"机制:

  • 格式校验: 仅校验 JSON 首尾的 {}、字段数量等基础格式,避免全量解析的性能开销。
  • 值范围校验: 基于设备类型预设合理范围(如温度 0-500℃、压力 0-10MPa),超出范围标记为"异常值",保留数据但标注状态。
  • 降级存储: 完全无法解析的报文,将原始字节流存入临时队列,定时上报异常数据平台,供运维排查,确保数据不丢失。

四、MQTT 协议的工业适配:QoS 分级与 LWT 防抖

​ MQTT 协议的轻量性天然适配 IoT 场景,但化工园区的网络环境具有天然的脆弱性——密集的金属反应塔、纵横交错的管廊构成了巨大的"法拉第笼",即便有 5G 专网加持,强电磁干扰和物理遮挡引发的无线网络抖动也难以完全避免。在这种严苛环境下,通信协议必须无条件为生产安全服务。

1. QoS 分级:基于业务重要性的差异化传输

​ 在拥有百万级测点的 OT 场景下,如果所有数据都要求确认到达,网关的吞吐量将被海量的 ACK 报文彻底拖垮。我们摒弃"一刀切"的配置,基于业务重要性严格分级:

  • QoS 0(最多一次)——高频非关键数据: 适用于反应釜每秒的温度/压力微小波动、车间环境温湿度等。这类数据的核心是"趋势分析",即便丢失 1-2 帧也不影响大盘研判。网关只管发送、不等待 ACK,吞吐量提升 30% 以上。
  • QoS 1(至少一次)——安全关键数据: 适用于可燃气体泄漏预警、压力超阈值报警、阀门控制指令等。这类数据生死攸关,必须确保送达:网关发送报文后等待 ACK,超时 5 秒未收到则启动指数退避重传(1秒→2秒→4秒,最大5次),若仍失败则触发网关本地告警。
  • QoS 2(恰好一次)——极简使用: 仅用于"设备参数配置下发"(如修改反应釜安全阈值),避免重复配置导致生产事故。由于开销较大,我们通过"配置编号+幂等处理"结合 QoS 1 实现等效效果,仅在极特殊场景下启用。

2. 遗嘱消息(LWT):从秒级感知到三级防抖

​ 在厂区内,如果一台关键设备的边缘网关因意外断网,依靠传统的"心跳超时"轮询往往有几分钟的滞后。MQTT 的遗嘱消息(LWT)机制可实现秒级感知——一旦网络发生非正常物理中断,中心 Broker 会立刻代替该设备向平台广播遗嘱。

​ 然而,“秒级感知"在真实的 5G 园区中也会带来副作用:基站切换或瞬间干扰导致的"网络闪断”(通常 1-5 秒)十分常见。如果每次闪断都直接派发报警工单,维修团队很快就会陷入"狼来了"的疲劳期。为此,我们设计了"三级防抖"机制:

  • 一级防抖(15秒缓冲期): 接收到 LWT 后,设备状态变为"失联确认中"(橙色),启动 15 秒倒计时。若设备在 15 秒内重连恢复心跳,自动撤销;超时未重连则标记为"失联"(红色)。
  • 二级防抖(多维度验证): 仅依赖 LWT 易误判。我们结合"边缘网关心跳"“传感器数据上报”"网络链路检测"多维度验证:若仅 LWT 触发但边缘网关仍在上报心跳,判定为 MQTT 连接闪断,不触发报警;若 LWT 触发且边缘网关心跳中断,才进入缓冲期。
  • 三级防抖(分级报警): 设备确认失联后,先触发"园区级告警"(推送给园区运维),若 5 分钟未恢复,升级为"集团级告警"(推送给集团调度中心)。对非关键设备(如普通温湿度传感器),缓冲期延长至 30 秒,降低报警频率。

​ 这种**“底层极致敏锐、上层适度包容”**的设计,才能真正贴合工业现场。

五、应对"数据海啸":惊群效应的全链路治理

​ 尽管我们在内核调优上下足了功夫,但在系统上线初期的"全厂断电演练"中,我们还是吃了一个大亏。

​ 当全厂恢复供电时,数万个网关和传感器在同一秒钟内疯狂发起重连,并试图补发断网期间积压的离线数据。这种被称为**“惊群效应(Thundering Herd)”**的数据海啸,瞬间击穿了网关层——CPU 100%、连接数骤降、数据大面积丢失,引发了整个平台的级联雪崩。这场事故让我们意识到:百万级网关的稳定性,不仅依赖单点优化,更需全链路的流量控制与数据兜底。

1. 中心侧:背压控制与流量削峰

​ 我们引入"令牌桶 + 优先级队列"的限流机制:

  • 令牌桶限流: 单节点设置安全水位(80 万并发),令牌桶每秒生成固定数量的"连接令牌"和"数据令牌",设备重连或上报数据时需先获取令牌,无令牌则拒绝。
  • 指数退避重试: 被限流的设备按指数退避策略重试(1秒→2秒→16秒,最大60秒),避免反复重试加剧拥堵。
  • 优先级队列: 将数据分为"告警数据(最高级)"“控制指令(高级)”“工艺数据(中级)”“心跳数据(低级)”,限流时优先放行高优先级数据,确保安全相关数据不丢失。

2. 边缘侧:断点续传与本地兜底

​ 当中心网关为了自保而拒绝重连时,那些被拒收的工艺数据(如锅炉温度、反应釜压力)绝不能就此丢失。边缘网关是数据的"最后一道防线":

  • 本地轻量级存储: 采用嵌入式时序数据库(如 InfluxDB Edge)或磁盘队列(LevelDB),当上行链路断开/限流时,自动转存传感器数据到本地,存储周期可配置(默认 7 天)。
  • 断点标记: 每条数据携带唯一的时间戳+设备 ID 作为断点标记,中心网关记录已接收的最新标记。边缘网关重连后,对比标记,仅补发未接收的历史数据。
  • 限速重放: 边缘网关补发数据时,按中心网关的限流阈值(如每秒 100 条/设备)缓慢上报,带有历史真实时间戳,避免再次引发流量洪峰,同时确保整个集团数字大盘的最终一致性。

3. 集群侧:负载均衡与故障转移

​ 单节点的承载能力有限,我们构建了网关集群:

  • 一致性哈希负载均衡: 基于设备 ID 做一致性哈希,将同一设备的连接固定到某一节点,避免连接频繁迁移导致的状态丢失。
  • 故障转移: 当某节点崩溃时,设备连接自动迁移到其他节点,迁移过程中边缘网关的本地缓存确保数据不丢失。
  • 弹性扩容: 通过 Prometheus 监控集群的连接数、CPU、内存等指标,当负载超过 70% 时,自动触发容器化网关的弹性扩容(基于 K8s),快速承接流量。

六、深度复盘:百万级网关的核心启示

​ 打造百万级并发的工业 IoT 接入网关,从来不是单纯的代码比拼,而是一场跨越操作系统内核、网络通信协议与工业现场物理环境的综合战役。我们的核心启示有三点:

1. 架构选型必须贴合场景本质

​ Go 语言的胜出,并非因为"技术新潮",而是其协程模型、epoll 封装、轻量化部署的特性,精准匹配了"百万长连接、高频小报文、边缘-中心一体化"的工业 IoT 场景。反之,若盲目追求"高性能语言"(如 C++),会增加开发与维护成本;若沿用传统 Web 架构(如 Java Spring Boot),则无法突破线程与内存的瓶颈。

2. 性能优化需"从内核到应用"全栈思考

​ 百万连接的瓶颈往往不在应用层,而在操作系统内核(FD、TCP 内存、nf_conntrack)。我们的调优路径是"先突破内核限制,再优化应用层资源,最后适配业务场景"——若仅优化代码而忽略内核参数,再高效的代码也会被系统"卡脖子";若仅调优内核而忽略业务适配,系统虽稳定但无法满足工业生产的安全与可用性要求。

3. 工业场景的"稳定性"优于"极致性能"

​ 化工生产的核心诉求是"安全、稳定、可用",而非单纯的"高并发、高吞吐"。QoS 分级并非追求最高传输效率,而是在"不丢关键数据"与"不堵非关键数据"之间找到平衡;LWT 防抖并非弱化断连感知,而是避免无效报警影响生产运维;断点续传并非增加系统复杂度,而是确保数据的最终一致性——所有技术优化,最终都要回归"服务生产"的本质。

结语

​ 从单节点支撑 10 万连接到稳定承载百万连接,从频繁的 GC 风暴、内核崩溃到 7×24 小时无故障运行,我们的物联网网关建设过程,是一场对工业场景、操作系统、编程语言的深度磨合。Go 语言的轻量级并发为我们打下了架构基础,Linux 内核的极致调优突破了系统瓶颈,而针对化工生产的业务适配,则让技术真正落地为生产力。

​ 通过边缘侧的断点兜底,我们为集团铺设了一条坚不可摧的数据高速公路。而这条高速公路上奔涌的海量数据,将如何被妥善存储、如何在百亿级的数据湖中实现毫秒级追溯?这正是下一章——百亿级监测数据混合存储——要回答的问题。

go实现mqtt、golang实现物联网、go实现物联网MQTT、IoT 一、创建MQTT平台服务 免费创建网址:https://cloud.emqx.cn/console/deployments/0?oper=new 或者使用开放免费: broker: broker.emqx.io port: 1833 ClientID: go_mqtt_client Username: emqx Password: public 二、实现方式(支持 mqtt、mqtts、ws、wss)协议 案例1: package main import ( "fmt" "sync" "time" 阅读详情

相关推荐

Go 语言数据库事务详解:从 db.Begin 到 Tx 的正确用法

本文详解Go语言中database/sql事务的正确用法,从*sql.Tx的底层模型出发,阐述事务与连接池的关系,提供标准事务模板,并强调使用db.BeginTx控制隔离级别与超时。重点剖析常见陷阱:误用db而非tx执行SQL、defer顺序错误、忽略Commit错误、事务过长导致资源耗尽等。结合可运行示例,涵盖事务内查询、预处理语句及保存点模拟嵌套事务,全面覆盖工程实践中的关键细节。

u011175571的博客 498

突破百万级设备连接:Go语言构建高并发物联网平台的实战指南

| 特性 | 传统物联网平台 | go-iot-platform | 优势说明 | |------|--------------|----------------|---------| | 并发连接数 | 数万级 | 百万级 | 采用Go语言的goroutine机制,资源占用低,并发处理能力强 | | 响应延迟 | >100ms | ...

gitblog_01401的博客 748

从零开始学习 Go 1.25 编程

今天是你新生活的第一天,无论年龄、背景如何,改变从这一刻开始。CodeGym帮助成千上万普通人转型为程序员,从零基础到掌握Go语言,完成真实项目,甚至入职心仪岗位。Go语言简洁高效,适合服务器端开发,是云基础设施、微服务和高负载系统的首选。2026年正是入行良机,你的经验反而是优势。别犹豫,迈出第一步,你将收获技能、自信与全新人生。🚀

sinat_25548781的博客 118

golang物联网_使用golang谷歌云平台和grafana监控物联网设备

golang物联网In this article, we’ll be setting up step by step, a monitoring environment for IoT devices with an Arduino based board (ESP32), Grafana, and Google Cloud Platform tools. We’ll be using other...

weixin_26716079的博客 2246

基于ARM9的物联网智能网关设计

以工业能源、资源计量和监测为背景,设计了一种基于和的工业 物联网网关设备。实现了多种协议的工业计量仪表的数据采集、本地存储和远传。本文 利用工业级微控制器芯片,通过引脚复用,实现了七路数据采集端口。 采用芯片加以有效的信号隔离、电源隔离措施,实现了串行端口到总 线的自动双工转换。 在网络传输方面,本文充分利用微控制器的以太网介质接入层控制器,通过 接口连接芯片,实现了的双工以太网通信。 本文对网关设备设计的讨论主要分三方面,分别是硬件电路的设计与实现、系统软 件的设计和应用层软件的设计。 网关设备的硬件部分主要包括微控制器、电源、日历、存储器、声卡、网卡、 接门、接门以及卡扩展槽等的原理分析和电路设计、板图的设计、制板及 硬件电路的调试。 系统软件方面采用作为引导加载程序,设了一个基于内核的嵌入式 操作系统并根据需要修改了部分驱动程序。操作系统采用制作了常用的系统工 具,并使用创建了根文件系统。 在系统的基础上,本文采用语言幵发了三种工业远传仪表规约的应用层 实现,利用和两种方式实现与服务器的通信并根裾国家的相关标准实现 了数据采集和远传。 最后,本文针对网关设备的功能,进行了部分测试,并对功能的扩展和进步测试 做出了展望。

高通 Gen AI 推理扩展 (GENIE)(5):实战指南与Engine API深度解析

本文深入解析高通Gen AI推理扩展(GENIE)的Engine API核心功能与实战应用,涵盖引擎实例化、多引擎动态切换、性能调优及跨平台部署等关键技巧。通过详细代码示例和性能数据,帮助开发者高效利用GENIE进行AI推理,提升应用性能与稳定性。

weixin_29065959的博客 465

最适合物联网开发的程序语言曝光

开发物联网应用时,选择合适的程序开发语言和选择合适的硬件平台一样重要。本文将会列出一些你可能会用到的语言,并有适当的应用场景分析;不过在你继续阅读之前,不妨试着来预测一下下面会出现哪些语言。   物联网现在是个大热门相信谁也不能否认,各种开发项目正如雨后春笋般出现在地球村的各个角落。不断出现的新硬件平台让工程师能够越来越容易地打造新的嵌入式设备。当你选择了其中的某一个硬件平台之后,你还需要为

lijiuyangzilsc的专栏 4291

Scrapy实现微博关键词爬虫(爬虫结果写入mongodb)

话不多说,上代码: spiders文件夹下的microBlogSpider.py里这样写: # -*- coding: utf-8 -*- import scrapy from scrapy import Spider, Request, FormRequest from scrapy.selector import Selector import datetime import random from blogSpider.items import microBlogItem, keyWordItem f

qq_39360565的博客 1780

为什么要用Golang开发物联网平台

如果你的预算比较少,可能你第一个要考虑用Golang。Golang的并发特性和出色的性能,可以充分的利用现有硬件,上手门槛比较低,开发效率也不逊色。

vividea的博客 8733

cocos2dx中DrawNode画线锯齿和非凸多边形填充

记录一下在cocos2dx中使用DrawNode所遇到的2个问题 1.画线锯齿问题 ios版本下,在AppController.mm中设置CCEAGLView的multiSampling和numberOfSamples。如下图 CCEAGLView *eaglView = [CCEAGLView viewWithFrame: [window bounds]

hello-world 5415

Kimi K3大模型API实战:从调用到本地知识库问答系统构建

大语言模型(LLM)作为人工智能的核心技术,通过海量数据训练获得理解和生成自然语言的能力。其工作原理基于Transformer架构,通过自注意力机制捕捉长距离依赖关系。这项技术的核心价值在于能够将非结构化文本转化为可计算、可交互的智能体,极大地提升了信息处理和自动化任务的效率。在应用场景上,大模型广泛应用于智能对话、代码生成、文档总结与问答等领域。其中,国产大模型如月之暗面推出的Kimi K3,凭借其在**长文本处理**和**中文场景优化**方面的优势,为开发者提供了新的技术选项。本文将以Kimi K3为例

weixin_30694389的博客 299

go语言的MQTT服务器(一)

go语言的MQTT服务器 这是一个通过对已经很久没有维护的项目https://github.com/zentures/surgemq进行二次开发的mqtt服务器 开发初衷 最初为了去了解学习mqtt,特在网上找了几个go语言的mqtt开源服务器,但是,不是运行有问题,就是协议支持不完善,好不容易找到这个,但是很久没有维护了。经过考虑,还是拿这个当做基础开发。 基础功能 支持 支持QOS 0、1和2...

qq_41257365的博客 7239

如何在Proteus中模拟Arduino

进一步的Proteus可用于设计任何与Arduino相关的项目,它将在进入硬件级别之前提供更好的理解。由于其广泛的库集合,它是Arduino社区中最受欢迎的工具之一,不仅如此,Proteus还可以为Arduino项目设计定制的PCB。就像上一步一样,现在搜索Arduino UNO板,选择Arduino板并单击“确定”以添加到项目中,或者双击以在Proteus项目中添加Arduino。一旦在Proteus中成功创建了一个新项目,现在我们将设计一个用于Proteus中闪烁LED的Arduino电路。

acktomas的博客 1万+

每天10分钟学Go:第5课 switch分支判断

本课程讲解 Go 语言 switch 分支判断核心用法,涵盖单值匹配、多 case 合并、无表达式条件分支、fallthrough 穿透与类型 switch 断言,搭配可运行代码示例,带你掌握 Go 分支结构语法与实战写法。

2501_94567985的博客 256

检索增强生成(RAG)、微调(Fine-tuning)与知识蒸馏(Knowledge Distillation):核心差异与技术选型指南

在自然语言处理(NLP)领域,大型预训练语言模型(如GPT、BERT系列)的崛起彻底改变了技术生态。面对实际业务场景中模型效果优化与资源效率平衡的永恒命题,开发者主要依赖三大技术路径:检索增强生成(Retrieval-Augmented Generation, RAG)、模型微调(Fine-tuning)和知识蒸馏(Knowledge Distillation)。本文将通过技术原理拆解、典型应用场景对比和实战选型策略三个维度,深入解析这三种技术的本质差异。

fudaihb的博客 1829

016、自动标注方案实战:用大模型(SAM/Grounding DINO)生成 YOLO 格式伪标签

本文介绍了一种利用大模型自动生成YOLO格式伪标签的实战方案。针对传统人工标注效率低、易出错的问题,作者提出结合Grounding DINO(零样本检测)和SAM(精细分割)的优势:前者快速生成候选框,后者优化边界精度。文章详细阐述了技术选型理由(平衡速度与精度)、环境搭建避坑指南(关键依赖版本)、核心三步流程(检测-分割-格式转换)以及后处理技巧(置信度分级过滤)。实验表明,该方案相比纯人工标注可节省80%时间,且经过SAM优化的边界框精度提升10-15%。特别强调了工程细节:文本描述格式、阈值设定、小目

zzfmlxs的博客 544

TinyGo 驱动 ESP32 端侧 AI 推理实战:纯 Go 实现轻量机器学习模型部署全流程

基于乐鑫官方 TinyGo 教程,从零实现纯 Go 语言开发 ESP32 端侧 AI 推理应用,覆盖环境搭建、模型转换到全流程部署。

嵌入式扫地僧 508

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

2026-11-11-Go分布式锁实战

线上偶发重复扣库存,查了半天是业务执行超过了锁的过期时间,锁提前释放,另一个请求拿到锁又执行了一遍。单机锁在多实例部署下失效,Redis SET NX PX 加锁、Lua 脚本原子释放、看门狗续期,这篇讲透分布式锁三大坑,附实现对照表和实战清单。

利威尔的博客,主要分享一些go后端,agent相关知识,都是最新最前沿而且是免费的,在我的专栏里有各种方向的详细分类和内容整理,详细内容请阅读主页置顶文章,希望对你有帮助。 294

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Go 泛型入门:类型参数、约束与 Map/Filter/Stack

掌握类型参数、约束、~ 与 union,写出通用 Map/Filter/Stack,并知道什么时候不该用泛型。

JudithHuang的博客 215

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

每天10分钟学Go:第1课 环境搭建与第一个Go程序

本号专注分享实战干货、避坑指南、性能调优、面试重难点, 每一篇都是亲手落地测试,帮你少走弯路、快速提升核心竞争力。5、将go程序构建成可执行的二进制文件:go build hello-world.go。3、编辑go文件写入程序:vim hello-world.go。4、运行go程序:go run hello-world.go。2、创建go文件:touch hello-world.go。1、创建项目目录:mkdir go-test261111。2、配置go环境变量。

2501_94567985的博客 116

day01-认识Go语言 + golang环境的安装

Go语言由Google开发,2009年发布,兼具编译型性能与脚本语言易用性。其优势包括运行快、语法简洁、跨平台构建、丰富标准库及原生并发支持(goroutine与channel),适用于微服务、区块链等场景。安装时需配置GOROOT(安装路径)、GOPATH(工作空间,含pkg和bin目录)及GOBIN,并将%GOROOT%\bin、%GOBIN%、%GOPATH%加入系统Path。通过命令行验证环境后,可使用GoLand等IDE进行开发,快速上手高效编程。

2301_77190282的博客 228

Go CPU 剖析的“地基“:信号、CAS、写屏障、无锁环形缓冲

本文通过“卡点自查表”梳理Go CPU剖析(cpuprof.go)中反直觉设计的底层逻辑,聚焦信号处理、CAS自旋锁、写屏障与无锁缓冲四大核心机制。指出所有设计皆源于信号处理器“不可阻塞、不碰堆、不持锁”的铁律,进而推导出:CompareAndSwap一次即走、环形缓冲无锁写入、预分配内存等策略的本质是向“在任意指令间被中断”这一事实妥协。结合多核并发与操作系统调度原理,揭示了高性能采样器如何在极端约束下实现低延迟、高吞吐。

不愿言弃-念何的博客 632

Go1.25 升级后 GoLand 调试提示【变量不可用】解决方案

顶部菜单Help→在弹出的配置文件中添加下面一行,路径替换为你本机 dlv.exe 真实路径Windows 路径使用正斜杠,不要用反斜杠保存配置文件,完全重启 GoLand(不是只重启调试会话)Go 大版本升级后,优先检查 Delve 兼容性,这是 Go1.24+、Go1.25 最常见的调试踩坑点。升级dlv + 指定dlv路径 + 关闭编译优化参数,90% 的“变量不可用”问题都可以解决。

关于代码的那些事 233
上一篇: 第十五章 GIS 深度应用:高精定位在化工安全中的实战落地
下一篇: 第七章 投资效益评价:如何构建智能工厂项目的成本模型与ROI闭环
我是李龙
博客等级 码龄16年 3粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值