 领域驱动设计&中台/用状态机封装领域逻辑用状态机封装领域逻辑 潘加宇 CONTENTS 01 状态机的作用 02 状态机要点和建模思路 03 状态机的实现 危险! 小孩耍大枪 危险! 新瓶装旧酒  Research?Re-Search?  连Re-Search都没有,随意发明新词  Subdomain?主题图。 测试 答对问题有奖金 金额从2.56元到20.48元 请扫我微信以便当场转账 加微信时烦告知尊姓大名 三个不同的图 图形 视角 映射到实现 类图 全局、静态 类的签名 序列图 局部(用例)、动态 类之间的协作 状态机图 类、动态 所有的逻辑 测试 答对问题有奖金 金额从2.56元到20.48元 请扫我微信以便当场转账 加微信时烦告知尊姓大名 作用 逻辑内移 都以为自己在做正常的事情, 系统却出问题了 强制封装保护信息完整性 条件语句?泛化?不重要了 作用 帮助定义恰当的责任 测试 答对问题有奖金 金额从2.56元到20.48元 请扫我微信以便当场转账 加微信时烦告知尊姓大名 状态 入口动作和出口动作 entry:进入时必须执行 exit:离开时必须执行 逻辑进一步内收 迁移 迁移的结构和执行顺序 1. 当前状态是否能接受事件 2. 警戒条件 如果为真 3. Exit:先子后父 4. Action和Message 5. 改变状态0 码力 | 30 页 | 1.75 MB | 1 年前3 领域驱动设计&中台/用状态机封装领域逻辑用状态机封装领域逻辑 潘加宇 CONTENTS 01 状态机的作用 02 状态机要点和建模思路 03 状态机的实现 危险! 小孩耍大枪 危险! 新瓶装旧酒  Research?Re-Search?  连Re-Search都没有,随意发明新词  Subdomain?主题图。 测试 答对问题有奖金 金额从2.56元到20.48元 请扫我微信以便当场转账 加微信时烦告知尊姓大名 三个不同的图 图形 视角 映射到实现 类图 全局、静态 类的签名 序列图 局部(用例)、动态 类之间的协作 状态机图 类、动态 所有的逻辑 测试 答对问题有奖金 金额从2.56元到20.48元 请扫我微信以便当场转账 加微信时烦告知尊姓大名 作用 逻辑内移 都以为自己在做正常的事情, 系统却出问题了 强制封装保护信息完整性 条件语句?泛化?不重要了 作用 帮助定义恰当的责任 测试 答对问题有奖金 金额从2.56元到20.48元 请扫我微信以便当场转账 加微信时烦告知尊姓大名 状态 入口动作和出口动作 entry:进入时必须执行 exit:离开时必须执行 逻辑进一步内收 迁移 迁移的结构和执行顺序 1. 当前状态是否能接受事件 2. 警戒条件 如果为真 3. Exit:先子后父 4. Action和Message 5. 改变状态0 码力 | 30 页 | 1.75 MB | 1 年前3
 降级预案在同程艺龙的工程实践-王俊翔数据采集、计算、存储 指标(HBase) 指标明细(ES) 降级⽇日志(ES) ETL 指标计算(Flink) 脚本引擎 查 询 服 务 ⽇日志数据 指标(Redis) 业务异常数据快照(ES) 熔断降级通知 降级服务管理理 故障代码注⼊入 降级服务注册设计 serviceA serviceB serviceC etcd register service metadata MVEL 表达式引擎 降级服务管理理 • 降级服务管理理 • 应⽤用、服务、策略略产品化、数据化 • 应⽤用、服务指标实时监控,健康状态评估 • 实时监测服务降级执⾏行行状态,降级发⽣生点数据 快照及时回溯 • 降级策略略管理理 • 多种策略略⽅方案:失效备援、服务熔断、资源隔 离、延迟处理理 • 策略略灵活调整,实时监控策略略运⾏行行状态 应⽤用 / 服务 降级代码管理理 •0 码力 | 26 页 | 18.67 MB | 1 年前3 降级预案在同程艺龙的工程实践-王俊翔数据采集、计算、存储 指标(HBase) 指标明细(ES) 降级⽇日志(ES) ETL 指标计算(Flink) 脚本引擎 查 询 服 务 ⽇日志数据 指标(Redis) 业务异常数据快照(ES) 熔断降级通知 降级服务管理理 故障代码注⼊入 降级服务注册设计 serviceA serviceB serviceC etcd register service metadata MVEL 表达式引擎 降级服务管理理 • 降级服务管理理 • 应⽤用、服务、策略略产品化、数据化 • 应⽤用、服务指标实时监控,健康状态评估 • 实时监测服务降级执⾏行行状态,降级发⽣生点数据 快照及时回溯 • 降级策略略管理理 • 多种策略略⽅方案:失效备援、服务熔断、资源隔 离、延迟处理理 • 策略略灵活调整,实时监控策略略运⾏行行状态 应⽤用 / 服务 降级代码管理理 •0 码力 | 26 页 | 18.67 MB | 1 年前3
 领域驱动设计&中台/架构分层模型适配DDD分层参考架构 DDD分层参考架构 给⽤用户提供界⾯面,关注⽤用户交互和体验 前端应⽤用 API服务 业务领域 基础设施 为前端应⽤用提供API服务,关注事务和分布式等技术性问题 领域模型和领域逻辑,关注业务概念。 访问外界系统(调⽤用外界系统)的技术相关实现。 后台服务 前端应⽤用 分层依据: ⼲干系⼈人和技术点 DDD分层参考架构 - 前端应⽤用 DDD重点关注后台业务服务,不不解决前端交互问题 认证 • 缓存 • ⽇日志 • 异常处理理 • 配置 • Session 技术⼈人员关注的层 腐化案例例: ⼤大量量业务逻辑堆积 模型: • View Object • Resource Model DDD分层参考架构 领域模型和领域逻辑,关注业务概念。 前端应⽤用 API服务 领域模型 基础设施 ⼲干系⼈人: 业务领域专家,业务领导 诉求: 表现业务概念和实现业务价值 表现业务概念和实现业务价值 要点: 业务建模和复杂性管理理 ⼯工作内容: • 建⽴立业务模型,并体现在代码上 • 管理理模型复杂度,适度拆分模块 • 实现业务逻辑 业务⼈人员关注的层 业务领域 腐化案例例: 亏空 ⼤大量量技术术语业务⼈人员完全看不不懂 模型: • 应⽤用服务 — 跨Bond Context DTO • 领域服务 — 跨聚合 • 聚合 实体 仓库 事件0 码力 | 39 页 | 2.54 MB | 1 年前3 领域驱动设计&中台/架构分层模型适配DDD分层参考架构 DDD分层参考架构 给⽤用户提供界⾯面,关注⽤用户交互和体验 前端应⽤用 API服务 业务领域 基础设施 为前端应⽤用提供API服务,关注事务和分布式等技术性问题 领域模型和领域逻辑,关注业务概念。 访问外界系统(调⽤用外界系统)的技术相关实现。 后台服务 前端应⽤用 分层依据: ⼲干系⼈人和技术点 DDD分层参考架构 - 前端应⽤用 DDD重点关注后台业务服务,不不解决前端交互问题 认证 • 缓存 • ⽇日志 • 异常处理理 • 配置 • Session 技术⼈人员关注的层 腐化案例例: ⼤大量量业务逻辑堆积 模型: • View Object • Resource Model DDD分层参考架构 领域模型和领域逻辑,关注业务概念。 前端应⽤用 API服务 领域模型 基础设施 ⼲干系⼈人: 业务领域专家,业务领导 诉求: 表现业务概念和实现业务价值 表现业务概念和实现业务价值 要点: 业务建模和复杂性管理理 ⼯工作内容: • 建⽴立业务模型,并体现在代码上 • 管理理模型复杂度,适度拆分模块 • 实现业务逻辑 业务⼈人员关注的层 业务领域 腐化案例例: 亏空 ⼤大量量技术术语业务⼈人员完全看不不懂 模型: • 应⽤用服务 — 跨Bond Context DTO • 领域服务 — 跨聚合 • 聚合 实体 仓库 事件0 码力 | 39 页 | 2.54 MB | 1 年前3
 大规模分布式系统架构下调测能力构建之道头到尾梳理代码,再写一堆的mock语句把他们全mock掉了。 每当业务逻辑变化了,代码中要增减相应的mock语句;每当依 赖服务上线后,要把测试用例中对应的mock语句去掉。对测试 用例的修改工作贯穿于整个开发工作之中。 3. 我和某同事通过服务框架进行调用联调,结果另一同事也把同 名服务挂了上来,不幸的是,他的服务版本和我们的不一样, 结果,一系列的灵异状况发生了… 4. 依赖的远程服务逻辑发生变化了,但负责它的团队没有通知到 44 应用服务契约测试 契约测试 通过mock手段可以解决外部不可控因素对本地调测的影响,如果真实的外 部服务改变了,我们的mock数据也要随之改变,但 问题是: 我们如何及时感知到服务接口/逻辑发生变化了? 解决方法:契约测试 通过将契约测试集成到CI流程中,在构建的过程中完成接口的联调测试,和 接口变动的验证测试,从而实现对接口变动的及时感知。 Consumer 报告 Provider DataBase SandBox 1.为每个开发人员或测试人员提供一个单独(schema/catalog)的测试数据库。 2.预置数据独立管理,并通过测试框架提供预置数据前置导入及后置清除能力。 逻辑上支持“租户”隔离模式的分布式服务一般对多团队并行开发/调测的支持较好,分布式环境下,一般不会成为工程效率提升 的瓶颈。针对这类服务,不用急于构建其Mock服务,可以根据其特性,寻找成本较低的实现途径。0 码力 | 19 页 | 2.74 MB | 1 年前3 大规模分布式系统架构下调测能力构建之道头到尾梳理代码,再写一堆的mock语句把他们全mock掉了。 每当业务逻辑变化了,代码中要增减相应的mock语句;每当依 赖服务上线后,要把测试用例中对应的mock语句去掉。对测试 用例的修改工作贯穿于整个开发工作之中。 3. 我和某同事通过服务框架进行调用联调,结果另一同事也把同 名服务挂了上来,不幸的是,他的服务版本和我们的不一样, 结果,一系列的灵异状况发生了… 4. 依赖的远程服务逻辑发生变化了,但负责它的团队没有通知到 44 应用服务契约测试 契约测试 通过mock手段可以解决外部不可控因素对本地调测的影响,如果真实的外 部服务改变了,我们的mock数据也要随之改变,但 问题是: 我们如何及时感知到服务接口/逻辑发生变化了? 解决方法:契约测试 通过将契约测试集成到CI流程中,在构建的过程中完成接口的联调测试,和 接口变动的验证测试,从而实现对接口变动的及时感知。 Consumer 报告 Provider DataBase SandBox 1.为每个开发人员或测试人员提供一个单独(schema/catalog)的测试数据库。 2.预置数据独立管理,并通过测试框架提供预置数据前置导入及后置清除能力。 逻辑上支持“租户”隔离模式的分布式服务一般对多团队并行开发/调测的支持较好,分布式环境下,一般不会成为工程效率提升 的瓶颈。针对这类服务,不用急于构建其Mock服务,可以根据其特性,寻找成本较低的实现途径。0 码力 | 19 页 | 2.74 MB | 1 年前3
 领域驱动设计&中台/淘宝应用架构升级——反应式架构的探索与实践多个流之间才可能是并⾏行行的 Your Mouse is a Database! — Erik Meijer 流定义 • ⾯面向数据 • 操作、组合 ⾯面向流 • 业务逻辑 → 数据变换 • 数据变换 → 业务逻辑 数据 vs 逻辑 ⾯面向流编程是 ⾯面向数据编程 流式架构 流 分布式 性能 并发控制 业务编写 流 - 业务编写 创建 just / from* / range 集群/流量量⼤大/核⼼心有认知 * ⽅方便便看升级改造效果 2. 瓶颈 match 升级 (如 CPU 压不不满、IO较多、⾼高Load) * 可以确定获得⼤大⽐比例例收益 3. 业务逻辑简单优先 * 尤其在改造起步阶段,降低难度 4. 业务压⼒力力不不⼤大 * 有业务升级改造资源投⼊入 实施难点和策略略 • 团队 • 缺乏技能 • 缺乏意识 • 业务0 码力 | 27 页 | 1.13 MB | 1 年前3 领域驱动设计&中台/淘宝应用架构升级——反应式架构的探索与实践多个流之间才可能是并⾏行行的 Your Mouse is a Database! — Erik Meijer 流定义 • ⾯面向数据 • 操作、组合 ⾯面向流 • 业务逻辑 → 数据变换 • 数据变换 → 业务逻辑 数据 vs 逻辑 ⾯面向流编程是 ⾯面向数据编程 流式架构 流 分布式 性能 并发控制 业务编写 流 - 业务编写 创建 just / from* / range 集群/流量量⼤大/核⼼心有认知 * ⽅方便便看升级改造效果 2. 瓶颈 match 升级 (如 CPU 压不不满、IO较多、⾼高Load) * 可以确定获得⼤大⽐比例例收益 3. 业务逻辑简单优先 * 尤其在改造起步阶段,降低难度 4. 业务压⼒力力不不⼤大 * 有业务升级改造资源投⼊入 实施难点和策略略 • 团队 • 缺乏技能 • 缺乏意识 • 业务0 码力 | 27 页 | 1.13 MB | 1 年前3
 领域驱动设计&中台/物联网平台的反应式设计Shadow Rules Engine Security & Identity Message Queue Storage RESTFul API IoT Applications 单体的逻辑架构 Devices IoT Applications Load Balance Nginx Web Console MySQL MongoDB Replica Redis Cluster “color”: “RED”, “state”: “ON” } }, “version”: 12 } 设备影⼦子处理理逻辑 Devices MongoDB Replica Redis Cluster EMQ Node NodeX IoT Applications FindShadow SetDesired SendDeltaEvent SyncDelta Redis Cluster “${DeviceName}_delta”: { “delta”: { … } } 新的逻辑架构 Devices IoT Applications Load Balance Nginx Web Console EMQ Cluster IoT PaaS EMQ Node10 码力 | 18 页 | 1.81 MB | 1 年前3 领域驱动设计&中台/物联网平台的反应式设计Shadow Rules Engine Security & Identity Message Queue Storage RESTFul API IoT Applications 单体的逻辑架构 Devices IoT Applications Load Balance Nginx Web Console MySQL MongoDB Replica Redis Cluster “color”: “RED”, “state”: “ON” } }, “version”: 12 } 设备影⼦子处理理逻辑 Devices MongoDB Replica Redis Cluster EMQ Node NodeX IoT Applications FindShadow SetDesired SendDeltaEvent SyncDelta Redis Cluster “${DeviceName}_delta”: { “delta”: { … } } 新的逻辑架构 Devices IoT Applications Load Balance Nginx Web Console EMQ Cluster IoT PaaS EMQ Node10 码力 | 18 页 | 1.81 MB | 1 年前3
 领域驱动设计&中台/化繁为简--DDD驱动复杂业务软件架构的演进接口 模型检查 上下文 CAD翻模 上下文 钢筋计算 上下文 截面钢筋模 型上下文 Facade模式 解决: 接口不规范,多套接口 外部接口深入到上游的业务逻辑 限界上下文解耦-发布订阅机制 钢筋模型 上下文 建模模型 上下文 调度中心 平法模型 上下文 发布 解决: 上游模型变化,下游模型联动 发布-订阅机制 架构演进 BIM模型持久化 …... 构件模型 …... …... …... …... …... …... 平法模型 钢筋模型 模型转换 案例1:CAD翻模领域拆分及分层设计 • 隔离功能交互与业务逻辑 • 识别算法独立,引入人工智能算法 持久化层 领域层 CAD图纸管理 CAD翻模UI 显示层 应用层 CAD图层管理 CAD识别命令 CAD模型 CAD模型持久化 CAD识别算法 简化了集成关系,降低了集成成本,实现各业务的独立发布; • 驱动组织按领域边界拆分了7~9个特性团队,实现并行研发; 限界上下文的拆分 + 领域模型+ 接口设计/测试 • 支撑产品转型,快速实现业务服务化; • 提升业务逻辑的可复用性,新业务快速扩展 • 人工智能技术低成本快速应用; 架构分层,隔离UI/业务/技术 感悟 领域模型是表达业务功能背后业务本 质的模型,在建立领域模型的过程中 领域专家与统一语言不可或缺0 码力 | 33 页 | 1.25 MB | 1 年前3 领域驱动设计&中台/化繁为简--DDD驱动复杂业务软件架构的演进接口 模型检查 上下文 CAD翻模 上下文 钢筋计算 上下文 截面钢筋模 型上下文 Facade模式 解决: 接口不规范,多套接口 外部接口深入到上游的业务逻辑 限界上下文解耦-发布订阅机制 钢筋模型 上下文 建模模型 上下文 调度中心 平法模型 上下文 发布 解决: 上游模型变化,下游模型联动 发布-订阅机制 架构演进 BIM模型持久化 …... 构件模型 …... …... …... …... …... …... 平法模型 钢筋模型 模型转换 案例1:CAD翻模领域拆分及分层设计 • 隔离功能交互与业务逻辑 • 识别算法独立,引入人工智能算法 持久化层 领域层 CAD图纸管理 CAD翻模UI 显示层 应用层 CAD图层管理 CAD识别命令 CAD模型 CAD模型持久化 CAD识别算法 简化了集成关系,降低了集成成本,实现各业务的独立发布; • 驱动组织按领域边界拆分了7~9个特性团队,实现并行研发; 限界上下文的拆分 + 领域模型+ 接口设计/测试 • 支撑产品转型,快速实现业务服务化; • 提升业务逻辑的可复用性,新业务快速扩展 • 人工智能技术低成本快速应用; 架构分层,隔离UI/业务/技术 感悟 领域模型是表达业务功能背后业务本 质的模型,在建立领域模型的过程中 领域专家与统一语言不可或缺0 码力 | 33 页 | 1.25 MB | 1 年前3
 领域驱动设计&中台/如何让DDD落地我想要⼀一个电商 平台,我可以在 上⾯面卖东⻄西 ? Event Storming⾥里里缺少了了什什么信息 提交订单的时候 要做什什么检查? 如何添加商品? ⽀支付订单的时候和 ⽀支付宝对接的逻辑 是什什么样的? 魔⻤鬼隐藏在细节之中 今天既然是讲落地,那么就从⼀一个实际需求出发,我们看看 如何把需求拆解成⽤用户故事,然后如何把⽤用户故事转变成领 域故事,最后领域故事⼜又如何变成为代码。 ��������� Ø ��Equals()�� Ø ����/���� Ø ���(Immutable) Ø ��Address/Color 如何区分应⽤用服务和领域服务 应⽤用服务(很薄,没有业务逻辑) 领域聚合A 领域聚合B 领域聚合C 领域服务 领域服务 领域服务 X 领域服务之间最好不不要相互直接调⽤用 使⽤用什什么架构 六边形架构为什什么是六条边 领域故事中的对象怎么对应到架构上 软件中最痛苦的就是需求经常发⽣生变化,这也是DDD想要解 决的问题之⼀一, 03 当需求发⽣生变化时 为什什么需求会变化? 需求提出者不不⼀一定想好了了 需求提出者的问题变化了了 沟通过程信息丢失 需要增加⼀一些业务逻辑时 3.创建订单服务收到命令后,会把创建订单命令转换成订单,然后调⽤用订单仓库进⾏行行 保存,保存成功后会让事件发布器器发布订单已创建事件 4.事件发布器器会根据事件类型把订单已创建事件转发给商品库存订阅者,订单⽇日志订0 码力 | 32 页 | 3.25 MB | 1 年前3 领域驱动设计&中台/如何让DDD落地我想要⼀一个电商 平台,我可以在 上⾯面卖东⻄西 ? Event Storming⾥里里缺少了了什什么信息 提交订单的时候 要做什什么检查? 如何添加商品? ⽀支付订单的时候和 ⽀支付宝对接的逻辑 是什什么样的? 魔⻤鬼隐藏在细节之中 今天既然是讲落地,那么就从⼀一个实际需求出发,我们看看 如何把需求拆解成⽤用户故事,然后如何把⽤用户故事转变成领 域故事,最后领域故事⼜又如何变成为代码。 ��������� Ø ��Equals()�� Ø ����/���� Ø ���(Immutable) Ø ��Address/Color 如何区分应⽤用服务和领域服务 应⽤用服务(很薄,没有业务逻辑) 领域聚合A 领域聚合B 领域聚合C 领域服务 领域服务 领域服务 X 领域服务之间最好不不要相互直接调⽤用 使⽤用什什么架构 六边形架构为什什么是六条边 领域故事中的对象怎么对应到架构上 软件中最痛苦的就是需求经常发⽣生变化,这也是DDD想要解 决的问题之⼀一, 03 当需求发⽣生变化时 为什什么需求会变化? 需求提出者不不⼀一定想好了了 需求提出者的问题变化了了 沟通过程信息丢失 需要增加⼀一些业务逻辑时 3.创建订单服务收到命令后,会把创建订单命令转换成订单,然后调⽤用订单仓库进⾏行行 保存,保存成功后会让事件发布器器发布订单已创建事件 4.事件发布器器会根据事件类型把订单已创建事件转发给商品库存订阅者,订单⽇日志订0 码力 | 32 页 | 3.25 MB | 1 年前3
 唯品会调度系统的前世今生当当开源的分布式任务调度系统 代码较新,使用Quartz进行调度。提供 高可用和分布式功能 功能单一,只支持Java,不支持 Shell(PHP)和消息驱动的作业调度 对任务超时、任务执行情况、监控逻辑 支持粒度功能较单一或缺乏 没有容器化选型? 调度产品的定位 简易开发、简单维护 高可用、分片并发处理、资源调度动态平衡 支持Java、Shell以及本地模式(VIP还支持消息模式) 统一配置、统一监控、统一管理 change listener for PathA Set PathA=1 Set PathA=0 Event notify or not? Set PathA=0 解决办法: 监听逻辑不做值判断,只做事件判断;保证处理逻辑幂等。 坑2-ZK掉线恢复后状态改变 Executor-A Executor-B ZK断线 接管分片1 分片1的zk数据被修改 执行分片1 ZK重连成功 断线前未完成的ZK0 码力 | 58 页 | 5.40 MB | 1 年前3 唯品会调度系统的前世今生当当开源的分布式任务调度系统 代码较新,使用Quartz进行调度。提供 高可用和分布式功能 功能单一,只支持Java,不支持 Shell(PHP)和消息驱动的作业调度 对任务超时、任务执行情况、监控逻辑 支持粒度功能较单一或缺乏 没有容器化选型? 调度产品的定位 简易开发、简单维护 高可用、分片并发处理、资源调度动态平衡 支持Java、Shell以及本地模式(VIP还支持消息模式) 统一配置、统一监控、统一管理 change listener for PathA Set PathA=1 Set PathA=0 Event notify or not? Set PathA=0 解决办法: 监听逻辑不做值判断,只做事件判断;保证处理逻辑幂等。 坑2-ZK掉线恢复后状态改变 Executor-A Executor-B ZK断线 接管分片1 分片1的zk数据被修改 执行分片1 ZK重连成功 断线前未完成的ZK0 码力 | 58 页 | 5.40 MB | 1 年前3
 声明式自愈系统——高可用分布式系统的设计之道-王昕协调Desired State跟 Realized State之间的差 距,维持最终一致性 Ø 定期处理集群中的事件 Ø 系统必须是幂等的 控制器的设计理念 控制逻辑应该只依赖于当前状态 假设任何错误的可能,并做容错处理 尽量避免复杂状态机,逻辑不要依赖无法监控的内部状 态 每个模块都可以在必要时优雅地降级服务 每个模块都可以在出错后自动恢复 假设任何命令都可能被任何调用对象拒绝,甚至返回错 误结果 注意设置超时 Ø 尽量避免用全局事物 Ø 注意慢操作可能造成的客户端冲突问题 最佳实践分享 有关缓存的使用 Ø 缓存的内容:服务发现应答,DNS 结果,元数据, 数据,之前的请求 Ø 逻辑正确性不能依赖缓存,写操作服务端必须有校 验而且幂等,没有缓存情况下系统仍可服务 Ø 错误回复缓存,过期时间不能太长,而且有清晰的 修复建议 Ø 数据库更新与缓存失效的策略 最佳实践分享0 码力 | 44 页 | 2.47 MB | 1 年前3 声明式自愈系统——高可用分布式系统的设计之道-王昕协调Desired State跟 Realized State之间的差 距,维持最终一致性 Ø 定期处理集群中的事件 Ø 系统必须是幂等的 控制器的设计理念 控制逻辑应该只依赖于当前状态 假设任何错误的可能,并做容错处理 尽量避免复杂状态机,逻辑不要依赖无法监控的内部状 态 每个模块都可以在必要时优雅地降级服务 每个模块都可以在出错后自动恢复 假设任何命令都可能被任何调用对象拒绝,甚至返回错 误结果 注意设置超时 Ø 尽量避免用全局事物 Ø 注意慢操作可能造成的客户端冲突问题 最佳实践分享 有关缓存的使用 Ø 缓存的内容:服务发现应答,DNS 结果,元数据, 数据,之前的请求 Ø 逻辑正确性不能依赖缓存,写操作服务端必须有校 验而且幂等,没有缓存情况下系统仍可服务 Ø 错误回复缓存,过期时间不能太长,而且有清晰的 修复建议 Ø 数据库更新与缓存失效的策略 最佳实践分享0 码力 | 44 页 | 2.47 MB | 1 年前3
共 17 条
- 1
- 2













