分布式锁
redis
实现方式
流行用setnx方法,设置成功则获取锁,redis可以设置过期时间
缺点
第一是在setnx方法之后,设过期时间之前redis宕机仍然可能死锁,且过期时间不好定;第二redis通常都是主从部署,可以看出redis是AP模型,而分布式锁需要实现CP模型,明显是不可实现的,具体表现在,如果在主节点A获取到了锁,此时还没同步到从节点B,主节点宕机,那么B从节点会变成主节点,此时其他服务是又可以获取分布式锁的
zookeeper
实现方式
zk通过添加同名节点成功者获取锁的方式实现,使用它的临时节点方式,可以在一个会话结束后自动释放节点,也就不存在需要定时释放的问题,哪怕程序异常断开了连接,节点没了会话维持也会自动失效
缺点
zk的强一致性使得在zk节点越多的情况下,获取分布式锁越慢,且在存在leader机器宕机的时候,zk的ZAB一致性协议会使zk集群暂时无法提供服务,直到选出leader,并恢复数据
优点
zk可以创建顺序节点,使用zk的watch机制,可以实现公平锁
数据库
通过表主键判断,插入成功获取锁,缺点明显,数据库IO是比较消耗性能的,不可重入,不可定时释放
调用链监控
概述
随着微服务调用链越来越复杂,急需一个调用链监控工具来进行监控和查找问题,google首先发布了一篇调用链论文Dapper,后续有人根据该论文推出了一系列开源项目
随着开源调用链产品增多,为了多语言结合不同调用链产品的兼容性,一个开源组织对调用链进行了规范,称为OpenTracing协议
方案
Dapper,google的调用链实现,未开源
zipkin
开源的调用链实现工具,现在已是SpringCloud的一个组件,支持开源协议OpenTracing
skywalking
国内的开源组件,非侵入字节码增强方式
pinpoint
非侵入字节码增强方式进行调用链监控,不需要埋点
cat
点评开发的一款链路追踪,具有更多的表报聚合数据展示
session共享
使用nginx的ip_hash策略保证同一个用户始终访问同一个服务器
使用数据库存放session,可以保证session持久化,不过在微服务情况下,各个微服务有自己的数据库这就不好用了
cookie存储session,这样每次请求都会携带session信息,消耗资源,不推荐
redis存储session,可以使用spring-session框架,它重写了httpSession