diff --git a/notes/分布式问题分析.md b/notes/分布式问题分析.md index 82ba4179..7236790b 100644 --- a/notes/分布式问题分析.md +++ b/notes/分布式问题分析.md @@ -29,7 +29,7 @@ 分布式存储中可以将数据分片到多个节点上,不仅可以提高性能(可扩展性),同时也可以使用多个节点对同一份数据进行备份(高可用性)。 -至于分布式计算,就是将一个大的计算任务分解成小任务分配到多台节点上去执行,再汇总每个小任务的执行结果得到最终结果。MapReduce 是分布式计算的最好例子。 +至于分布式计算,就是将一个大的计算任务分解成小任务分配到多个节点上去执行,再汇总每个小任务的执行结果得到最终结果。MapReduce 是分布式计算最好的例子。 # 二、分布式事务 @@ -42,16 +42,16 @@ ## 应用场景 -- 下单:减少库存、更新订单状态。库存和订单不在同一个数据库,因此涉及分布式事务。 -- 支付:买家账户扣款、卖家账户入账。买家和卖家账户信息不在同一个数据库,因此涉及分布式事务。 +- 下单:减少库存、更新订单状态。库存和订单如果不在同一个数据库,就涉及分布式事务。 +- 支付:买家账户扣款、卖家账户入账。买家和卖家账户信息如果不在同一个数据库,就涉及分布式事务。 ## 解决方案 ### 1. 两阶段提交协议 -[两阶段提交](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E4%B8%80%E8%87%B4%E6%80%A7%E5%8D%8F%E8%AE%AE.md#%E4%B8%A4%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4%E5%8D%8F%E8%AE%AE) +> [两阶段提交](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E4%B8%80%E8%87%B4%E6%80%A7%E5%8D%8F%E8%AE%AE.md#%E4%B8%A4%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4%E5%8D%8F%E8%AE%AE) -两阶段提交协议可以很好得解决分布式事务问题,它可以使用 XA 来实现,XA 它包含两个部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如 Oracle、DB2 这些商业数据库都实现了 XA 接口;而事务管理器作为全局的协调者,负责各个本地资源的提交和回滚。 +两阶段提交协议可以很好地解决分布式事务问题。它可以使用 XA 来实现,XA 包含两个部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如 Oracle、DB2 这些商业数据库都实现了 XA 接口;而事务管理器作为全局的协调者,负责各个本地资源的提交和回滚。 ### 2. 消息中间件 @@ -59,25 +59,25 @@ #### 2.1 消息处理模型 -**(一)点对点** +(一)点对点

-**(二)发布/订阅** +(二)发布/订阅

#### 2.2 消息的可靠性 -消息的发送端的可靠性:发送端完成操作后一定能将消息成功发送到消息系统。 +(一)发送端的可靠性 -消息的接收端的可靠性:接收端仅且能够从消息中间件成功消费一次消息。 - -**(一)发送端的可靠性** +发送端完成操作后一定能将消息成功发送到消息系统。 在本地数据建一张消息表,将消息数据与业务数据保存在同一数据库实例里,这样就可以利用本地数据库的事务机制。事务提交成功后,将消息表中的消息转移到消息中间件,若转移消息成功则删除消息表中的数据,否则继续重传。 -**(二)接收端的可靠性** +(二)接收端的可靠性 + +接收端仅且能够从消息中间件成功消费一次消息。 保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的。