左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家,骨灰级程序员
立即订阅
40357 人已学习
课程目录
已完结 108 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 | 洞悉技术的本质,享受科技的乐趣
免费
01 | 程序员如何用技术变现(上)
02 | 程序员如何用技术变现(下)
03 | Equifax信息泄露始末
04 | 从Equifax信息泄露看数据安全
05 | 何为技术领导力?
06 | 如何才能拥有技术领导力?
07 | 推荐阅读:每个程序员都该知道的知识
08 | Go语言,Docker和新技术
09 | 答疑解惑:渴望、热情和选择
10 | 如何成为一个大家愿意追随的Leader?
11 | 程序中的错误处理:错误返回码和异常捕捉
12 | 程序中的错误处理:异步编程以及我的最佳实践
13 | 魔数 0x5f3759df
14 | 推荐阅读:机器学习101
15 | 时间管理:同扭曲时间的事儿抗争
16 | 时间管理:如何利用好自己的时间?
17 | 故障处理最佳实践:应对故障
18 | 故障处理最佳实践:故障改进
19 | 答疑解惑:我们应该能够识别的表象和本质
20 | Git协同工作流,你该怎么选?
21 | 分布式系统架构的冰与火
22 | 从亚马逊的实践,谈分布式系统的难点
23 | 分布式系统的技术栈
24 | 分布式系统关键技术:全栈监控
25 | 分布式系统关键技术:服务调度
26 | 分布式系统关键技术:流量与数据调度
27 | 洞悉PaaS平台的本质
28 | 推荐阅读:分布式系统架构经典资料
29 | 推荐阅读:分布式数据调度相关论文
30 | 编程范式游记(1)- 起源
31 | 编程范式游记(2)- 泛型编程
32 | 编程范式游记(3) - 类型系统和泛型的本质
33 | 编程范式游记(4)- 函数式编程
34 | 编程范式游记(5)- 修饰器模式
35 | 编程范式游记(6)- 面向对象编程
36 | 编程范式游记(7)- 基于原型的编程范式
37 | 编程范式游记(8)- Go 语言的委托模式
38 | 编程范式游记(9)- 编程的本质
39 | 编程范式游记(10)- 逻辑编程范式
40 | 编程范式游记(11)- 程序世界里的编程范式
41 | 弹力设计篇之“认识故障和弹力设计”
42 | 弹力设计篇之“隔离设计”
43 | 弹力设计篇之“异步通讯设计”
44 | 弹力设计篇之“幂等性设计”
45 | 弹力设计篇之“服务的状态”
46 | 弹力设计篇之“补偿事务”
47 | 弹力设计篇之“重试设计”
48 | 弹力设计篇之“熔断设计”
49 | 弹力设计篇之“限流设计”
50 | 弹力设计篇之“降级设计”
51 | 弹力设计篇之“弹力设计总结”
52 | 管理设计篇之“分布式锁”
53 | 管理设计篇之“配置中心”
54 | 管理设计篇之“边车模式”
55 | 管理设计篇之“服务网格”
56 | 管理设计篇之“网关模式”
57 | 管理设计篇之“部署升级策略”
58 | 性能设计篇之“缓存”
59 | 性能设计篇之“异步处理”
60 | 性能设计篇之“数据库扩展”
61 | 性能设计篇之“秒杀”
62 | 性能设计篇之“边缘计算”
63 | 区块链技术的本质
64 | 区块链技术细节:哈希算法
65 | 区块链技术细节:加密和挖矿
66 | 区块链技术细节:去中心化的共识机制
67 | 区块链技术细节:智能合约
68 | 区块链技术 - 传统金融和虚拟货币
69 | 程序员练级攻略:开篇词
70 | 程序员练级攻略:零基础启蒙
71 | 程序员练级攻略:正式入门
72 | 程序员练级攻略:程序员修养
73 | 程序员练级攻略:编程语言
74 | 程序员练级攻略:理论学科
75 | 程序员练级攻略:系统知识
76 | 程序员练级攻略:软件设计
77 | 程序员练级攻略:Linux系统、内存和网络
78 | 程序员练级攻略:异步I/O模型和Lock-Free编程
79 | 程序员练级攻略:Java底层知识
80 | 程序员练级攻略:数据库
81 | 程序员练级攻略:分布式架构入门
82 | 程序员练级攻略:分布式架构经典图书和论文
83 | 程序员练级攻略:分布式架构工程设计
84 | 程序员练级攻略:微服务
85 | 程序员练级攻略:容器化和自动化运维
86 | 程序员练级攻略:机器学习和人工智能
87 | 程序员练级攻略:前端基础和底层原理
88 | 程序员练级攻略:前端性能优化和框架
89 | 程序员练级攻略:UI/UX设计
90 | 程序员练级攻略:技术资源集散地
91 | 程序员面试攻略:面试前的准备
92 | 程序员面试攻略:面试中的技巧
93 | 程序员面试攻略:面试风格
94 | 程序员面试攻略:实力才是王中王
95 | 高效学习:端正学习态度
96 | 高效学习:源头、原理和知识地图
97 | 高效学习:深度,归纳和坚持实践
98 | 高效学习:如何学习和阅读代码
99 | 高效学习:面对枯燥和量大的知识
左耳听风
登录|注册

