美文网首页Python微服务架构和实践
《Designing Data-Intensive Applic

《Designing Data-Intensive Applic

作者: 赤子心_d709 | 来源:发表于2017-12-27 15:24 被阅读117次

    前言

    老大突然给我这本书《Designing Data-Intensive Applications》,读一下,顺手记一下笔记
    这里就把对我有帮助的一些点记下来,不一定包含所有章节

    1.数据密集应用

    现在很多应用是数据密集型的,他们需要

    1.存储,读取数据(db)
    2.记录昂贵操作的结果来提升读性能(cache)
    3.支持索引,搜索(search index)
    4.发送消息给其他进程来异步处理(stream processing)
    5.周期性的处理一批数据(批处理)
    

    目前有很多不同特性的数据系统来满足对数据的不同要求。我们需要根据自身的场景去找到最合适的那些数据密集应用。

    2.数据系统的思考

    2.1把数据系统当成一个整体

    我们常常会把数据库,cache,queue(mq)这些当成不同的工具,因为他们有不同的access pattern,特性以及实现。
    但是他们都会存储数据,为什么不把他们当成'数据系统'一起看呢
    从下面两点,可以把他们当成'数据系统'一起来看

    2.1.1数据存储,处理工具的整合。

    最近一些数据存储,处理工具都进行了整合
    比如redis也可以当成mq来用(原本只是cache)
    kafka也有数据持久化的相关操作(原本只是mq)

    2.1.2业务的需求

    单一的db,cache,mq不再能满足业务的需求,业务往往需要多种数据系统协同工作,
    如db(mysql等) + cache(redis,memcache等) + mq(kafka等) + searchIndex(es,solr等) 这些组合
    比如一颗常见的应用包含的数据系统如下图所示


    db + cache +mq + searchIndex

    通过把多种工具的结合,提供服务API,隐藏具体实现,就可以将多个泛型的组件(如db,cache等)组装成一个满足自己需要的的数据系统。

    2.2数据系统引发的问题

    整合成统一一个数据系统,会引发一些问题

    当内部出错时,如何保证数据的正确以及完整性
    如何持续提供优质服务,即使部分系统降级,宕机
    如何应对load increase
    

    有很多因素决定了一个数据系统的设计,但是本书主要讲解下面三个方面

    3.数据系统的三要素

    • 可靠性:在面对软硬件以及人为错误的时候,能够正确持续的工作(达到预期)
    • 拓展性:有合理的方法应对系统的增长(数据量,流量,复杂度)
    • 可维护性:很多不同的人要维护当前的性能,并且在此基础上持续开发

    3.1可靠性

    定义:

    • 可靠性是指能够持续的,正确的工作,即使面对特定的fault(比如地球爆炸不算)
    • 能够容忍fault的系统叫做容错的
    • fault是指偏移预期,fail是指系统停止服务
    • 阻止fault的发生 优于 解决fault

    本章描述的faults都是可以解决的,如下

    3.1.1硬件fault

    如磁盘坏了,机房断电等
    解决方案:

    1.硬件上加冗余:比如备用电源等等
    2.软件上做到容错:比如一台机器重启,整个系统应该能监控并且做到短时间丢掉这个机器节点,保证整体服务的稳定
    

    3.1.2软件错误

    诸如各种bug

    特定的输入如除以0
    进程用光了CPU或者内存或者磁盘或者带宽
    第三方服务变慢,无法响应
    蝴蝶效应导致的failure等等
    

    解决方案:
    没有快速解决办法,只有一些小细节来help

    合理假设边界
    测试
    隔离
    允许重启恢复
    

    等等

    3.1.3人为错误

    就是说程序员bug的几率比硬件错误的几率要大得多
    解决方案

    1.合理设计API和admin后台等,减少error出现的机会
    2.独立的测试环境,脱离生产环境
    3.各种测试
    4.允许快速恢复:如回滚代码
    5.建立明确清晰的监控
    

    3.2可拓展性

    现在能处理1w并发的的系统不一定能处理未来10w并发的场景
    定义

    可拓展性就是来描述一个系统应对持续增长的load的能力
    

    3.2.1描述负载

    通过一些负载参数来描述,如

    web的qps
    磁盘的读写比
    聊天室的用户量
    cache的命中率
    

    3.2.2描述性能

    增加负载参数并保持系统资源(CPU、内存、网络带宽等)不变时,系统的性能如何受到影响?
    当增加负载时,如果希望保持性能不变,需要增加多少资源

    需要有特定的指标参数来描述,常用的如

    平均响应时间
    中位数响应时间(p50)
    高百分比响应时间(p95,p99等)
    

    3.2.3如何应对负载

    scale up:垂直拓展,机器提升配置
    scale out:加机器数量

    没有一个通用,适合所有场景的可拓展性的架构
    一个架构的拓展性应该建立在对它各种操作(如读写)的频繁程度的假设上

    3.3 可维护性

    分为三点,这里不详细介绍了

    • 可操作性
      就是方便运维操作,需要监控,追踪,及时更新发包等
    • 简单性
      代码好理解,文档详细等
    • 可进化型
      代码设计要有鲁棒性,易拓展等等

    4.小结

    本章主要引出数据密集应用,提出思考把数据系统(cache,db,mq,searchIndex)等当成一个整体,引发系统设计相关的问题,解决问题需要考虑到可靠性,拓展性,可维护性,并且按照这三点展开来讲,对于一些定义以及指标,解决方案提供了详细的说明

    refer

    https://www.jianshu.com/p/0c029f4928d4 刚好发现也有人在读

    相关文章

      网友评论

        本文标题:《Designing Data-Intensive Applic

        本文链接:https://www.haomeiwen.com/subject/msbygxtx.html