[{"data":1,"prerenderedAt":800},["ShallowReactive",2],{"\u002Fblog\u002Findustrial-iot\u002Fsmall-iot-projects-do-not-need-complex-architecture":3,"blog-related-articles":420},{"id":4,"title":5,"author":6,"body":7,"category":403,"date":404,"description":405,"extension":406,"meta":407,"navigation":408,"path":409,"seo":410,"stem":411,"tags":412,"__hash__":419},"blog\u002Fblog\u002Findustrial-iot\u002Fsmall-iot-projects-do-not-need-complex-architecture.md","大多数中小型物联网项目，根本不需要复杂架构","星焰原点",{"type":8,"value":9,"toc":393},"minimark",[10,14,18,24,27,40,43,48,51,56,59,64,67,81,87,90,107,110,113,116,120,123,126,129,132,143,146,172,175,178,182,185,188,202,205,219,222,225,228,232,235,238,255,258,284,287,290,294,297,300,305,308,322,325,328,333,337,340,343,363,366,369,372,376,385,388],[11,12,5],"h1",{"id":13},"大多数中小型物联网项目根本不需要复杂架构",[15,16,17],"p",{},"说个可能不太受欢迎的观点：",[15,19,20],{},[21,22,23],"strong",{},"大多数中小型物联网项目，根本不需要复杂架构。",[15,25,26],{},"如果你经常浏览知乎上的物联网话题，可能会觉得：",[28,29,30,34,37],"ul",{},[31,32,33],"li",{},"物联网 = 云原生",[31,35,36],{},"物联网 = 微服务",[31,38,39],{},"物联网 = 高并发 + 分布式 + 时序数据库",[15,41,42],{},"但在真实项目里接过设备、处理过协议、经历过现场交付之后，我越来越确定：",[15,44,45],{},[21,46,47],{},"大量中小型物联网项目，真正需要的不是\"更复杂的架构\"，而是\"更贴近设备的系统\"。",[15,49,50],{},"这也是为什么，我倾向于采用：",[15,52,53],{},[21,54,55],{},"Java + Netty + PostgreSQL",[15,57,58],{},"以单体架构构建物联网底座。对于连接规模、消息频率和业务复杂度适当的项目，这种组合可以在保持系统简洁的同时，支撑相当规模的设备连接。具体承载能力仍需要结合设备行为、消息模型和目标硬件进行压测验证。",[60,61,63],"h2",{"id":62},"一一个容易被忽略的事实物联网的重心不只在云更在协议","一、一个容易被忽略的事实：物联网的重心，不只在云，更在协议",[15,65,66],{},"很多物联网讨论一开始就关注：",[28,68,69,72,75,78],{},[31,70,71],{},"平台功能",[31,73,74],{},"多租户",[31,76,77],{},"规则引擎",[31,79,80],{},"数据大屏",[15,82,83,84],{},"但如果真正参与过项目交付，就会发现：",[21,85,86],{},"设备能否稳定接入，往往是项目首先要解决的问题。",[15,88,89],{},"真实世界里的设备协议通常具有这些特点：",[28,91,92,95,98,101,104],{},[31,93,94],{},"私有协议较多",[31,96,97],{},"标准不统一",[31,99,100],{},"定长、TLV 或混合数据结构",[31,102,103],{},"上下行报文不对称",[31,105,106],{},"通信过程存在状态依赖",[15,108,109],{},"这意味着什么？",[15,111,112],{},"如果系统不能从 Byte 级别理解和处理数据，后续的平台能力就很难真正落地。",[15,114,115],{},"设备接入不是简单地接收一段\nJSON。很多时候，需要从原始字节流开始，逐层完成协议处理。",[60,117,119],{"id":118},"二为什么我坚持使用-netty因为协议不是-json而是字节流","二、为什么我坚持使用 Netty？因为协议不是 JSON，而是字节流",[15,121,122],{},"很多\"物联网快速方案\"默认了一个前提：",[15,124,125],{},"设备或网关已经完成协议处理，平台只需要接收 JSON 数据。",[15,127,128],{},"但在真实项目中，情况往往恰恰相反。",[15,130,131],{},"常见的数据处理链路是：",[133,134,140],"pre",{"className":135,"code":137,"language":138,"meta":139},[136],"language-text","TCP 字节流\n    ↓\n拆包 \u002F 粘包处理\n    ↓\n协议帧解析\n    ↓\n字段提取\n    ↓\n业务语义转换\n","text","",[141,142,137],"code",{"__ignoreMap":139},[15,144,145],{},"Netty 的价值在这里体现得非常直接：",[28,147,148,154,160,166],{},[31,149,150,153],{},[21,151,152],{},"ByteBuf","：能够精细控制字节数据的读取、写入和边界处理。",[31,155,156,159],{},[21,157,158],{},"Pipeline","：适合将解码、业务处理和编码拆分为清晰的处理阶段。",[31,161,162,165],{},[21,163,164],{},"非阻塞\nI\u002FO","：适合大量长连接场景，减少为每条连接分配独立阻塞线程的需要。",[31,167,168,171],{},[21,169,170],{},"线程模型清晰","：可以将网络 I\u002FO 与耗时业务处理合理分离。",[15,173,174],{},"这不是单纯的\"性能偏好\"，而是由问题模型决定的技术选型。",[15,176,177],{},"当核心工作是处理 TCP 连接、二进制协议和设备通信状态时，Netty\n提供了足够直接的控制能力。",[60,179,181],{"id":180},"三一个更容易引发争议的观点中小型物联网项目单体架构反而可能更稳定","三、一个更容易引发争议的观点：中小型物联网项目，单体架构反而可能更稳定",[15,183,184],{},"在很多技术讨论中，单体架构常常被贴上\"过时\"的标签。",[15,186,187],{},"但在物联网设备接入场景下，单体架构有一些天然优势：",[28,189,190,193,196,199],{},[31,191,192],{},"设备连接具有状态性",[31,194,195],{},"协议解析可能依赖连接上下文",[31,197,198],{},"设备反控通常关注响应延迟",[31,200,201],{},"设备状态变化频繁",[15,203,204],{},"如果过早拆分系统，可能带来额外成本：",[28,206,207,210,213,216],{},[31,208,209],{},"状态需要外置或同步",[31,211,212],{},"服务间调用链变长",[31,214,215],{},"故障定位和排查更加复杂",[31,217,218],{},"性能问题更难直接观察",[15,220,221],{},"而在 Netty 的事件驱动模型下，可以通过较少的 I\u002FO\n线程管理大量连接，并结合清晰的业务线程边界，减少不必要的线程切换和服务间通信。",[15,223,224],{},"对于连接规模和业务复杂度尚未达到拆分必要性的项目，单体架构往往更容易部署、调试和维护。",[15,226,227],{},"当然，单体并不意味着所有逻辑都堆在一起。模块边界、线程隔离、异常处理、资源管理和可观测性仍然重要。架构是否合适，最终应由真实负载和团队维护能力决定。",[60,229,231],{"id":230},"四为什么我没有一开始就使用时序数据库","四、为什么我没有一开始就使用时序数据库？",[15,233,234],{},"这是另一个经常被默认的问题。",[15,236,237],{},"但在大量中小型项目中，真实的数据需求通常包括：",[28,239,240,243,246,249,252],{},[31,241,242],{},"设备状态",[31,244,245],{},"事件记录",[31,247,248],{},"告警数据",[31,250,251],{},"简单统计",[31,253,254],{},"报表查询与导出",[15,256,257],{},"PostgreSQL 在这些场景中的能力，远比很多人想象得更强：",[28,259,260,266,272,278],{},[31,261,262,265],{},[21,263,264],{},"JSONB","：适合存储结构存在差异的半结构化数据。",[31,267,268,271],{},[21,269,270],{},"事务能力","：能够为关键业务数据提供成熟的数据一致性保障。",[31,273,274,277],{},[21,275,276],{},"索引与聚合","：可以支持常见的条件查询、统计和报表需求。",[31,279,280,283],{},[21,281,282],{},"运维生态成熟","：降低部署、维护和人员学习成本。",[15,285,286],{},"配合批量写入、异步持久化、合理的索引设计和数据归档策略，PostgreSQL\n可以覆盖不少中小型物联网项目的业务需求。",[15,288,289],{},"并不是所有设备数据都必须从第一天起写入专用时序数据库。是否引入专用存储，应当根据数据规模、写入频率、查询模式、保留周期和运维能力来判断。",[60,291,293],{"id":292},"五协议驱动而不是代码驱动","五、协议驱动，而不是\"代码驱动\"",[15,295,296],{},"在设备接入项目中，昂贵的往往不是服务器资源，而是反复为\"相似但略有不同的协议\"修改代码、测试和部署。",[15,298,299],{},"因此，在架构设计中，一个重要方向是：",[15,301,302],{},[21,303,304],{},"把可描述的协议差异抽象为配置模型，而不是把所有差异都写死在业务代码里。",[15,306,307],{},"这样做可以带来一些实际收益：",[28,309,310,313,316,319],{},[31,311,312],{},"将协议参数、字段映射和数据结构进行统一描述",[31,314,315],{},"减少相似设备重复开发的工作",[31,317,318],{},"让部分协议调整通过配置完成",[31,320,321],{},"让一套接入底座能够复用于多个项目",[15,323,324],{},"需要强调的是，并非所有私有协议都能完全配置化。遇到复杂状态机、特殊校验、加密算法或厂商私有交互逻辑时，仍然需要编写专用适配代码。",[15,326,327],{},"合理的目标不是消灭代码，而是把稳定、重复、可描述的部分沉淀为模型，把真正特殊的部分留给扩展机制。",[15,329,330],{},[21,331,332],{},"协议成为系统的一部分，而不是让每一次新协议适配都变成一次重复造轮子。",[60,334,336],{"id":335},"六现实结论不是-java-netty-不行而是技术选型必须回到真实问题","六、现实结论：不是 Java \u002F Netty 不行，而是技术选型必须回到真实问题",[15,338,339],{},"关于\"Java 是否适合物联网\"，很多争论容易停留在语言和框架的标签上。",[15,341,342],{},"但真实项目更关心的是：",[28,344,345,348,351,354,357,360],{},[31,346,347],{},"能不能接入现场设备？",[31,349,350],{},"私有协议能不能处理？",[31,352,353],{},"长连接能不能稳定维护？",[31,355,356],{},"资源受限的边缘环境能不能运行？",[31,358,359],{},"出现问题后能不能快速定位？",[31,361,362],{},"后续新增设备和调整协议的成本高不高？",[15,364,365],{},"技术选型不应该从流行架构出发，而应该从设备协议、通信模型、数据规模、部署环境和交付成本出发。",[15,367,368],{},"对于中小型、项目制物联网系统，Java + Netty + PostgreSQL\n是一套值得认真考虑的技术组合。",[15,370,371],{},"它并不意味着适合所有场景，也不意味着不需要演进。当连接规模、团队协作、业务边界或可用性要求发生变化时，系统仍然需要根据实际情况调整。",[60,373,375],{"id":374},"结语物联网不是比谁的架构复杂而是比谁更贴近设备","结语：物联网不是比谁的架构复杂，而是比谁更贴近设备",[15,377,55,378,381,382,384],{},[379,380],"br",{},"\n单体架构",[379,383],{},"\n协议驱动业务",[15,386,387],{},"这套组合并不追求技术时髦，而是强调从设备通信和真实交付出发，选择足够简单、可控、可维护的技术方案。",[15,389,390],{},[21,391,392],{},"架构不是越复杂越先进。能解决现场问题、能长期稳定运行、能让后续维护和扩展成本可控，才是有价值的架构。",{"title":139,"searchDepth":394,"depth":394,"links":395},2,[396,397,398,399,400,401,402],{"id":62,"depth":394,"text":63},{"id":118,"depth":394,"text":119},{"id":180,"depth":394,"text":181},{"id":230,"depth":394,"text":231},{"id":292,"depth":394,"text":293},{"id":335,"depth":394,"text":336},{"id":374,"depth":394,"text":375},"架构实践","2026-11-04","从真实设备接入与项目交付出发，讨论 Java、Netty、PostgreSQL 与单体架构在中小型物联网项目中的实践价值。","md",{},true,"\u002Fblog\u002Findustrial-iot\u002Fsmall-iot-projects-do-not-need-complex-architecture",{"title":5,"description":405},"blog\u002Findustrial-iot\u002Fsmall-iot-projects-do-not-need-complex-architecture",[413,414,415,416,417,418],"工业物联网","Java","Netty","PostgreSQL","单体架构","设备协议","YscjlchnQjqvm41RqTil3DRb-4J1p4TEOguz0nlG1bM",[421,530],{"id":422,"title":423,"author":6,"body":424,"category":413,"date":404,"description":521,"extension":406,"meta":522,"navigation":408,"path":523,"seo":524,"stem":525,"tags":526,"__hash__":529},"blog\u002Fblog\u002Findustrial-iot\u002Findustrial-iot-gateway.md","工业物联网网关是什么？它解决了哪些问题？",{"type":8,"value":425,"toc":514},[426,430,433,436,439,442,446,449,452,469,473,476,479,482,486,489,492,495,499,502,505,508,511],[11,427,429],{"id":428},"工业物联网网关是什么","工业物联网网关是什么？",[15,431,432],{},"在工业自动化现场，不同厂商、不同型号的设备往往采用不同的通信协议。",[15,434,435],{},"这些设备可能通过 RS485、Modbus TCP、MQTT 或其他通信方式交换数据。",[15,437,438],{},"当企业希望将这些设备接入统一的物联网平台时，往往会遇到协议不统一、设备分散、数据难以管理等问题。",[15,440,441],{},"工业物联网网关，就是解决这些问题的重要组成部分。",[60,443,445],{"id":444},"一工业物联网网关的核心作用","一、工业物联网网关的核心作用",[15,447,448],{},"工业物联网网关通常部署在设备现场与上层平台之间，承担设备通信、协议适配和数据转发等工作。",[15,450,451],{},"主要包括：",[28,453,454,457,460,463,466],{},[31,455,456],{},"设备通信：连接 PLC、仪表、传感器及其他工业设备。",[31,458,459],{},"协议适配：将不同设备协议转换为统一的数据模型。",[31,461,462],{},"数据采集：按照配置周期读取设备运行数据。",[31,464,465],{},"数据转发：将采集结果发送至上层平台。",[31,467,468],{},"边缘处理：在现场完成必要的数据处理与逻辑判断。",[60,470,472],{"id":471},"二为什么需要边缘网关","二、为什么需要边缘网关？",[15,474,475],{},"传统工业设备通常并不具备直接接入云平台的能力。",[15,477,478],{},"即使设备具备通信接口，也不意味着上层平台可以直接理解其数据。",[15,480,481],{},"边缘网关可以在现场完成协议适配和数据处理，减少平台与设备之间的耦合。",[60,483,485],{"id":484},"三插件化协议架构","三、插件化协议架构",[15,487,488],{},"对于设备类型较多、协议持续增加的工业项目，传统的固定式协议实现容易造成系统扩展困难。",[15,490,491],{},"通过插件化架构，可以将不同设备协议的实现独立出来。",[15,493,494],{},"当需要接入新的设备类型时，可以通过开发对应协议插件扩展系统，而不必修改网关核心功能。",[60,496,498],{"id":497},"四边缘网关与工业物联网平台","四、边缘网关与工业物联网平台",[15,500,501],{},"工业物联网网关负责现场设备连接与数据采集，平台负责设备管理、数据展示和业务应用。",[15,503,504],{},"两者配合，可以构建从工业现场到业务系统的数据链路。",[60,506,507],{"id":507},"总结",[15,509,510],{},"工业物联网网关不仅是一个通信转发设备，更是工业设备与软件平台之间的重要连接层。",[15,512,513],{},"在实际项目中，需要根据设备类型、通信协议、部署环境和业务需求设计合适的网关架构。",{"title":139,"searchDepth":394,"depth":394,"links":515},[516,517,518,519,520],{"id":444,"depth":394,"text":445},{"id":471,"depth":394,"text":472},{"id":484,"depth":394,"text":485},{"id":497,"depth":394,"text":498},{"id":507,"depth":394,"text":507},"介绍工业物联网网关的基本概念、核心作用，以及它在工业设备联网和边缘计算中的应用。",{},"\u002Fblog\u002Findustrial-iot\u002Findustrial-iot-gateway",{"title":423,"description":521},"blog\u002Findustrial-iot\u002Findustrial-iot-gateway",[413,527,528],"边缘网关","设备联网","UKy2NfHM-cEoceI41ONwZPb4wmGUOpEe6DTb2ZQKHEs",{"id":4,"title":5,"author":6,"body":531,"category":403,"date":404,"description":405,"extension":406,"meta":797,"navigation":408,"path":409,"seo":798,"stem":411,"tags":799,"__hash__":419},{"type":8,"value":532,"toc":788},[533,535,537,541,543,551,553,557,559,563,565,567,569,579,583,585,597,599,601,603,605,607,609,611,613,618,620,638,640,642,644,646,648,658,660,670,672,674,676,678,680,682,694,696,714,716,718,720,722,724,728,730,740,742,744,748,750,752,754,768,770,772,774,776,782,784],[11,534,5],{"id":13},[15,536,17],{},[15,538,539],{},[21,540,23],{},[15,542,26],{},[28,544,545,547,549],{},[31,546,33],{},[31,548,36],{},[31,550,39],{},[15,552,42],{},[15,554,555],{},[21,556,47],{},[15,558,50],{},[15,560,561],{},[21,562,55],{},[15,564,58],{},[60,566,63],{"id":62},[15,568,66],{},[28,570,571,573,575,577],{},[31,572,71],{},[31,574,74],{},[31,576,77],{},[31,578,80],{},[15,580,83,581],{},[21,582,86],{},[15,584,89],{},[28,586,587,589,591,593,595],{},[31,588,94],{},[31,590,97],{},[31,592,100],{},[31,594,103],{},[31,596,106],{},[15,598,109],{},[15,600,112],{},[15,602,115],{},[60,604,119],{"id":118},[15,606,122],{},[15,608,125],{},[15,610,128],{},[15,612,131],{},[133,614,616],{"className":615,"code":137,"language":138,"meta":139},[136],[141,617,137],{"__ignoreMap":139},[15,619,145],{},[28,621,622,626,630,634],{},[31,623,624,153],{},[21,625,152],{},[31,627,628,159],{},[21,629,158],{},[31,631,632,165],{},[21,633,164],{},[31,635,636,171],{},[21,637,170],{},[15,639,174],{},[15,641,177],{},[60,643,181],{"id":180},[15,645,184],{},[15,647,187],{},[28,649,650,652,654,656],{},[31,651,192],{},[31,653,195],{},[31,655,198],{},[31,657,201],{},[15,659,204],{},[28,661,662,664,666,668],{},[31,663,209],{},[31,665,212],{},[31,667,215],{},[31,669,218],{},[15,671,221],{},[15,673,224],{},[15,675,227],{},[60,677,231],{"id":230},[15,679,234],{},[15,681,237],{},[28,683,684,686,688,690,692],{},[31,685,242],{},[31,687,245],{},[31,689,248],{},[31,691,251],{},[31,693,254],{},[15,695,257],{},[28,697,698,702,706,710],{},[31,699,700,265],{},[21,701,264],{},[31,703,704,271],{},[21,705,270],{},[31,707,708,277],{},[21,709,276],{},[31,711,712,283],{},[21,713,282],{},[15,715,286],{},[15,717,289],{},[60,719,293],{"id":292},[15,721,296],{},[15,723,299],{},[15,725,726],{},[21,727,304],{},[15,729,307],{},[28,731,732,734,736,738],{},[31,733,312],{},[31,735,315],{},[31,737,318],{},[31,739,321],{},[15,741,324],{},[15,743,327],{},[15,745,746],{},[21,747,332],{},[60,749,336],{"id":335},[15,751,339],{},[15,753,342],{},[28,755,756,758,760,762,764,766],{},[31,757,347],{},[31,759,350],{},[31,761,353],{},[31,763,356],{},[31,765,359],{},[31,767,362],{},[15,769,365],{},[15,771,368],{},[15,773,371],{},[60,775,375],{"id":374},[15,777,55,778,381,780,384],{},[379,779],{},[379,781],{},[15,783,387],{},[15,785,786],{},[21,787,392],{},{"title":139,"searchDepth":394,"depth":394,"links":789},[790,791,792,793,794,795,796],{"id":62,"depth":394,"text":63},{"id":118,"depth":394,"text":119},{"id":180,"depth":394,"text":181},{"id":230,"depth":394,"text":231},{"id":292,"depth":394,"text":293},{"id":335,"depth":394,"text":336},{"id":374,"depth":394,"text":375},{},{"title":5,"description":405},[413,414,415,416,417,418],1793846446107]