自底向上分析boltdb源码之精简版

2022-03-16 00:00:00 向下 方式 组件 采用 向上

前言

boltdb是一个纯go编写的磁盘型kv数据库、支持事务,底层采用b+树来组织数据。目前主要的用途是做分布式组件的wal,或者单机磁盘型数据存储。对数据库感兴趣的小伙伴,非常值得一读boltdb的源码。代码量不大只有3k~4k,但功能很强大,从中可以学到不少知识。boltdb项目还是蛮出名的,现在由etcd团队在维护,etcd维护的组件叫bbolt,从boltdb fork而来,此外还有其他的一些知名的开源项目在生产环境使用boltdb。本文初是本着好奇心和兴趣的驱使,后通过一种自底向上的方式对boltdb内部实现一探究竟。

本文采用自底向上的方式来介绍boltdb内部的实现原理。其实我们经常都在采用自底向上或者自顶向下这两种方式来思考和求解问题。

例如:我们阅读源码时,通常都是从顶层的接口点进去,然后层层深入内部。这其实本质上就是一种自顶向下的方式。再比如我们平常做开发时,都是先将系统进行拆分、解耦。然后一般都会采用从下而上或者从上而下的方式来进行开发迭代。
又比如在执行OKR的时候,我们通常都是先定目标、然后依据该目标再层层分解。后分解到可执行的单元为止。这其实是一种自顶向下的方式;在真正执行时,我们通常又是从原先分解到底层的原子单元开始执行,然后层层递进。终所有的原子单元执行完后,我们的目标也就实现了。这其实又是自底向上的完成任务方式。

前面所提到的上下其实是指某些事物、组件、目标内部是存在相互依赖、因果、先后、递进关系,而依赖方或者结果方则位于上,被依赖方、原因方位于下;个人认为自下而上的方式比较适合执行每一个任务或者解决子问题,每一层做完时,都可以独立的进行测试和验证。当我们层层自下而上开发。后将前面的所有东西拼接在一起时,就构成了一个完整的组件或者实现了该目标。

回到初的话题,为什么本文要采用自底向上的方式来写呢?
对于一个文件型数据库而言,所谓的上指的是暴露给用户侧的调用接口。所谓的下又指它的输出(数据)终要落到磁盘这种存储介质上。采用自底向上的方式的话,也就意味着我们先从磁盘这一层进行分析。然后逐步衍生到内存;再到用户接口这一层。层层之间是被依赖的一种关系。这样的话,其实就比较好理解了。在本文中,本人采用自底向上的方式来介绍。希望阅读完后,有一种自己从0到1构建了一个数据库的快感。

当然也可以采用自顶向下的方式来介绍,这时我们就需要在介绍上层时,先假设它所依赖的底层都已经就绪了,我们只分析当层内容。然后层层往下扩展。

之前和一位大佬进行过针对此问题的探讨,在不同的场景、不同的组件中。具体采用自底向上还是自顶向下来分析。见仁见智,也具体问题具体分析。

相关文章