原子、组合与汇编
应用程序里可以任意写SQL语句,到了数据库这层,所有的SQL语句都被做了编排。
- 在应用层可以同步、异步的投递SQL语句:s1, s2,s3,...。混在意大利面条一样的代码里,看不到谁先执行谁后执行。
- 在数据库层,这些语句会被编排。编排后,实际的执行时序可能是 s2,25,s1,s3,s4...
- 那么数据库层面的顺序或者并发执行才是这些语句被编排后实际执行的顺序,这些顺序决定了程序的最终状态。
这个例子在计算机的无数场景下反复发生:
- UI的渲染,在渲染的合并层处理后,最终构成了原子渲染任务,渲染引擎根据编排的顺序同步或异步渲染任务序列。
- K8S编排的最终是docker 基本单元
- 一个大型系统有N个模块组成,每个模块有多个分支。N个模块组合N个不同的分支就构成了一个系统的一个「分支」,在系统层面看问题如何解决系统分支A和系统分支B之间很棘手,但是放在原子单元,模块这个地方来处理,就是尽量让一个模块的m个分支之间做好同步就解决了。
- 程序执行的时候,如果要调试,就是用各种工具把实际的执行堆栈trace出来,函数无论被class如何编排,最终在一个线程内都是顺序执行的。
任何一个系统,分为Executor和Scheduler两层
- Executor 要负责把每个原子的问题在一个目标任务类型上执行
- 当 Executor 把不同的原子问题的执行解决了,Scheduler 就开始介入,编排和调度一组或者一个树的Executor。
这个问题本质上就是:复杂系统的线性化,AX=Y,A就是编排系 Scheduler,X就是原子的Executor,得到的Y就是系统。当我们解决计算机问题的时候,一定要主动识别这是一个 Executor 问题,还是这是一个 Scheduler 问题。一般来说,企业里的管理层已经不直接写代码,他们常常认为问题是 Scheduler 层的问题,实际上问题通常是要在Executor层解决问题,因为这是原子的真正执行的节点。
--end--