6、分布式无状态设计及幂等设计

2019-04-30  本文已影响0人  小manong

一、服务的状态

1、定义
2、状态服务于无状态服务比较

总结:对于高可用服务的构建要求来说,快速failover以及快速扩容是非常重要的 服务有状态,服务当机就可能会存在数据丢失 关键是快速扩容,有状态服务会有冷启动的问题,还需要先加载数据才能对外提供服务,太麻烦了,在进行系统设计时,时刻要有这个意识,我们的应用服务器,要设计成无状态,不保存任何上下文信息。当然在实现诸如本地事物的时候可以考虑有状态设计。

3、在论无状态设计

(1)设计要点

1、保证冗余部署的多个模块(进程)完全对等
2、请求提交到冗余部署任意模块,处理结果完全一样
3、模块不存储业务的上下文信息
4、仅根据每次请求携带的数据进行相应的业务逻辑处理

(2)目的

1、快速扩容服务
2、弹性缩容服务

(3)无状态服务设计案例(session的保存)


无状态服务设计案例

二、服务的幂等设计

1、抽象概念

针对一个操作,不管做多少次,产生效果或返回的结果都是一样的

2、幂等案例
3、curd与幂等

1、查询对于结果是不会有改变的(无)
2、删除操作需要根据sql语句来定义(绝对值的修改是幂等的比如delete from user where age=10,相对值的修改不是幂等的比如delete from user bottom 10)
3、更新操作需要根据sql语句来定义(比如update user set age=10 where uid=20(绝对值修改)是幂等的,而update user set age++ where uid=20(相对值的修改)是非幂等的)
4、insert基本上不是幂等,除非表设计了一些约束(比如唯一主键等)

4、实现幂等技术

(1)数据表使用唯一主键(unique)或者联合主键保证
(2)token机制(redis+token):数据提交前要向服务的申请token,token放到redis,token有效时间;提交后后台校验token,同时删除token,完成相关业务逻辑。
(3)通过数据库悲观锁和乐观锁机制
(4)分布式锁
(5)根据业务进行状态机幂等设计

5、对外提供接口的api如何保证幂等

对外提供接口为了支持幂等调用,接口有两个字段必须传,一个是来源source,一个是来源方序列号seq,这个两个字段在提供方系统里面做联合唯一索引,这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,但实际已经处理了。


参考:
https://juejin.im/post/5c05f233e51d4524860fc51a
https://blog.csdn.net/rickiyeat/article/details/71081968

上一篇 下一篇

猜你喜欢

热点阅读