分布式相关

一致性哈希

对节点和key进行hash计算,分布在2^32槽的环上。
对于节点比较少的,虚拟节点防止数据倾斜。

性能标准

吞吐量,qps(每秒处理请求数),tps(每秒处理事务数)。
rt(请求延迟)。
95线99线就是95%,99%。并发100,可以达到80ms延迟,过95线。

id生成方案

id uuuid(32字节)
雪花(8字节 时间相关)
时钟回拨问题,发现重复阻塞5ms重试。
或者预留的值累加避免重复,如果累加到一定程度抛异常。

分布式事务

2pc,3pc是数据库层面的,而tcc是业务层面的。

  • 2pc
    协调者,参与者。
    第一步,协调者会发送给参与者事务请求,参与者进行预处理,记录undo,redo日志。
    第二步,协调者接到全部的返回,通知所有参与者进行统一操作。

  • 3pc
    与2pc类似,把第一步分为两步,保证参与者执行提交或者回滚任务,状态是一致的。另外协调者和参与者都加了超时检测机制,如果协调者发生故障,参与者可以在超时过后,执行提交。如果参与者发生故障,协调者收不到参与者的返回,可以继续进行统一回滚。2pc这两种情况,都会占用资源,阻塞各参与者的处理。

  • tcc(Try Confirm Cancel)事务补偿
    大致分3步,先try一下,根据try的结果,确定走confirm或者cancel。
    Try 阶段去占库存,Confirm 阶段则实际扣库存,如果库存扣减失败 Cancel 阶段进行回滚,释放库存。
    TCC 不存在资源阻塞的问题,因为每个方法都直接进行事务的提交,一旦出现异常通过则 Cancel 来进行回滚补偿,这也就是常说的补偿性事务。
    通常会利用事务表来记录事务提交情况,避免空回滚,悬挂,幂等问题。
    空回滚,try超时了执行cancel时,应该不走业务,直接return。
    在try是插入事务记录,cancel时发现事务记录没有,就插入事务记录(避免悬挂问题),return;
    悬挂,try超时了执行cancel,之后try又执行,如果再try方法里执行了记录锁定,可能就释放不了锁了。在执行try之前先检查是否已经有事务记录了,如果已经存在就不执行try。
    幂等,执行前先检查下是否已经存在事务记录。

  • mq
    保证节点事务和消息原子操作,发给下游,下游也同样,执行任务返回消息。

  • sega
    事务1,事务2,事务3
    事务1回滚操作,事务2回滚操作,事务3回滚操作
    按个执行事务,失败就执行对应的回滚操作。

你可能感兴趣的:(分布式相关)