朱晔的互联网架构实践心得 S1E10:数据的权衡和折腾【系列完】
【下载本文 PDF 进行阅读】
本文站在数据的维度谈一下在架构设计中的一些方案对数据的权衡以及数据流转过程中的折腾
这两个事情。最后进行系列文章的总结和之后系列文章写作计划的一些展望。
数据的权衡
正所谓鱼和熊掌不能兼得,舍了才能得。架构或技术设计方案中针对数据这个事情,有太多体
现了权衡思想的地方。
空间和时间
我们来想想有哪些广义上空间换时间(性能)的例子,也就是通过使用更多的存储或内存空间
加快了任务的单次执行速度或总体吞吐量:
• 让数据在更快的地方:也就是缓存。速度和价格本来就是矛盾的,我们不可能 10 万买到
百公里加速在 4 秒内的高性能跑车。存储虽便宜但是速度慢,内存虽然贵但是速度快,使
用级联的缓存存储方案我们可以在这当中做一个平衡。不仅仅是架构设计上我们几乎都会
用到缓存,CPU 会有多级缓存,OS 也有页面缓存机制。
• 让数据一次性提交:也就是缓冲。在进行 IO 操作的时候,真正和磁盘和网络交互之前,
我们往往都会建立缓冲区。在大多数的时候进行 IO 操作对于 10 字节和 100 字节的数据需
要的 IO 时间是一样的,我们可以在缓冲区进行短时间的数据累积后一次性进行操作,这
种做法不一定能提高单次执行性能但是可以增加吞吐(对于繁忙的系统,吞吐达到瓶颈后
单次的执行会排队,所以反过来也可以认为提高单次性能)。
• 让数据更靠近用户:CDN 就是一个典型应用。让数据离用户更近意味数据不需要经过太多
的机房和链路交换就可以到达用户终端,显然可以提高访问性能。其实说白了就是让数据
在离用户更近的地方缓存一份,在客户端缓存也算。
• 让数据面向查询存储:相对于面向存储优化。常见的存储数据结构上,我们知道写入性能
最好的是追加文件的日志存储,然后是 LSM 树然后是 B+树,读取性能则反过来。为了性
能我们通常会在保存数据时候进行一定的排序分类然后按一定的数据结构保存,而不仅仅
是把原始信息存下来,这样在查询搜索的时候避免了数据全扫。这些特殊的(甚至有的时
候是额外的)数据结构的维护也体现了空间换时间。