热门搜索:和平精英 原神 街篮2 

您的位置:首页 > > 教程攻略 > ai教程 >AI开发牧安 ·第13期 我用了十年的黑盒子,里面是什么

AI开发牧安 ·第13期 我用了十年的黑盒子,里面是什么

来源:互联网 更新时间:2026-08-26 07:41

{"type":"doc","content":[{"type":"paragraph","attrs":{"id":"2103a6c6-f311-4b5c-aeb9-13e9f2422072","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"rgb(214, 214, 214)","background":""}}],"text":"记录牧安平台从 0 到 1 的开发过程,一个待业在家的网安老兵边做边想。"}]},{"type":"paragraph","attrs":{"id":"36162557-c76d-42c9-b52c-b48b3b6680b5","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"我干安全运营十年,"探针"这词在我心里一直是个黑盒子——塞进机房,网线一插,日志吐上来。至于盒子里跑了什么,我没细想过,也用不着细想。"}]},{"type":"paragraph","attrs":{"id":"53b7a95c-d152-494b-a40b-433649b4e0ad","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"直到自己在家写牧安的 L3 探针,才发现连"前面那个网页后台"都很克制:Web 框架是 Python 标准库自带的 "},{"type":"text","marks":[{"type":"code"}],"text":"http.server"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":",数据库是本地 SQLite,第三方依赖一只手数得过来。"}]},{"type":"paragraph","attrs":{"id":"33b24d7b-4a6e-4ef7-bcc7-4877469f7bc6","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"这期不聊页面长啥样,也不念功能清单。我想聊的是:"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"当初我是怎么把它拆成一堆模块的,又为什么这么拆。"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 一个不懂架构的人凭感觉写,最容易翻车的不是代码报错,而是"这段该放哪"这个念头第一次冒出来的时候。"}]},{"type":"heading","attrs":{"id":"1197d847-43de-40b6-a0c5-6685b500e235","textAlign":"inherit","indent":0,"level":2,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"一、先回答最大疑问:为什么不用微服务?"}]},{"type":"paragraph","attrs":{"id":"c342c30a-1a1a-4370-90ff-a91b141ff4dd","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"先给结论:"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"单进程、单机的多线程单体。"}]},{"type":"paragraph","attrs":{"id":"bb9af1ad-e6cc-46c7-83ec-13cc9924c057","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"这个选择放在 2026 年听起来有点"土"。但牧安的探针是塞进小客户机房的,你不能假设现场有 Docker、能联网拉镜像、有运维盯着。对"正在出事的小客户"来说,"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"拷过去就能跑"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":",比"架构图好看"重要一百倍。"}]},{"type":"paragraph","attrs":{"id":"4b00357e-31d9-4faf-b03d-fe663a922e83","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"单体意味着:一台干净机器装上 Python,把 "},{"type":"text","marks":[{"type":"code"}],"text":".py"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 或 "},{"type":"text","marks":[{"type":"code"}],"text":".exe"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 丢过去,8802 端口就起来了。代价是没法水平扩展——但对这个定位,扩展性根本不是瓶颈。"}]},{"type":"blockquote","attrs":{"id":"948acc1a-5bde-4f09-8146-54ebd07887d4","textAlign":"inherit","isHoverDragHandle":false},"content":[{"type":"paragraph","attrs":{"id":"fd159e3a-8e37-4d45-9661-076cca41a71e","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"架构是为定位服务的,不是为好看服务的。"}]}]},{"type":"paragraph","attrs":{"id":"c6d4e11c-81be-4bdc-a979-0ddac00e8de6","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"这点我想得不算早,是第 12 期踩的那些坑逼出来的。"}]},{"type":"image","attrs":{"id":"3913c8c8-122b-47df-b586-5d4ad47ae363","src":"https://developer.qcloudimg.com/http-sa ve/audit-7337940/222d028e8b277a353bfe8cd4d35cfda5.webp","extension":"","align":"center","alt":"","showAlt":false,"href":"","boxShadow":"","width":"","aspectRatio":0,"status":"success","showText":true,"isPercentage":false,"percentage":0,"isHoverDragHandle":false}},{"type":"heading","attrs":{"id":"b3f3acd4-f7e3-4565-9632-501fbc535754","textAlign":"inherit","indent":0,"level":2,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"二、模块怎么切?import 语句就是架构图"}]},{"type":"paragraph","attrs":{"id":"eb0d3adb-c316-4d15-8ffb-d21607e4599b","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"很多人以为看架构要画 UML。在这个项目里,"},{"type":"text","marks":[{"type":"code"}],"text":"Shepherd_l3_app.py"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 顶部的 import 就是一张现成的架构图:"}]},{"type":"codeBlock","attrs":{"id":"f8c25249-776b-4411-bd5c-d297bbbd7a98","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"import ai_client "}]},{"type":"codeBlock","attrs":{"id":"e9c87c74-219b-4b0c-b759-420f77854d7e","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"# AI 研判/复盘import engine "}]},{"type":"codeBlock","attrs":{"id":"dc1704c8-be54-4e7f-b02c-9318fcbdd8ca","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"# 检测引擎import db"}]},{"type":"codeBlock","attrs":{"id":"2b5475fd-6af9-4573-8302-21f3f138512c","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"# 持久层import scheduler "}]},{"type":"codeBlock","attrs":{"id":"09c08c2e-7d3e-4595-a54b-fc7bcf360b8e","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"# 调度import autostart "}]},{"type":"codeBlock","attrs":{"id":"4aced094-4bee-4e6e-9ffa-6f3bd2a3ee2a","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"# 自启import tray"}]},{"type":"codeBlock","attrs":{"id":"c6220e74-4915-41c2-98d9-6a30881e1be0","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"# Windows 托盘import license"}]},{"type":"codeBlock","attrs":{"id":"7518dd1d-1142-426e-97eb-87f521ec6152","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"# 许可import probe "}]},{"type":"codeBlock","attrs":{"id":"533d25b6-3d50-47bc-84b9-3703f5660bfe","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"# 流量探针import ota"}]},{"type":"codeBlock","attrs":{"id":"5f5be5d4-012c-494a-8f26-66f65b3c3d18","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"# 升级import agent_bundle# 注册包解密"}]},{"type":"paragraph","attrs":{"id":"5511aced-c852-4618-bec4-4a06227cf691","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"按职责可以切成四层:"}]},{"type":"bulletList","attrs":{"id":"83ad7196-a36e-4d4e-9aa2-fe3b298ac181","isHoverDragHandle":false},"content":[{"type":"listItem","attrs":{"id":"80091889-36bc-4987-99cd-55f1b3dc4d6c"},"content":[{"type":"paragraph","attrs":{"id":"3c48275e-e353-4728-b61b-b88b00c9e4fb","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•接入层"}]},{"type":"paragraph","attrs":{"id":"b510b224-a867-4e76-bb53-70b226204e03","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"(app 自己):HTTP 路由 Bearer 鉴权。"},{"type":"text","marks":[{"type":"code"}],"text":"do_GET"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 只放只读、"},{"type":"text","marks":[{"type":"code"}],"text":"do_POST"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 只放写动作,两条通道分治。"}]}]},{"type":"listItem","attrs":{"id":"b3e2904c-4da7-4f1e-ae27-89c39408d00c"},"content":[{"type":"paragraph","attrs":{"id":"177ddebf-370c-4045-82a4-8a7eb69ba972","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•领域层"}]},{"type":"paragraph","attrs":{"id":"6723eca1-adaf-431b-8822-68b76ec4666a","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"probe"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 采集、"},{"type":"text","marks":[{"type":"code"}],"text":"engine"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 检测、"},{"type":"text","marks":[{"type":"code"}],"text":"ai_client"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 研判、"},{"type":"text","marks":[{"type":"code"}],"text":"scheduler"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 调度——四个真正干活的。"}]}]},{"type":"listItem","attrs":{"id":"53b45d2c-1f65-4637-863d-2e7c1de9decd"},"content":[{"type":"paragraph","attrs":{"id":"e49688e9-1f67-46f8-852a-efa652ffa005","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•持久层"}]},{"type":"paragraph","attrs":{"id":"fe373088-8f77-4ac2-938a-aef45ecdb942","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"db"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":",底下 17 张表。"}]}]},{"type":"listItem","attrs":{"id":"f51601ec-1ad4-4348-a232-1ed3299c77e0"},"content":[{"type":"paragraph","attrs":{"id":"93597423-2802-4906-bc13-4c520dbc37d5","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•基础设施层"}]},{"type":"paragraph","attrs":{"id":"399271d4-19f6-4d40-b0f3-7e971b62988f","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"autostart"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 自启、"},{"type":"text","marks":[{"type":"code"}],"text":"tray"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 托盘、"},{"type":"text","marks":[{"type":"code"}],"text":"license"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 许可、"},{"type":"text","marks":[{"type":"code"}],"text":"ota"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 升级、"},{"type":"text","marks":[{"type":"code"}],"text":"agent_bundle"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 注册。"}]}]}]},{"type":"paragraph","attrs":{"id":"f69f774c-271a-457b-ab34-21f1ee12f0f4","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"对一个人开发来说,"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"边界是 Python 模块,不是一个进程一个服务"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"。每个模块就是一个"虚拟同事",职责分不清楚,后面就全搅在一起。我当初就是先想清楚这四层,才动笔写的——虽然想得不透,第七节那几笔债就是证据。"}]},{"type":"heading","attrs":{"id":"37340007-0197-4662三、运行时:main 里会挂上一串 daemon 线程 分层本身是静态的。真正让一个进程能够“同时处理多件事”的,关键还在于 main() 启动时带起来的那一串 daemon 线程。• _probe_flush_loopdle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"—— 探针嗅探、把结果落库;"}]}]},{"type":"listItem","attrs":{"id":"572f720e-32a0-424f-804f-d81341030d21"},"content":[{"type":"paragraph","attrs":{"id":"07e803eb-ad44-4e19-842e-0cb4440326e6","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•"},{"type":"text","marks":[{"type":"code"}],"text":"_outbox_flush_loop"}]},{"type":"paragraph","attrs":{"id":"f5258dca-fd1e-43aa-9c7f-cf0c2be4acef","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"—— 把待上报数据推给 L2;"}]}]},{"type":"listItem","attrs":{"id":"c98d4d38-342e-4bcd-8ceb-1c8374bfd41b"},"content":[{"type":"paragraph","attrs":{"id":"550e58e2-33d3-46f4-becf-e5582b814588","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•"},{"type":"text","marks":[{"type":"code"}],"text":"command_poll_loop"}]},{"type":"paragraph","attrs":{"id":"97f64f08-a940-46ca-ae64-ab9bf7107be9","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"—— 反过来拉 L2 下发的指令;"}]}]},{"type":"listItem","attrs":{"id":"9ef62cc5-622f-40c1-b339-ca246cb7fb7e"},"content":[{"type":"paragraph","attrs":{"id":"3e903dcb-1513-4cfc-ac1f-0d50f0bd0c44","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•"},{"type":"text","marks":[{"type":"code"}],"text":"_self_protect_loop"}]},{"type":"paragraph","attrs":{"id":"808486b3-e163-43d9-b8b6-b07670de89fc","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"—— 自保(备份、监控、保活);"}]}]},{"type":"listItem","attrs":{"id":"86786a86-ac30-4c1a-9d33-ea13d8d24238"},"content":[{"type":"paragraph","attrs":{"id":"a780e8c2-f278-4a27-8366-026894b86b1a","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•"},{"type":"text","marks":[{"type":"code"}],"text":"scheduler"}]},{"type":"paragraph","attrs":{"id":"c2013ce0-2af2-479d-8a82-1467682faa63","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"主循环 —— 定时体检扫描 心跳上报 每天 0 点复盘;"}]}]},{"type":"listItem","attrs":{"id":"afc10371-40fb-44da-bbf0-a26961985676"},"content":[{"type":"paragraph","attrs":{"id":"070cbcb4-4f24-451c-9dc8-727b57dddabd","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•"},{"type":"text","marks":[{"type":"code"}],"text":"report_assets_to_l2"}]},{"type":"paragraph","attrs":{"id":"f2d19cac-42e2-4a8c-9af2-4f8c5ab2eb73","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"/ "},{"type":"text","marks":[{"type":"code"}],"text":"report_assets_to_l1"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" —— 资产上行;"}]}]},{"type":"listItem","attrs":{"id":"f984c350-d4d9-40e0-802d-989020c850ac"},"content":[{"type":"paragraph","attrs":{"id":"63a25aed-808f-4638-8b47-7d7b091425e3","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•"},{"type":"text","marks":[{"type":"code"}],"text":"httpd.serve_forever"}]},{"type":"paragraph","attrs":{"id":"f39bd1d2-5a5f-43fe-b929-94e75f58a548","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"—— HTTP 服务本身。"}]}]}]},{"type":"paragraph","attrs":{"id":"a1f14604-26e2-4c15-a3f2-f1969c791919","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"含义很直接:"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"HTTP 服务线程不被任何重活阻塞"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":",采集、上报、自保各跑各的 daemon 线程。这就是"一个进程干多件事"的实现方式。"}]},{"type":"paragraph","attrs":{"id":"be1b7b0a-7454-4b7c-9844-a69109b9ad83","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"为什么都标 "},{"type":"text","marks":[{"type":"code"}],"text":"daemon=True"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"?因为主进程一旦退出,这些线程要跟着走,"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"不能留孤儿进程占着 8802 端口"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"。客户打电话来说"没告警了",你登上去发现进程三天前就死了——这种静默趴窝,比功能少更可怕。"}]},{"type":"heading","attrs":{"id":"289934c9-9dbb-47bb-beea-46aaee819b65","textAlign":"inherit","indent":0,"level":2,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"四、数据流才是脊梁,页面只是窗口"}]},{"type":"paragraph","attrs":{"id":"601c5708-9f85-40c8-b52b-893c0ee25370","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"真正串起整个系统的,不是手册里那 6 个页面,而是这条管道:"}]},{"type":"paragraph","attrs":{"id":"8baeb05e-5418-4e42-9aef-2c8b3b7deb58","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"CODE"}]},{"type":"codeBlock","attrs":{"id":"2701a9f9-f4b8-4bb5-b702-4b7df85b0efc","language":"ja vascript","theme":"atom-one-dark","runtimes":0,"isHoverDragHandle":false,"key":"","languageByAi":"ja vascript"},"content":[{"type":"text","text":"采集(probe) → 检测(engine) → 落库(db) → 研判(ai_client) → 调度/聚合(scheduler) → 集成(outbox command_poll)"}]},{"type":"paragraph","attrs":{"id":"8c0c388a-9a96-4b20-8135-7d85eacc31d7","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"code"}],"text":"db.py"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 里那 17 张表,就是这条管道上各个节点的"状态容器",按域聚成几坨:"}]},{"type":"bulletList","attrs":{"id":"5873e09d-9c21-4939-b74b-d91f4df6de53","isHoverDragHandle":false},"content":[{"type":"listItem","attrs":{"id":"53929cd8-be24-45ed-addb-aaad8d7a4731"},"content":[{"type":"paragraph","attrs":{"id":"144aca3e-e52b-4965-9f2a-8b32092ffe47","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•采集域"}]},{"type":"paragraph","attrs":{"id":"92e368c3-c096-47a7-a7f0-810c2ce4af5e","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"probe_hosts"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"probe_sessions"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"probe_rules"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"probe_events"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"probe_db_audit"}]}]},{"type":"listItem","attrs":{"id":"fb6940a4-7a1f-4ce2-816d-14e910d6b4fa"},"content":[{"type":"paragraph","attrs":{"id":"24cb4eb8-0aa1-4430-932c-581612f2086f","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•告警域"}]},{"type":"paragraph","attrs":{"id":"03461c1a-43e6-44f9-8d10-49764f7ea6d6","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"alerts"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"security_events"}]}]},{"type":"listItem","attrs":{"id":"1e9ab6f7-0b83-4419-835f-a7eb1ec18558"},"content":[{"type":"paragraph","attrs":{"id":"90502bc3-8981-4139-b43d-b4b97a173314","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•资产域"}]},{"type":"paragraph","attrs":{"id":"13e1f126-01ea-483a-a2a5-0f9f8bab94c1","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"assets"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"asset_scans"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"probe_hosts"}]}]},{"type":"listItem","attrs":{"id":"f8637825-a497-42b9-9b7f-5688bd2491ce"},"content":[{"type":"paragraph","attrs":{"id":"6e4c6783-a710-4996-9578-aaf4d1c49946","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•AI 域"}]},{"type":"paragraph","attrs":{"id":"b04e8a0a-b285-41c3-986c-b5c43058aa0e","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"ai_analysis"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"ai_whitelist_suggestions"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"ai_daily_reviews"}]}]},{"type":"listItem","attrs":{"id":"3de16b9c-f8ba-43f5-8b86-85d8de8fdcb7"},"content":[{"type":"paragraph","attrs":{"id":"fec47181-b9a1-4b5a-a305-c8b7351fdc08","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•系统域"}]},{"type":"paragraph","attrs":{"id":"3aa9a728-e318-4425-a312-00ad656b75e4","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"config"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" / "},{"type":"text","marks":[{"type":"code"}],"text":"outbox"}]}]}]},{"type":"paragraph","attrs":{"id":"9a59648d-1eac-465e-859f-cb12f53d73b2","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"所以页面只是管道的窗口。哪天想多加一个页面,改的是窗口,不是架构。"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"架构围着数据流走,不围着界面走。"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 写之前没想明白这一点,加功能就是往代码里糊泥。"}]},{"type":"heading","attrs":{"id":"2f8a6cf1-b015-4d1f-80be-3b584779f1e5","textAlign":"inherit","indent":0,"level":2,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"五、集成:信箱模式 PULL,被部署环境逼出来的"}]},{"type":"paragraph","attrs":{"id":"5ef09dc9-dcaa-4ac8-8d48-d92e1c05beb3","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"探针不是直连上级的。"},{"type":"text","marks":[{"type":"code"}],"text":"_probe_flush"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 把告警先写进 "},{"type":"text","marks":[{"type":"code"}],"text":"outbox"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"(本地信箱),"},{"type":"text","marks":[{"type":"code"}],"text":"_outbox_flush"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 再异步推给 L2;"},{"type":"text","marks":[{"type":"code"}],"text":"command_poll"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 反向把 L2 的指令拉回来。"}]},{"type":"paragraph","attrs":{"id":"741e4590-f388-48ee-81b2-acbd757bccad","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"为什么绕这一道?因为"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"客户机房的网时断时续"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":",同步 RPC 一断就丢。信箱模式让断网时数据在本地攒着,网络通了再推——这是探针"扛得住"的架构根。"}]},{"type":"paragraph","attrs":{"id":"468d8de6-6563-4260-bfa2-fc0a475405a0","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"而且 L3 往往躲在 NAT 后面,L2 推不过去。所以指令改由 L3 主动来 "},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"PULL"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"。这种"上报用推、下发用拉"的非对称设计,不是我从书里抄的,是部署环境逼出来的。"}]},{"type":"heading","attrs":{"id":"18775e56-c40b-4b5a-9d07-edae4f39bae9","textAlign":"inherit","indent":0,"level":2,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"六、双形态:同一份代码,两种脸"}]},{"type":"paragraph","attrs":{"id":"3b98d4f8-66a2-469f-802f-dea23ab3ca99","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"手册里写着,"探针/会话/行为"这仨菜单只在 Linux 下显示。这容易被当成"产品凑功能",其实它是架构上的一条"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"能力探测缝"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"probe.is_supported()"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 一票否决。"}]},{"type":"paragraph","attrs":{"id":"006ce60e-fe09-41c1-bdd8-0914c2e162f2","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"同一份代码,Windows 上 "},{"type":"text","marks":[{"type":"code"}],"text":"probe"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 整块不初始化,相关菜单 "},{"type":"text","marks":[{"type":"code"}],"text":"display:none"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"。架构上留的是"能力探测"的岔路,而不是维护两套代码库。"}]},{"type":"paragraph","attrs":{"id":"5b9f173b-c675-4ccc-b0a1-e24fec6d8c40","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"代价是写功能时得时刻记着:"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"这段在 Windows 上根本不跑"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"。"},{"type":"text","marks":[{"type":"code"}],"text":"scapy"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 必须延迟导入、不能顶层 import 把 Windows 版带崩,也是这条纪律的产物。双形态是约束,不是特性;架构得为约束留缝。"}]},{"type":"heading","attrs":{"id":"f27f1abf-5f8c-472b-a11b-a296d550b5e7","textAlign":"inherit","indent":0,"level":2,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"七、自保:横切关注点,不是功能页"}]},{"type":"paragraph","attrs":{"id":"0bbc3b02-b6a2-4d55-a212-48fcb97429e9","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"code"}],"text":"_self_protect_loop"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 跑在请求路径之外,定时做三件事:写前快照 每 8 小时归档的备份、盯自己的 CPU/磁盘/丢包、保活拉起。"}]},{"type":"paragraph","attrs":{"id":"3114dc2b-92c7-4b8b-99ab-43a233f70256","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"这是架构上的"横切关注点":所有业务模块都依赖它,但它不属于任何一条业务。一个小盒子扔进机房没人盯,"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"自保必须独立于请求生命周期"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"——不能等业务请求来了才想起来备份、才发现进程死了。"}]},{"type":"paragraph","attrs":{"id":"3ea68e03-f705-429b-896e-d084c35270f9","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"它和采集、检测是平等的"线程公民",只是不抛头露面。"}]},{"type":"heading","attrs":{"id":"6149654b-cc97-42bc-85a9-5dd3a2f729f5","textAlign":"inherit","indent":0,"level":2,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"八、几个当初没想透的架构债"}]},{"type":"paragraph","attrs":{"id":"7ef6f591-0199-493c-855a-090112f92f73","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"点到为止,踩坑那期细聊:"}]},{"type":"bulletList","attrs":{"id":"0c70f1ba-8dd1-4323-9ddd-1d8d87925ddc","isHoverDragHandle":false},"content":[{"type":"listItem","attrs":{"id":"2c929c71-ba23-4136-9424-b980580f1506"},"content":[{"type":"paragraph","attrs":{"id":"bb41cd80-2e56-4c4d-bf59-8178e8945e27","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•路由归属铁律"}]},{"type":"paragraph","attrs":{"id":"928bd74c-d77c-4bab-9073-195feb118aa9","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"},{"type":"text","marks":[{"type":"code"}],"text":"do_GET"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 只读、"},{"type":"text","marks":[{"type":"code"}],"text":"do_POST"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 写动作,破了前端静默 404。"}]}]},{"type":"listItem","attrs":{"id":"9e8a1dfa-1792-4195-aad6-7bc0c68902c0"},"content":[{"type":"paragraph","attrs":{"id":"f53b4415-f634-4633-b8b4-fbdb81b019a7","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•单实例锁 "},{"type":"text","marks":[{"type":"code"}],"text":"__pycache__"}]},{"type":"paragraph","attrs":{"id":"a8390fd2-8610-48b5-af5a-28781e405e62","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":8803 端口锁、旧字节码比源码新导致不重编译。"}]}]},{"type":"listItem","attrs":{"id":"442b82a6-52ba-4e62-81c8-47ac8ae5eec4"},"content":[{"type":"paragraph","attrs":{"id":"d58be07e-51ff-4435-b924-dd54e76ae804","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"•零依赖纪律 vs "},{"type":"text","marks":[{"type":"code"}],"text":"scapy"}]},{"type":"paragraph","attrs":{"id":"e2396619-cd43-413a-be57-a785ae3cbeba","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":说好零依赖,"},{"type":"text","marks":[{"type":"code"}],"text":"scapy"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 就只能在 "},{"type":"text","marks":[{"type":"code"}],"text":"probe"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 内延迟导入,否则 Windows 版直接崩。"}]}]}]},{"type":"heading","attrs":{"id":"d0fb8f74-c7d9-4870-b5c3-14bef17b8a70","textAlign":"inherit","indent":0,"level":2,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"九、所以,一个探针里到底装了什么?"}]},{"type":"paragraph","attrs":{"id":"7578e288-e1d3-4810-af82-d0b5164626a9","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"装的是一套"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"单体多线程架构"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":":"}]},{"type":"bulletList","attrs":{"id":"22a5a7e0-661e-4ae7-84bb-96fa04f5c79a","isHoverDragHandle":false},"content":[{"type":"listItem","attrs":{"id":"bf5267bb-a7be-4567-8c5e-783ca3fee765"},"content":[{"type":"paragraph","attrs":{"id":"4634cbcf-8cfe-40db-9882-b8b15b267afb","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"• 接入 / 领域 / 持久 / 基础设施四层;"}]}]},{"type":"listItem","attrs":{"id":"5702d457-3f38-44c2-81fe-abd81926f987"},"content":[{"type":"paragraph","attrs":{"id":"d6d78773-bc8f-447f-8857-1b0f0d2bce18","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"• 一条数据管道串起来;"}]}]},{"type":"listItem","attrs":{"id":"bbb93aa5-3723-4d3d-8e64-192143c21d8e"},"content":[{"type":"paragraph","attrs":{"id":"330dfe14-fd9f-498a-b631-183bef9e873d","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"• 信箱 PULL 解耦上报;"}]}]},{"type":"listItem","attrs":{"id":"54288d8d-d173-4679-b5e0-9dd3ca4dca1d"},"content":[{"type":"paragraph","attrs":{"id":"ace01249-9e14-499a-ac21-8ec9ba7eda9b","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"• 双形态靠能力探测缝;"}]}]},{"type":"listItem","attrs":{"id":"5bb5d77c-11e9-48b8-997f-3b59384751bb"},"content":[{"type":"paragraph","attrs":{"id":"1b12ca96-e970-4778-9db5-7c2d28f0f15f","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"• 自保做成横切。"}]}]}]},{"type":"paragraph","attrs":{"id":"2f88a432-dde3-4d81-9195-02873afc1a8c","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"这么多线程挤在一个进程里,最怕的不是功能少,是它哪天"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"悄无声息地趴了"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"——客户打电话来说"没告警了",你登上去发现进程三天前就死了。"}]},{"type":"horizontalRule","attrs":{"id":"3adb5985-66c3-41c6-8d9d-7cef88c1b905","isHoverDragHandle":false}},{"type":"paragraph","attrs":{"id":"cf29df27-e469-4b60-8dba-ea3ed9e7d44b","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"下一期(第 14 期)就聊这个:一个探针里还能装什么。现在能跑的已经是满血版了吗?哪些空白和坑早晚得补,我顺着架构接着往下捋。"}]},{"type":"paragraph","attrs":{"id":"b92366d8-239b-4904-991d-2293f69aa4d8","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"◆ ◆ ◆"}]},{"type":"paragraph","attrs":{"id":"23074c2a-1a63-4aea-b452-d37067077bed","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}},{"type":"bold"}],"text":"你在做安全产品时,有没有遇到过"为了架构好看而牺牲现场可跑性"的时候?"}]},{"type":"paragraph","attrs":{"id":"9a403ef6-522f-460c-8b4a-76f46b66a017","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"欢迎在评论区说说,我看看是不是只有我一个人踩过这种坑。"}]},{"type":"blockquote","attrs":{"id":"82ecbf84-2ff7-4541-846a-78f2e461f718","textAlign":"inherit","isHoverDragHandle":false},"content":[{"type":"paragraph","attrs":{"id":"dc6a1014-7dda-4da1-9334-f2edf8790e5c","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false},"content":[{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":"注:本期架构事实来自 "},{"type":"text","marks":[{"type":"code"}],"text":"Shepherd_l3_app.py"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 的 import 与 "},{"type":"text","marks":[{"type":"code"}],"text":"main()"},{"type":"text","marks":[{"type":"textStyle","attrs":{"color":"","background":""}}],"text":" 线程编排、L3 结构备忘(17 张表与路由清单),用户手册仅作功能表述的旁证。"}]}]},{"type":"paragraph","attrs":{"id":"a2339555-46b0-4b2c-9821-b1a4cc188119","textAlign":"inherit","indent":0,"color":null,"background":null,"isHoverDragHandle":false}}]}","createTime":1786496394,"ext":{"closeTextLink":0,"comment_ban":0,"description":"","focusRead":0},"fa vNum":0,"html":"","isOriginal":0,"likeNum":0,
关于宇宙的好的网名有哪些
关于宇宙的好的网名有哪些

类型:角色扮演

大小:1

语言:简体中文

平台:互联网

游戏下载

热门手游

手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc