尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Langfuse 中的 ClickHouse 最佳实践:Schema 设计、查询优化与写入策略全解析
Langfuse 中的 ClickHouse 最佳实践Schema 设计、查询优化与写入策略全解析【免费下载链接】langfuse Open source AI engineering platform: LLM evals, observability, metrics, prompt management, playground, datasets. Integrates with OpenTelemetry, LangChain, OpenAI SDK, LiteLLM, and more. YC W23项目地址: https://gitcode.com/GitHub_Trending/la/langfuse导读本文围绕 langfuse 仓库内置的clickhouse-best-practicesAgent 技能展开系统讲解该技能定义的三大核心板块Schema 设计schema、查询优化query与写入策略insert并逐一拆解其下 28 条原子规则的优先级、影响级别与正反例。结合 langfuse 仓库真实的 ClickHouse 迁移脚本与查询构建器源码读者将掌握一套可直接用于评审CREATE TABLE、ALTER TABLE、慢查询与数据摄入管线的实操检查清单理解为什么ORDER BY不可变、FINAL应避免、单行 INSERT 会拖垮集群以及 Langfuse 自身是如何落实这些规则的。一、技能概览28 条规则3 大分类按影响优先级排序技能入口文件 SKILL.md 明确该技能涵盖schema建表与 Schema 设计、query查询优化、insert数据摄入三个主分类共 28 条规则全部按影响程度CRITICAL / HIGH / MEDIUM排序。分类总纲定义在 rules/_sections.md板块前缀影响级别核心主张Schema Designschema-*CRITICALORDER BY建表后不可变选错需全量迁移列类型与顺序可带来数量级的查询速度差异Query Optimizationquery-*CRITICALJOIN 算法、过滤策略、跳过索引、物化视图能把分钟级查询降到毫秒级预聚合读取几千行而非几十亿行Insert Strategyinsert-*CRITICAL每次 INSERT 产生一个 data part单行写入会压垮 merge 过程批量化1 万–10 万行、异步插入、避免 mutation 是集群稳定的基础规则文件命名采用「前缀 主题」形式前缀即_sections.md中括号内的分组 ID。例如schema-pk-*4 条主键选择与基数排序、query-join-*5 条JOIN 算法与替代方案、insert-mutation-*2 条避免 UPDATE/DELETE mutation。完整分布见 README.md 的规则统计表。技能的应用流程同样定义在 SKILL.md回答 ClickHouse 问题前先在rules/目录检查是否有适用规则命中则必须引用规则名Perrule-name...再作答未命中再依赖通用知识或联网检索。之所以规则优先是因为 ClickHouse 的列式存储、稀疏索引与 MergeTree 合并机制与通用数据库直觉相悖——例如在 MySQL 里加个索引就能解决的事在 ClickHouse 里可能要从ORDER BY重新设计。每条规则文件统一遵循 rules/_template.md 的结构YAML frontmatter标题、影响级别、量化收益描述、标签 规则解释 Incorrect 反例 Correct 正例 权衡与参考文档确保 Agent 或工程师可以逐条对照评审。二、Schema 设计schemaCRITICAL建表前的一切决策2.1 建表前规划主键ORDER BY 不可变规则 schema-pk-plan-before-creation.md 指出ClickHouse 的ORDER BY同时定义物理数据排序与稀疏索引且与其它数据库不同建表后无法修改。反例中ALTER TABLE events MODIFY ORDER BY (...)会直接报错选错只能重建表并迁移全部数据。正确的做法是在建表前先记录查询模式再据此确定ORDER BY-- Step 1: 建表前分析查询模式 /* Query Analysis: - 60% of queries: WHERE user_id ? AND timestamp BETWEEN ? AND ? - 25% of queries: WHERE event_type ? AND timestamp ? - 15% of queries: WHERE event_id ? */ -- Step 2: 依据查询模式建表 CREATE TABLE events ( event_id UUID DEFAULT generateUUIDv4(), user_id UInt64, event_type LowCardinality(String), timestamp DateTime, event_date Date DEFAULT toDate(timestamp) ) ENGINE MergeTree() PARTITION BY toYYYYMM(event_date) ORDER BY (user_id, event_date, event_id);规则附带建表前检查清单列出 Top 5–10 查询模式、识别 WHERE 中高频列、优先能排除大量行的列、按基数从低到高排序、键列控制在 4–5 个以内。Langfuse 的实践可以佐证这一原则。以 canonical/0002_observations.up.sql 为例observations表的PRIMARY KEY (project_id, type, toDate(start_time))与ORDER BY (project_id, type, toDate(start_time), id)完全围绕 Langfuse 的核心访问模式按项目隔离 按观测类型 按时间范围过滤设计并将id放在最后作为唯一性收尾——这正是过滤列优先、低基数在前、高基数在后的直接落地。2.2 按基数从低到高排序列规则 schema-pk-cardinality-order.md 解释稀疏主索引按数据块granule而非单行工作低基数的前置列能产生更多可用的索引条目从而跳过整块数据。若把 UUID 这类高基数列放最前每个 granule 都有不同的 event_id索引无法跳过任何块剪枝收益为零。列顺序参考表位置基数示例第 1 位低去重值少event_type、status、country第 2 位日期粗粒度toDate(timestamp)第 3 位起中–高user_id、session_id末位高如确需event_id、uuid小技巧日级过滤够用时用toDate(timestamp)代替原始DateTime列可把索引中该字段从 32 位降到 16 位表示。上述 Langfuseobservations表正是把toDate(start_time)放在键的第三位。2.3 优先把过滤列放进 ORDER BY规则 schema-pk-prioritize-filters.md 强调查询 WHERE 中频繁出现、尤其是能排除大量行的列必须进入ORDER BY否则该列上的过滤会退化为全表扫描。典型反例是ORDER BY (event_id)却按tenant_id过滤正例则把过滤列前置CREATE TABLE events (...) ENGINE MergeTree() ORDER BY (tenant_id, event_date, event_id); -- 查询可命中主索引 SELECT * FROM events WHERE tenant_id 123 AND event_date 2024-01-01;规则还给出验证手段用EXPLAIN indexes 1检查执行计划中是否存在PrimaryKey及其 Key Condition。2.4 查询端必须使用 ORDER BY 前缀列规则 schema-pk-filter-on-orderby.md 补充了查询侧约束即便 Schema 设计正确查询跳过前缀列或在非ORDER BY列上过滤同样无法使用索引。给定ORDER BY (tenant_id, event_type, timestamp)过滤条件索引是否生效WHERE tenant_id 123完全生效WHERE tenant_id 123 AND event_type click完全生效WHERE event_type click不生效跳过了前缀列WHERE timestamp 2024-01-01不生效跳过了两个前缀列前导等值 后列范围如tenant_id 123 AND event_type click AND timestamp ...依然能高效使用索引。2.5 数据类型原生类型优先CRITICAL规则 schema-types-native-types.md 指出全用String会浪费存储、破坏压缩并拖慢比较运算。UUID 存成 String 要 36 字节原生UUID只要 16 字节时间戳 String 要 19 字节DateTime只要 4 字节且支持运算。类型速查表数据应该用避免用自增 IDUInt32/UInt64StringUUIDUUIDString状态/类别Enum8 或 LowCardinality(String)String时间戳DateTimeDateTime64、String纯日期Date / Date32DateTime、String计数够用的最小 UInt 类型Int64、String金额Decimal(P,S) 或 Int64分Float64、String布尔Bool / UInt8String2.6 数值类型最小化位宽HIGH规则 schema-types-minimize-bitwidth.md 主张用能容纳数据范围的最小数值类型HTTP 状态码UInt160–65,535即可年龄UInt80–255足够年份UInt16足够无负数场景优先无符号类型。类型对照表类型范围字节UInt80–2551UInt160–65,5352UInt320–约 43 亿4UInt640–约 1.8 千亿亿8Int8-128–1271Int16-32,768–32,7672Int32-21 亿–21 亿4Int64约 ±9 千亿亿8Langfuse 的迁移脚本同样遵循此原则例如 canonical/0002_observations.up.sql 中prompt_version Nullable(UInt16)、is_deleted UInt8都按实际取值范围选择了最小位宽。2.7 LowCardinality重复字符串的字典编码HIGH规则 schema-types-lowcardinality.md 说明重复值字符串每行重复存储LowCardinality通过字典编码大幅压缩。判断标准是去重值少于 1 万用 LowCardinality多于 1 万用普通 String可用SELECT uniq(column_name) FROM table_name;先确认基数。与FixedString的取舍FixedString仅用于真正定长数据如 2 字符国家码变长低基数文本用LowCardinality(String)更优。Langfuse 中这是高频实践canonical/0002_observations.up.sql 的type LowCardinality(String)、level LowCardinality(String)以及metadata Map(LowCardinality(String), String)的 Map 键类型都在为观测类型、日志级别这类去重值有限且大量重复的字段做字典编码。2.8 Enum有限取值集合MEDIUM规则 schema-types-enum.md 介绍Enum8≤256 个值1 字节与Enum16≤65,536 个值2 字节的三大收益写入时校验、自然排序、比较运算按枚举值进行。CREATE TABLE orders ( status Enum8(pending 1, processing 2, shipped 3, delivered 4) ); -- 写入校验非法值被拒绝 INSERT INTO orders VALUES (shiped); -- ERROR: Unknown element shiped -- 自然排序与比较 SELECT * FROM orders ORDER BY status; -- 按枚举值 1,2,3,4 排序 SELECT * FROM orders WHERE status processing; -- shipped 和 delivered适用场景矩阵取值集合固定且建表时已知 → Enum取值频繁变化 → LowCardinality(String)需要写入校验 / 查询端自然排序 → Enum。2.9 尽量不用 NullableHIGH规则 schema-types-avoid-nullable.md 说明Nullable 列会额外维护一个 UInt8 标记列增加存储并拖慢性能。能用 DEFAULT 表达未知/缺省就用 DEFAULT类型建议默认值StringUInt*/Int*0DateTimenow()或toDateTime(0)UUIDgenerateUUIDv4()仅当 NULL 具有业务语义时才用 Nullabledeleted_atNULL未删除、parent_idNULL无父节点、discount_percentNULL无折扣00% 折扣。Langfuse 的observations表同样把parent_observation_id、end_time、input、output等语义上可能不存在的字段声明为 Nullable而把id、trace_id、project_id保持为非空。2.10 分区策略HIGH与 JSON 取舍MEDIUMschema-partition-*四条规则分区生命周期、低基数分区、分区剪枝权衡、先不分区的核心主张是分区用于数据生命周期管理而非查询加速例如按时间分区便于 DROP PARTITION 做 TTL 式清理分区数量控制在 100–1,000分区过多会让 part 碎片化、拖慢 merge理解分区剪枝的收益与代价考虑先不加分区、按需再引入。schema-json-when-to-useMEDIUM则回答何时用 JSON 类型动态/不确定 Schema 才用 JSON已知字段必须用类型化列——这与 Langfuse 用Map(LowCardinality(String), String)存储动态 metadata、用类型化列存核心字段的思路一致。三、查询优化queryCRITICAL把分钟级查询降到毫秒级3.1 JOIN先过滤、后连接、选算法query-join-*五条规则构成一套完整的 JOIN 决策链query-join-filter-before.mdCRITICAL连接前先过滤两表而非连接后再 WHERE——减少参与哈希连接的输入行数直接降低内存与耗时query-join-choose-algorithm.mdCRITICAL依据表规模选算法小表驱动、大表侧建哈希、必要时SET join_algorithm partial_merge等避免默认算法在超大右表上内存爆掉query-join-use-any.mdCRITICAL只需要一个匹配行时用ANY LEFT JOIN等 ANY 语义 JOIN省去去重与全匹配开销query-join-consider-alternatives.mdCRITICAL考虑用Dictionary 字典或反规范化宽表冗余字段替代高频 JOIN用空间换时间query-join-null-handling.mdCRITICAL明确join_use_nulls 0与 1的差异默认值语义用join_use_nulls0处理避免 NULL 扩散污染聚合。3.2 跳过索引为不在 ORDER BY 的过滤列兜底HIGH规则 query-index-skipping-indices.md 指出无法进入ORDER BY但会被高频过滤的列应建数据跳过索引data skipping index。Langfuse 的observations表为此提供了现成范例——在ORDER BY之外的id、trace_id、project_id上各建了 bloom_filter 索引INDEX idx_id id TYPE bloom_filter() GRANULARITY 1, INDEX idx_trace_id trace_id TYPE bloom_filter() GRANULARITY 1, INDEX idx_project_id project_id TYPE bloom_filter() GRANULARITY 1见 canonical/0002_observations.up.sql。这与规则非 ORDER BY 过滤列用跳过索引兜底的要求完全一致。3.3 物化视图增量聚合与可刷新视图HIGHquery-mv-incremental.md对实时聚合场景用增量物化视图在插入时同步累加查询只读预聚合结果——对应_sections.md所述预计算聚合读取几千行而非几十亿行query-mv-refreshable.md对复杂 JOIN 场景用可刷新物化视图定期重算。Langfuse 在聚合表上大量使用该模式例如 canonical/0023_traces_aggregating_merge_trees.up.sql 的聚合 MergeTree 系列即按时间窗口预聚合 trace 数据。同时SKILL.md 对 MV 运维给出了 Langfuse 专属约束绝不能 DROP 再 CREATE 一个源表仍在实时写入的物化视图DROP 与 CREATE 之间插入的每一行都会永久丢失变更 MV 的 SELECT 必须用ALTER TABLE mv {CLICKHOUSE_CLUSTER_CLAUSE} MODIFY QUERY select当变更新增列时先ALTER目标表加列带{CLICKHOUSE_CLUSTERED_ONLY: SETTINGS alter_sync 2}再MODIFY QUERY。3.4 Langfuse 专属events 表与查询归属attributionSKILL.md 为 langfuse 仓库定义了三条项目级规则查events表必须走查询构建器event-query-builder.ts不得手写 SQL除非先确认构建器无法表达该查询events表上永不使用FINAL——该表设计上就不需要 FINAL且该关键字会显著拖慢查询对应insert-optimize-avoid-final的让后台 merge 干活理念查询归属写入system.query_log.log_comment由 queryTags.ts 以 JSON 形式写入可用JSONExtractString(log_comment, surface)、JSONExtractString(log_comment, route)、JSONExtractString(log_comment, projectId)解析。已知surface取值trpc、publicapi、worker、mcp、unknownClickhouseWriter 批量插入使用projectId MULTI_PROJECT。归属信息通过 OpenTelemetry baggage 传播入口调用 headerPropagation.ts 的contextWithLangfuseProps(...)设置 surface/route/projectIdClickHouse 仓储层在 queryTags.ts 中通过normalizeClickHouseQueryTags(...)读取 baggage 并写入log_comment。最佳实践是在入口统一设置归属而不是在每个仓储调用中传递标签——这正是查询归属审计与查询优化结合的可观测性实践。四、写入策略insertCRITICAL保证集群稳定的摄入基线4.1 批量大小每次 INSERT 1 万–10 万行规则 insert-batch-size.md 是写入侧最核心的一条每次 INSERT 应包含 1 万–10 万行。原因是每次 INSERT 都会生成一个 data part单行插入会让 part 数量爆炸把后台 merge 进程压垮最终表现为集群性能持续劣化。_sections.md的概括是单行插入会淹没 merge 过程合理批量化、异步插入、避免 mutation、让后台 merge 自然工作是稳定集群性能的必备条件。4.2 异步插入与 Native 格式HIGHinsert-async-small-batches.md高频小批量写入场景开启异步插入async inserts让服务端聚合小批次再落盘insert-format-native.md追求最佳性能时使用Native 格式传输数据列式、零解析开销而非 CSV/JSONEachRow 等文本格式。这两条规则服务于 Langfuse 这类实时遥测平台的高频摄入场景外部 SDK/OpenTelemetry 上报的观测数据会被汇聚成大批次后再写入 ClickHouse避免逐条插入。4.3 避免 mutation用专用引擎表达更新与删除CRITICALinsert-mutation-avoid-update.md频繁更新不要用ALTER TABLE ... UPDATE异步、重写整个 part、代价极高改用ReplacingMergeTree按版本/时间列去重取最新表达更新语义insert-mutation-avoid-delete.md删除优先用**轻量 DELETEDELETE FROM ... WHERE**或DROP PARTITION避免全量 mutation。Langfuse 的observations表是 ReplacingMergeTree 的教科书级应用ENGINE {CLICKHOUSE_REPLICATION_PREFIX}ReplacingMergeTree(event_ts, is_deleted)见 canonical/0002_observations.up.sql。该表把event_ts作为版本列、is_deleted UInt8作为删除标记通过 ReplacingMergeTree 在后台 merge 时按 (event_ts, is_deleted) 语义消重实现更新/删除而无需 mutation——event_ts取最大值即最新状态is_deleted1即软删除。这也印证了 SKILL.md 评审清单中ReplacingMergeTree 必须带版本列的要求。4.4 避免 OPTIMIZE TABLE FINALHIGH规则 insert-optimize-avoid-final.md 提醒OPTIMIZE TABLE ... FINAL会强制同步触发全量合并消耗大量 CPU/IO 且阻塞应信任后台自动 merge 机制让它按自身节奏工作。这与 SKILL.md 中events表永不使用 FINAL的 Langfuse 规则一脉相承——设计正确的 Schema 根本不需要 FINAL 就能满足查询语义。五、评审工作流与输出规范让规则可执行5.1 三类评审的规则读取顺序SKILL.md 给出了按场景编排的规则阅读顺序与检查清单Schema 评审CREATE/ALTER TABLE依次读schema-pk-plan-before-creation→schema-pk-cardinality-order→schema-pk-prioritize-filters→schema-types-native-types→schema-types-minimize-bitwidth→schema-types-lowcardinality→schema-types-avoid-nullable→schema-partition-low-cardinality→schema-partition-lifecycle检查主键列序低到高基数、类型匹配、LowCardinality 使用、分区基数100–1,000、ReplacingMergeTree 版本列以及 Langfuse 专属的 canonical migration 约束每个 metadata ALTER 必须带{CLICKHOUSE_CLUSTERED_ONLY: SETTINGS alter_sync 2}每个产生 mutation 的 ALTER 必须带{CLICKHOUSE_CLUSTERED_ONLY: SETTINGS mutations_sync 2}禁止CREATE OR REPLACE VIEW/TABLEMV 不得 DROP 重建。查询评审SELECT/JOIN/聚合依次读query-join-choose-algorithm→query-join-filter-before→query-join-use-any→query-index-skipping-indices→schema-pk-filter-on-orderby检查过滤是否命中 ORDER BY 前缀、JOIN 前是否已过滤、JOIN 算法选择、非 ORDER BY 过滤列是否有跳过索引。写入策略评审摄入/更新/删除依次读insert-batch-size→insert-mutation-avoid-update→insert-mutation-avoid-delete→insert-async-small-batches→insert-optimize-avoid-final检查单次 INSERT 是否达 1 万–10 万行、是否用ALTER TABLE UPDATE做频繁变更、更新/删除是否已用 Replacing/CollapsingMergeTree 表达、高频小批量是否开启异步插入。5.2 输出格式规则可追溯的评审报告评审结果应按 SKILL.md 的结构化模板输出确保每条结论可追溯到具体规则## Rules Checked - rule-name-1 - Compliant / Violation found - rule-name-2 - Compliant / Violation found ... ## Findings ### Violations - **rule-name**: Description of the issue - Current: [what the code does] - Required: [what it should do] - Fix: [specific correction] ### Compliant - rule-name: Brief note on why its correct ## Recommendations [Prioritized list of changes, citing rules]5.3 触发场景技能在以下场景自动激活见 SKILL.md出现CREATE TABLE、ALTER TABLE修改、ORDER BY/PRIMARY KEY 讨论、数据类型选择、慢查询排查、JOIN 优化、摄入管道设计、更新/删除策略、ReplacingMergeTree 等专用引擎、分区策略决策时。对应的自然语言触发词包括 Create a table for...、Why is this query slow?、How should I insert data into... 等。六、Langfuse 的 ClickHouse 运维红线迁移与视图安全除三大板块规则外SKILL.md 汇总了 Langfuse 仓库特有的几条 ClickHouse 运维红线是上述规则的工程化延伸canonical 迁移模板是唯一事实源packages/shared/clickhouse/migrations/canonical/**是集群版与非集群版统一渲染的模板树所有集群感知的 DDL 位置必须放置{CLICKHOUSE_CLUSTER_CLAUSE}{CLICKHOUSE_REPLICATION_PREFIX}仅用于两种模式下引擎有意的差异部分表两种模式都保持非复制。metadata ALTER 与 mutation ALTER 的同步设置每个新的 canonical migration 中ADD/DROP/MODIFY COLUMN、ADD/DROP INDEX等 metadata ALTER 必须带{CLICKHOUSE_CLUSTERED_ONLY: SETTINGS alter_sync 2}MATERIALIZE .../UPDATE/DELETE必须带{CLICKHOUSE_CLUSTERED_ONLY: SETTINGS mutations_sync 2}。原因在于alter_sync默认值为 1语句只等发起副本在 Keeper 中更新元数据版本即返回golang-migrate 随即打开下一个迁移文件其首个 ALTER 可能落在元数据版本滞后的副本上ClickHouse 会以code 517拒绝排队并中止整个迁移。注意mutations_sync不能替代alter_sync前者管 mutation 何时完成后者管元数据传播。不要为已发布的迁移补加同步设置历史兼容性测试有意保护其既有输出。禁止CREATE OR REPLACE VIEW/TABLE与EXCHANGE TABLES原子替换依赖renameat2文件系统支持NFS 托底的自托管部署如 AWS EFS 上的 ClickHouse 数据不具备迁移会失败并导致启动中止。普通视图改写为同一文件内两条语句DROP VIEW IF EXISTS name {CLICKHOUSE_CLUSTER_CLAUSE};后接CREATE VIEW name {CLICKHOUSE_CLUSTER_CLAUSE} AS ...迁移执行器传x-multi-statementtruegolang-migrate 按;切分文件且不解析 SQL因此注释与字符串字面量中不要出现分号每条语句保持幂等IF EXISTS/IF NOT EXISTS以便migrate force后重跑半应用的迁移。这些约束直接源于 ClickHouse 的分布式合并树语义与 Langfuse 的实际部署环境与_sections.md强调的schema 决策不可逆、写入方式决定集群稳定性互为表里。结语clickhouse-best-practices技能以 rules/_sections.md 为总纲把 ClickHouse 工程实践收敛为 3 个 CRITICAL 板块、28 条原子规则建表前把 ORDER BY 想清楚低基数在前、过滤列优先、原生类型、慎用 Nullable、查询端让过滤命中索引前缀并善用 JOIN 算法与跳过索引、写入端坚持 1 万–10 万行批量化并用专用引擎表达更新删除。Langfuse 仓库的 canonical 迁移、events 查询构建器 与 queryTags.ts 即是这套规则的真实落地样板。无论是评审现有 Schema、排查慢查询还是设计摄入管道按 SKILL.md 的规则优先顺序逐条核对都能得到可追溯、可执行的结论。【免费下载链接】langfuse Open source AI engineering platform: LLM evals, observability, metrics, prompt management, playground, datasets. Integrates with OpenTelemetry, LangChain, OpenAI SDK, LiteLLM, and more. YC W23项目地址: https://gitcode.com/GitHub_Trending/la/langfuse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

