RPC
rpc
1.服务的地址怎么知道?注册中心
2.一个服务可能有多台机器可以调用?负载均衡算法
3.怎么调用?io模型和线程模型和序列化协议和同步异步
4.调用失败怎么办?容错策略比如重试或者选择其他机器掉调用
分布式ID
分库分表后,表的全局id
1)数据库自增id,适合并发不高,数据量大的场景;
2)UUID,适合文件名,编号;
3)时间戳+用户id+业务编号:可能会重复
4)snowflake雪花算法:twitter 0|时间|机房id|机器id|同机房同机器同时间会自增,极限值与cpu性能有关(位运算),独立服务部署,时钟回拨问题
5)时间戳+Redis incr id
分布式会话
1)Token JWT
2)tomcat+session:与tomcat耦合,如果换成其他Web服务器比如jetty不行
3)springsession
分布式事务
刚性事务:强一致性,支持ACID
柔性事务:最终一致性,隔离性不完全保证,BASE理论的产物
刚性事务:2PC、3PC
柔性事务:补偿型事务和通知型事务
补偿型事务(同步事务):TCC和Saga
通知型事务(异步事务):最大努力通知事务和事务消息
事务消息:基于MQ自身的事务消息方案和基于DB的本地事务消息表方案
最大努力通知事务:基于事务消息的最大努力通知事务和基于DB消息表的最大努力通知事务
RocketMQ实现分布式事务
分布式限流
计数器 redis字符串带过期时间
固定窗口
滑动窗口
漏桶算法
令牌桶算法
分布式协议与算法
分布式锁
谈谈zk与redis分布式锁的区别
1、获取锁的方式:redis不断尝试,死循环;zk获取不了锁注册监听器;
2、客户端挂了:redis需要等待超时时间;zk知道客户端挂了,删除节点;
3、redis是AP,zk是CP,redis实现分布式锁有bug,单点不现实,如果主从复制当主节点挂了,加锁的key还没同步到从节点,其他客户端就加锁成功了
怎么实现redis分布式锁
加锁:
setnx命令
当一个key不存在时 ,才能设置成功
释放锁:
del key
ex秒 px毫秒
为了防止客户端挂了不能删除锁,所以要给锁设置超时时间
可能锁已经超时了自动删除但是客户端还没有执行完加锁代码,所以客户端要给锁续约,比如redisson的看门狗
公平锁实现原理
重入锁实现原理