DDIA逐章精度小册学习【第一章】

418 阅读3分钟

最近突然开始对分布式系统感兴趣,一直听说MIT8.426课程 和 《Designing Data-Intensive Application》 (DDIA,数据密集型应用系统设计)这本书。在自律性不强的我发现了B站有视频精读,在学习完每一章节之后,也想自己留下笔记。 image.png

第一章 可靠性,可扩展性,可维护性

这里留下文档链接和视频链接: B站:www.bilibili.com/video/BV1bY… DDIA驻章精读:ddia.qtmuniao.com/#/ch01

该文章仅作为个人学习,更多的记一些概念词,不逐一具体解析。

数据系统(data system)是一种模糊的统称。我们常见的绝大部分应用背后都有一套数据系统支撑,比如微信、京东、微博等等。

[常见的数据系统有哪些]

  • 存储数据,以便之后再次使用——数据库 关系型/非关系型/对象存储
  • 记住一些非常“重”的操作结果,方便之后加快读取速度——缓存
  • 允许用户以各种关键字搜索、以各种条件过滤数据——搜索引擎
  • 源源不断的产生数据、并发送给其他进程进行处理——流式处理
  • 定期处理累积的大量数据——批处理
  • 进行消息的传送与分发——消息队列 推与拉的模式

数据系统的日益复杂化: 新型的数据系统,它们不拘泥于单一的功能,也难以生硬的归到某个类别。随便举几个例子: Kafka【1.存储一段时间日志数据 2.流式处理】,Spark,Redis【1.作为缓存数据库 2.发布订阅 3.分布式锁】。

redis常见的缓存读写策略:旁路策略,读写穿透,异步缓存写入 缓存读写策略与延迟双删的关系。都是为了解决一致性的问题。 (38条消息) redis探索之常用的三种缓存读写策略

如何构建一个好的数据系统?书中提到非常重要的三个词: 可靠性(Reliability)、可伸缩性(Scalability)、可维护性(Maintainability)

如何衡量可靠性?

  • 功能上
    1. 正常情况下,应用行为满足 API 给出的行为
    2. 在用户误输入/误操作时,能够正常处理
  • 性能上 在给定硬件和数据量下,能够满足承诺的性能指标。
  • 安全上 能够阻止未授权、恶意破坏。 可用性也是可靠性的一个侧面,云服务通常以多少个 9 来衡量可用性。

可靠性的原因主要体现在以下几点: 硬件问题【1.网络 2.硬盘 3.内存 4.散热】,软件问题【1.边界值 2.级联故障 3.组件依赖无响应】,人为原因【1.系统中人最不可靠的是人 2.编码设计 3.测试阶段】

可伸缩性: 没办法优先考虑,但是最好在设计时留出口子。 衡量负载 描述性能 应对负载:【纵向伸缩:加机器 横向伸缩:并联”很多廉价机,分摊负载】 负载伸缩的两种方式:自动 手动 All in 云原生

可维护性: 从软件的整个生命周期来看,维护阶段绝对占大头。

但大部分人都喜欢挖坑,不喜欢填坑。因此有必要,在刚开就把坑开的足够好。有三个原则:

  • 可维护性(Operability)  便于运维团队无痛接手。
  • 简洁性(Simplicity)  便于新手开发平滑上手:这需要一个合理的抽象,并尽量消除各种复杂度。如,层次化抽象。
  • 可演化性(Evolvability) * 便于后面需求快速适配:避免耦合过紧,将代码绑定到某种实现上。

把以上的都考虑到了,才会是一个合格的数据系统。