45 | 弹力设计篇之“服务的状态”

陈皓 2018-03-06
之前在我们讲的幂等设计中,为了过滤掉已经处理过的请求,其中需要保存处理过的状态,为了把服务做成无状态的,我们引入了第三方的存储。而这一篇中,我们来聊聊服务的状态这个话题。我认为,只有清楚地了解了状态这个事,我们才有可能设计出更好或是更有弹力的系统架构。
所谓“状态”,就是为了保留程序的一些数据或是上下文。比如之前幂等性设计中所说的需要保留每一次请求的状态,或是像用户登录时的 Session,我们需要这个 Session 来判断这个请求的合法性,还有一个业务流程中需要让多个服务组合起来形成一个业务逻辑的运行上下文 Context。这些都是所谓的状态。
我们的代码中基本上到处都是这样的状态。

无状态的服务 Stateless

一直以来,无状态的服务都被当作分布式服务设计的最佳实践和铁律。因为无状态的服务对于扩展性和运维实在是太方便了。没有状态的服务,可以随意地增加和减少结点,同样可以随意地搬迁。而且,无状态的服务可以大幅度降低代码的复杂度以及 Bug 数,因为没有状态,所以也没有明显的“副作用”。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《左耳听风》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(11)

  • mingshun
    这是近几年所在的团队维护的其中一个重要系统的过程:最初为提高处理性能和水平扩展性,就从有状态往无状态发展。但随着数据量越来越大时,分布式存储就成了瓶颈,经常因为存储系统同步不及时导致不同节点读到的数据不一致。而后又回到有状态,但不在节点间使用分布式存储,因为数据量实在太大。为了在出现故障能快速恢复,每个节点做成双机热备。每改一次架构都要分好几次在周末深夜做数据迁移,多么痛的领悟啊!
    理想情况下,计算密集型系统应该让存储向计算方移动,即做成无状态的;存储密集型系统应该让计算向存储移动,即做成有状态的。而上述架构来回修改的最终体会是,当计算和存储都密集的时候,应该整台机器地加,而且每台机器都要求有高的计算和存储性能。
    然而说到底,存储其实又是由独立于CPU之外的一个计算单元来处理,本质似乎又回到了计算。现在设计分布式系统时总是先想着怎么分离计算和存储,最终发现计算和存储又是如此密不可分。
    感觉我后半段的表述不太成立,打码久了不写人话的后果啊,望谅解!
    2018-05-22
    19
  • 北极点
    这里的这些方案,总体下来感觉架构上需要超丰富的经验!协调一大帮人来弄这个。现在接触到的系统没有这么复杂!有问题一般一个小点一个小点的优化。读了文章还是感觉很收益!谢谢!
    2018-03-09
    3
  • 今天我又逃课了
    两阶段提交和一致性算法讲的有点混
    2019-10-04
  • edisonhuang
    服务按照状态来分有无状态服务和有状态服务。
    无状态服务易于水平扩展,没有副作用,是比较符合函数式编程的理念。但是现实中的真实场景往往是有状态的,因此做到无状态服务就需要把相应状态数据转移到数据服务层来同步,会增大系统的时延和服务同步的复杂性。
    相对的是有状态的服务,有状态的服务数据和处理逻辑会保存在同一台机同一个进程,数据加载满足局部性原理,减少了网络调度的消耗,服务响应变快。但也会带来负载难均衡的问题,服务运维扩展也不容易。
    2019-07-05
  • 夏书
    有状态化拿CPA理论来衡量优点牵强,当我以结果为导向,来辨别有无状态。 如果分片设计了,在一定场景上无副作用。 我是否可以理解为是无状态
    2019-06-26
  • Geek_fb3db2
    讲了蛮多的无状态和有状态服务优缺点,但是总体来说无状态服务设计非常复杂,感觉需要非常高的系统架构,那么实际使用中,无状态使用多还是有状态的呢
    2018-12-04
  • 期待工作流引擎实现细节
    2018-05-10
  • 流迷的咸菜
    虽然有状态的服务可以通过sticky session的方式将数据本地化,但是当这个sticky session expire的时候,或者服务处理完成之后,其相关的数据仍然是要同步到数据库中的吧?

    作者回复: 不用,一般来说就是一个客户端cookie,或是uid分布一下,或是服务端的一个缓存。

    2018-04-12
  • 流迷的咸菜
    文中提到,同步有同步的问题,分片也有分片的问题。同步的话主要是数据一致性和效率问题。那么分片的话,请问,主要问题是数据在其他片区上,需要远程获取数据,和对其他片区数据的写问题吗?
    2018-04-12
  • kingeasternsun
    sixcky session和DHT哪里有详细的介绍,这篇文章里好多名词都不认识

    作者回复: 自行Google吧

    2018-04-03
  • 夜行观星
    皓哥,这篇是在讲是在讲Service Mesh的思想吗?

    作者回复: 不是,SM后面的文章会讲

    2018-03-06
收起评论
11
返回
顶部