分布式理论学习(四)

134 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

  1. TCC协议其实也就是三段提交只不过有些微不同:

    • try还是先查询是否可以执行

    • 但所有的服务try都返回ok的时候,事务协调器发送confirm请求,大家开始执行事务,在各自的confirm中提交事务。

    • 如果有一个服务失败了。事务协调器调用每个服务器的cancle,来恢复原来的状态。

      其实就是把回滚操作抽出来了一个cancle接口,是要程序员手写sql的,try也要写代码sql实现。。

在这里插入图片描述

 ​		缺点就是要写很多业务代码,try,cancle都要写。

4. MQ来实现事务

 rocketMQ支持事务消息,kafka和activeMQ不支持但是可以通过他们的ack来实现,这个后面讲:

 - 一个服务要执行事务之前,先给RoMQ发送一个propare信息(这个消息是不不能被消费的),然后直接执行事务,但不提交,执行完以后发送confirm消息给消息队列。
 - 这个时候消费者会消费到这条消息,然后开始执行他自己的事务,返回ack结果(可能是失败的也可能是成功的消息,消费成功与否)。如果消费失败,当你订单服务挂了,重新连接的时候会重新去消费那条消息。
 - 最后商品服务根据ROMQ的结果是提交还是回滚。

在这里插入图片描述

  • 分布式锁-学习redis实现和zookeeper实现

    分布式锁具有的条件:非阻塞的,单个服务可重入的,可以实现公平与非公平锁。

    • redis实现分布式锁:

      关键方法:(记住有个超时的设置)

      • setnx(); setnx(key,value) 如果key不存在,那么设置当前key的值为value,返回1,如果存在就返回0。
      • expire(),设置key的有效时限senx 不能直接设置有效时间,只能通过exprie(). 是为了防止,如果程序崩溃了,这个锁一直存在 (释放锁是通过删除key就行了)。所以设置一个过期时间,自动释放。这个是redis自己控制的过期时间。
      • getset(key,value) 往里面设置值的时候,如果成功就返回旧值,如果第一次的话是返回null。这个用于程序自己控制过期时间, 防止我的业务还没执行完,你的所要失效了,通过getset方法来演唱失效时间。