设计数据密集型应用 —— 分区

序言

在大数据的场景中,单机节点常常无法满足海量数据的存储和访问需求,我们需要把数据库切成多块,分别存储到不同的节点。每一块数据被称作一个分区(partition),有时也被称作分片(sharding)。

使用分区是为了实现扩展性(scalability)。不同的分区存储在不同的节点上,一次查询请求就可以分发到多个节点,在每个节点上并发执行,收集各个节点的返回数据并获得最终结果。

分区和副本常常是结合在一起使用的。一份数据被存储在某个分区,同一个分区又复制多个副本存储。下图是一个单主集群的存储示例:

Read More

设计数据密集型应用3 —— 数据存储与读取

序言

上一篇我们介绍了数据模型和查询语言相关的原理,本篇我们介绍实际的数据库引擎,数据存储和读取的实现方式。当实际工作中遇到数据库选型和性能调优的问题时,掌握这些知识至关重要。

不同类型的存储引擎,会针对不同类型的负载做优化。事务处理(online transaction processing, OLTP)的场景与数据分析(online analytic processing, OLAP)的场景,对应的存储引擎设计方案差距巨大。

我们来看看主流数据库中使用最多的两种数据引擎:日志结构的存储引擎(Log Structured Merge Tree,LSM-Tree)与页结构的存储引擎(B-Tree)

Read More

设计数据密集型应用2 —— 数据模型与查询语言

引言

在数据密集型应用设计中,数据模型处于核心地位,描述了数据以怎样的方式被组织在一起,对应用的设计方案有着深远影响。

大部分应用程序都是分层的,每一层提供一套数据模型抽象,屏蔽下一层的复杂细节,围绕这一层抽象,各层之间的开发人员能够高效地沟通合作。

现实中存在着各种各样的数据模型,每一种模型都包含了对其使用场景的假设,在某些场景,该数据模型使用简单且运行高效,但是在某些场景,该数据模型配置复杂甚至无法支持。深入理解数据模型使用场景的相关假设,对于应用程序的技术选型和最终实现至关重要。

本章主要描述各种通用的数据模型以及相应的数据查询语言。

Read More

Java并发编程

序言

过去的数十年,摩尔定律是推动IT行业发展的底层引擎,集成电路芯片上所集成的电路的数目,每隔18个月就翻一倍, 计算能力的提升使得许多想象不到的场景成为了现实。

然而随着硅片线路密度的增加,其复杂性和差错率也呈指数增长,到达纳米级别时,材料的物理、化学性能将发生质的变化,摩尔定律也就要走到尽头。

当一匹马拉不动车的时候,我们不是去换一匹更强壮的马,而是用四匹马来拉。近年来,我们不再拼命提升单个CPU的计算能力,而是靠多个CPU或者多台计算机(分布式集群)同时计算,来获得更强大的计算能力。为了驱动多CPU同时计算, 我们需要具有并发能力的程序。

Read More

重新出发

博客停止更新已经有两年了。为什么会停止更新呢?

两年对于互联网行业是一段很长的时间。两年间各项新技术风起云涌,AI、区块链、流处理、serverless,太多的新事物让人目眩,来不及用笔尖记录定格。

个人换到了一家大公司,每天接触大量的前沿信息和业界牛人,眼界的开阔让自己逐渐变得谦逊,不再愿意记录一些不成熟的思考。经历了一次晋升之后,更多地关注起架构及管理领域的知识,但终归是实践不足而不愿意泛泛而谈。

那么就这样到此为止了么?

当然不会,停留是为了更好地抵达,沉默是为了更好地爆发。

Read More

Guava 源码笔记系列第一章 -- ImmutableList

本系列博客的目标读者是和我一样的初级Java 程序员。

有关源码阅读

入门一种编程语言,阅读经典类库或框架的代码,无疑是十分有效的方法,但是瀚若星辰的类库,选择哪一个阅读,常常让初学者无所适从。

我个人的体验是,通常一些Utils类库或者UT框架是一个不错的起点,这些库/框架解决的是通用的问题,不涉及复杂的应用场景,易于上手,并且由于被广泛使用,代码质量有可靠保证。

Guava, 类似Boost 之于 c++, 可以算作Java的“准标准库”,未来版本的JDK很可能吸收Guava中一些优秀的设计并作为标准库一部分,正是入门学习Java代码的好资料。

Read More