图工程综述——大规模图计算引擎与框架全览
大规模图计算是互联网基础设施的重要组成部分。社交网络中的好友关系、金融风控中的资金流转链路、供应链中的货品追溯,本质上都是图结构问题。本文专注计算范式、批量与增量引擎、规模化算法和基准测试;图数据库、知识图谱与 GNN 的全链路地图见《深入图工程》,Agent 编排中的图模型则由《Coding Agent 领域的 Graph Engineering》展开。 图计算范式 Pregel 与 BSP 模型 2010 年,Google 在 SIGMOD 发表 Pregel 论文,确立了大规模图计算中影响深远的"以顶点为中心"(vertex-centric)编程抽象。开发者实现单个顶点的计算逻辑,系统负责分区、消息传递和全局协调。 执行单元是超步(superstep):所有活跃顶点先并行执行用户定义的 compute() 函数,顶点通过消息向邻居传递结果,消息在超步间缓冲;当前超步内所有顶点计算完毕后进行全局屏障同步,再进入下一超步。 这是 Leslie G. Valiant 在 1990 年提出的 BSP(Bulk Synchronous Parallel)模型在图...
深入图工程
图(Graph)作为数据结构,在计算机科学里存在了半个多世纪。“图工程”(Graph Engineering)并不是边界明确的正式学科名称,本文把它作为一个工作定义:围绕图的建模、存储、查询、计算、学习、运维与验证形成的系统工程。图规模、消费者和时效性要求扩大之后,这些原本分散的工作需要放进同一套方法中讨论。 图工程的学科定位 图工程在本文中承载两层含义。第一层是以图数据为中心的系统工程,涵盖建模、存储、查询、计算和学习全链路。第二层来自 AI Agent 领域:有些框架直接采用有向状态图,有些采用 crew、conversation、handoff 或普通工作流抽象;"图"是分析这些编排关系的统一视角,但并非每个框架的字面核心。两层含义的交叉点是 Agent 以知识图谱或代码图作为上下文源。计算引擎的细节见《图工程综述》,Agent 编排的边界见《Coding Agent 领域的 Graph Engineering》。 与传统数据工程的关键分野在于: 分区目标通常难以精确求解。关系型数据常按主键 hash 或 range 分片;图分区需要同时考虑负载、割边...
Unix 常用命令
Unix 常用命令全景指南 本文系统梳理 Unix/Linux 环境下的高频命令,从命令行语法基础到生产环境实战,覆盖文件操作、文本处理、系统监控、开发工具四大场景。 目录 命令行基础 文件与目录操作 文本处理三剑客 系统与资源监控 开发环境工具链 磁盘告警定位实战 磁盘扩容实战 命令行基础 命令行参数的三元素 Unix 命令行由三种基本元素组成:选项、位置参数和子命令。 基本结构 1command [options] [positional_arguments] 选项(Options) 以 - 或 -- 开头的参数,用于修改命令行为: 类型 格式 示例 短选项 - + 单个字母 -a, -v, -h 长选项 -- + 单词 --help, --verbose 带参数的选项 -n value 或 --name=value -n namespace, --port=8080 短选项支持合并书写:ls -la 等价于 ls -l -a。 位置参数(Positional Arguments) 不带连字符的参数,其含义由出现的位置决定: 123cp so...
深入 Logstash 17 - Logstash 的演进与 Elastic Agent 的冲击
上一篇把 Logstash 和 Fluentd、Vector 放在一起横向对比。这一篇转向纵向:Logstash 自 2009 年诞生以来历经哪些关键演进,Elastic Agent 和 OpenTelemetry Collector 的出现又如何重新划定了它的边界。 核心问题:持久队列、DLQ、pipeline-to-pipeline 一路补齐的是什么——当 Elastic Agent 分走了边缘采集场景、OTel 提供了厂商中立的替代方案,Logstash 今天的定位是什么。 本篇的版本坐标截至 2026-08:Logstash 的最新发布版本是 9.5.2,8.19 分支仍在维护。下面时间线里每一行的版本归属,取自官方 release notes 的原文,或该功能文档在各发布分支上的首次出现;发布日期取自对应 tag 的提交时间。全系列统一的版本前提见第 01 篇。 演进时间线 123456789101112131415161718版本 发布 关键变化───────────────────────────────────────────────────────...
深入 Logstash 16 - Logstash vs Fluentd vs Vector:日志管道的三种取舍
上一篇厘清了 Logstash、Beats、Ingest Pipeline 在 Elastic Stack 内部的分工。这一篇跳出 Elastic 生态,把 Logstash 和来自 CNCF 生态的 Fluentd 以及 Rust 实现的 Vector 放在一起比较,回答一个跨生态的架构选择问题。 核心问题:三者在插件生态、资源占用、性能、可靠性这四个维度上各自取了什么——JVM 系与原生系的根本差异体现在哪里,什么场景下差异会决定选型。 三方现状以 Logstash 9.5.x、Fluentd v1、Vector v0.57 为准,插件/组件计数与仓库活跃度取自 2026-08。跨生态对比的时效性衰减比机制类内容快得多,所以下面每个量化断言都标了统计口径和取数来源,便于日后自己重新核一遍。全系列统一的版本前提见第 01 篇。 三者的基本参数 12345工具 语言运行时 开源年份 归属──────────────────────────────────────────────────Logstash JVM + JRuby 20...
深入 Logstash 15 - Logstash vs Beats vs Ingest Pipeline:该用谁
上一篇讲完了性能调优的系统方法。这一篇进入演进对比阶段,把 Logstash、Beats 和 Elasticsearch Ingest Pipeline 三者并排放,回答一个工程决策问题:同样是把数据搬进 ES,三种路径在哪里分叉,分叉的依据是什么。 核心问题:轻量采集用 Beats,简单解析下沉到 Ingest Pipeline,复杂转换才留给 Logstash——这条分工逻辑背后的资源、能力和可靠性代价是什么? 本篇的三方现状以 Logstash 9.5.x、Elasticsearch 8.19/9.x 的 ingest 文档、Filebeat 与 Elastic Agent 9.x 为准,数据取自 2026-08。全系列统一的版本前提见第 01 篇。 三者的定位 Elastic Stack 的数据接入层有三个层次,各自定位不同: 123456789101112数据源 │ ├─▶ [Beats / Elastic Agent] Go 语言,轻量级进程,低资源 │ │ Beats 单一职责;Agent 单进程整合多...
深入 Logstash 14 - 性能调优:JVM heap、批处理与持久队列磁盘
上一篇解决了怎么用 Node Stats API 和 hot threads 定位瓶颈在哪一段。这一篇进入调优执行层:拿到瓶颈定位结论之后,heap 大小、GC 策略、batch 与 worker 组合、持久队列磁盘 I/O 各应该怎么调。 核心问题:heap 大小与 GC 停顿之间的取舍;pipeline.workers 与 pipeline.batch.size 的组合效果;持久队列磁盘成为瓶颈时的判断和处置。 调优对象全景 1234567891011121314151617181920212223242526 调优旋钮分布图┌────────────────────────────────────────────────────────┐│ JVM 层 ││ heap size (jvm.options: -Xms / -Xmx) ││ off-heap (PQ mmap page / direct memory / 线程栈) ...
深入 Logstash 13 - 监控:Node Stats API、hot threads 与瓶颈定位
上一篇解决了 Multiple Pipelines 的隔离与路由问题。这一篇进入运维调优阶段的第一个主题:怎么从指标判断管道卡在 input、filter 还是 output,以及 hot threads API 的读法。 核心问题:一条管道吞吐下降时,靠什么指标定位瓶颈在哪一段?plugin 级别的耗时从哪里拿到?hot threads 输出能读出什么信息? 监控数据的来源 12345678910111213141516171819202122 Logstash 进程┌──────────────────────────────────────────────┐│ ││ input plugins ││ └─ events.in counter ││ ││ [queue](仅 qu...
深入 Logstash 12 - Multiple Pipelines 与 pipeline-to-pipeline
上一篇讲清了 DLQ 如何把逻辑上永久无法处理的 event 隔离到独立存储、等待补救管道重处理。这一篇进入另一个维度的隔离:一个 Logstash 进程里运行多条管道,管道之间互不干扰,又能通过 virtual address 串联成拓扑。 核心问题是三个:多管道的资源和生命周期如何隔离,pipeline-to-pipeline 通信怎么实现,以及什么时候该用多管道而不是在单管道里写 conditional。 单管道的局限 单管道(一个 logstash.conf)在简单场景下够用,但遇到两类需求时会暴露问题: 123456789101112问题一:不同数据流的处理要求差异大 - syslog 流:高吞吐、无状态 filter、8 个 worker - 慢查询日志:低频、复杂 Grok、2 个 worker - 同一管道里 worker 数只能统一设,无法按流分配资源问题二:任一 output 挂掉,整条管道停摆 - Logstash 默认在任一 output 不可用时阻塞整条管道 (这是 at-least-once 投递保证的代价,不是缺陷) - 同时写 ES...
深入 Logstash 11 - 死信队列(DLQ):无法处理的 event 去哪
上一篇讲清了持久队列如何在崩溃边界上把 at-least-once 的保证落盘。这一篇进入另一类失败:event 本身在逻辑上就无法被 output 接受,不管重试多少次都不会成功。这类 event 的归宿是死信队列(Dead Letter Queue,DLQ)。 核心问题是三个:什么样的失败会写进 DLQ,DLQ 里的 entry 长什么样,以及怎么读出来重新处理。 两类失败:重试能解的和重试解不了的 持久队列解决的是"崩溃之后不丢 event",但"不丢"和"能处理"是两回事。一个 event 从 PQ 里出来、送往 Elasticsearch,ES 有可能返回两类错误: 12345678瞬时失败(transient): ES 集群暂时不可达、写入超时、节点临时过载 → 重试就有机会成功,Logstash 的 retry 逻辑能处理永久失败(permanent / document-level): mapping 冲突(往 integer 字段写了 string 值) index 的 mapping 不接受这...




