当谈及网站架构解析与优化之道时,我们不禁要问:何为道,何为术?假设我们使用Java语言绘制一个大型网站,其典型架构如图-1所示。

大型网站的典型架构

然而,这张图并不能说明什么问题,因为实际的架构决策并不能在这张图上反映出来。比如:

  • 如何拆分服务?
  • 如何组织服务与服务之间的层次关系?
  • 如何设计接口?
  • 缓存数据结构与更新策略是什么样的?
  • 缓存宕机后系统是否可用?
  • 数据库如何分库分表?
  • 消息队列在什么地方使用?
  • 需要部署多少台Tomcat?
  • 需要部署多少台RPC服务?

这个问题的列表可以无限长。

本书将提供一个系统的方法论,帮助读者分析和解决这一系列问题。这个方法论,即是架构的道。

具体来说,对于技术问题,主要指高并发、高可用和一致性方面;对于业务问题,主要指业务的需求分析和业务建模。

这些方法论来自于大量的业务系统实践,并在实践基础上进行了思考和总结。道的东西往往比较虚,可能说了半天对方还是不知道你说的是什么。但越是“虚”,越是“抽象”,就越有必要阐释清楚,而这正是要试图解决的问题:把抽象玄奥的业务方法论、晦涩难懂的分布式一致性理论,用通俗的语言表达出来,让读者可以从一个“最朴素的角度”去看待这些理论。

但要讲道,首先得讲术,因为得先有“地基”。

术方面的事情大家比较容易理解,就是某种具体的语言、框架或中间件的使用技巧。术的东西比较具体,具有实操性,容易描述,不会陷入“不知所云”的局面。

本书会尽可能把道局限在解决“业务的技术问题”层面,尽可能“言之有物”,避免大而空洞。

道与术的辩证关系在武侠小说中,练就一门顶级武功,会同时涉及两个东西:一是内功心法,二是外部招式。前者是道,后者是术。

但凡武林中的顶级高手,一定具有深厚的内功。那些招式花哨但内功不深厚的人,在江湖上通常只能在平常人中耀武扬威,一旦跟高手过招,往往只需几个回合就会原形毕露。

这样比喻道和术的关系很容易理解。但这样说又有夸大内功心法、轻视外部招式的嫌疑,让人觉得内功心法比外部招式重要,导致外部招式被忽视。

在中国哲学(主要来自儒家)中,一直有一个核心思想:“知行合一”。

个人觉得用这个来表达道和术的关系会更为贴切。“知”,是理论,是套路,是解决问题的方法论;“行”,是实践,是操作,用于解决一个个实际问题。

先有实践,然后总结出理论,用理论指导新的实践,在新的实践中再总结出新的理论。如此循环往复,即是归纳和演绎循环往复的过程,也是螺旋式上升的过程。

具体到软件架构,就是道和术都不能偏废,一方面需要不断实践,在实践中深究原理;另一方面要把实践的东西抽象、总结出来,形成方法论。

但在实际中,为什么很多人热衷于术,而不是道呢?因为在短期能看到术的结果,想要看到道的效果却需要长期地修炼,必须到了一个顿悟的拐点,才能发出惊人的能量。

除了从“知”和“行”的角度去看待,还可以从“问题”和“答案”的角度去看待。术偏重“答案”,是工具,是锤子;道偏重“问题”,是钉子。

可能是拿着锤子去找钉子,也可能是遇到钉子再去想找个锤子或造个锤子。

最后总结一下两者的关系,如表所示。

| 道与术的关系 | 描述 |
| :—: | :—: |
| 道偏重“问题” | 指导思路,解决问题的大方向 |
| 术偏重“答案” | 解决问题的具体工具和方法 |
| 相互依存 | 道指导术,术实现道 |

总之,在网站架构解析与优化之道的道路上,我们既要有深厚的理论功底,又要具备扎实的实战经验。只有这样,才能真正把握住道和术的辩证关系,不断提升自己的技术水平和思维方式,为我国互联网事业的发展贡献自己的一份力量。