2026企业AI办公工具选型指南:建立适配业务的评估框架

2026企业AI办公工具选型指南:建立适配业务的评估框架

企业引入AI办公工具的过程中,很容易陷入表层对比的误区。不少IT负责人会把功能清单长度、公开报价、市场声量作为主要判断依据,拿到多款产品的功能对照表逐项勾选,希望找到覆盖最多能力的平台。部分采购决策还会单纯参考同行业采购案例&#…

📅 2026/9/10 2:28:59
2026年进销存智能化趋势:企业选型需要把握哪些核心方向?

2026年进销存智能化趋势:企业选型需要把握哪些核心方向?

本文要点:本文解读2026年进销存智能化(自动补货、异常预警、AI记账)趋势,分析企业选型应优先评估的数据贯通、规则引擎与低门槛迭代三类能力,并盘点轻流及多家主流工具的应对思路,适合计划升级库存管理的中…

📅 2026/9/10 2:28:59
2026企业AI办公工具选型指南:企业数字化落地判断框架

2026企业AI办公工具选型指南:企业数字化落地判断框架

企业引入AI办公工具的过程中,不少决策者容易陷入选型误区。部分团队直接对比功能清单,把功能数量作为核心评判标尺;部分以采购成本作为第一判断条件,优先选择成本更低的产品;还有部分跟随行业热度,参考市场…

📅 2026/9/10 2:28:59
MORE NEWS

更多资讯

📰

UEFI与ESP分区全解:从启动链原理到引导修复实战

折腾机器多年的朋友应该都有一个共识:只要跟“启动”沾边的问题,十有八九最后都会绕到同一个地方——ESP分区。我前阵子帮同事救一台Win10更新后卡grub rescue的本子,从磁盘管理看到底,最后发现EFI系统分区好好的,但里…

📰

Hermes智能体更新与维护:面向AI Agent的运维SLO实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

补全项目信息,获得高质量技术博客的生成基础

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

洛阳钼业7年矿山无人化演进:最稳的矿区自动驾驶落地路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

如何用 RxJava 的 ParallelFlowable 做并行数据处理?parallel、runOn 与 sequential 用法及适用边界

如何用 RxJava 的 ParallelFlowable 做并行数据处理?parallel、runOn 与 sequential 用法及适用边界 【免费下载链接】RxJava RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequ…

📰

Java+大数据+AI全能工程师知识体系与实战避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