标签搜索系统设计——导读

这是一个关于"系统如何在业务压力下一步步演进"的真实故事。

如果你曾经面对过这样的困境:需求越来越多、代码越来越乱、每次迭代都像在拆炸弹——那这个系列或许能给你一些参考。

全系列文章在【专题文章】-【标签搜索系统】下找到

这个系列是写给谁的

写给那些在业务快速发展期做过后端系统设计的工程师。不是教科书式的架构讲解,而是一个系统从零开始、在真实业务压力下不断演进的过程记录——包括当时为什么这么选、踩了哪些坑、又是怎么一步步把坑填上的。

读完这个系列,你会看到:

  • 一个搜索系统是如何从最简单的 CQRS 架构出发,逐步演进成支持配置化标签规则的复杂系统的
  • EAV 模型、责任链、自定义 DSL 这些技术方案,在真实业务场景下是怎么被"逼出来"的
  • 工程师在面对"最小成本"和"长期可维护性"之间的权衡时,是如何做决策的

系统演进的主线

整个系列围绕一个图书信息聚合搜索系统展开。这个系统的演进可以分为两个阶段:

业务发展期:系统从无到有,每一步都在用最小成本解决当前最紧迫的问题。

业务稳定保障期:系统已经积累了足够多的"技术债",到了不得不做大迭代的时候。

两个阶段的核心矛盾不同:发展期追求"快",稳定期追求"可维护"。这个转变本身,也是这个系列想传递的一个重要观点。

文章列表

业务发展期

  • [01] 基本搜索系统搭建 —— 从 CQRS 架构开始
  • [02] 灵活扩展非自有属性 —— EAV 存储模型的引入
  • [03] 外部系统接入 —— 如何保障跨系统数据一致性
  • [04] 搜索项和属性解绑 —— 业务发展带来的熵增
  • [05] 配置化标签系统 —— 搜索项的双重身份
  • [06] EAV 存储异构优化 —— 修复问题,扩展性重构
  • [07] 标签嵌套规则 —— 系统中的妥协与代价

业务稳定保障期:大迭代

  • [08] 离线属性计算解耦 —— 用 HiveSQL 替代 Java 代码
  • [09] 事件聚合异构更新 —— 责任链重构 CQRS 设计
  • [10] 自定义标签规则 DSL —— 用 TDD 推动设计

每篇文章的结构

为了方便阅读,每篇文章都遵循相同的结构:

  1. 需求背景:当时业务上发生了什么,为什么需要做这件事
  2. 核心矛盾:问题的本质是什么,为什么不能用更简单的方式解决
  3. 方案设计:选择了什么方案,为什么是这个方案而不是其他方案
  4. 技术 Demo:关键代码和数据模型示例
  5. 成本评估:这次迭代前后,开发维护成本的变化

一个贯穿始终的设计原则

在整个演进过程中,有两个原则反复出现:

原则一:用最小成本解决当前问题。 不要为了技术而技术,不要在业务还没验证的时候就过度设计。

原则二:当系统难以维护时,果断重构。 技术债是有利息的,拖得越久代价越大。

这两个原则看起来有些矛盾,但它们其实是同一件事的两面:在合适的时机做合适的事。


从下一篇开始,我们从最简单的搜索系统出发。