您当前的位置: 首页 > 

java持续实践

暂无认证

  • 2浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

分库分表 路由策略与全局ID

java持续实践 发布时间:2022-05-03 15:06:46 ,浏览量:2

分库分表支持的场景

用户的角度 : 查询订单信息 商家角度: 获取商家订单的角度.

用户下单后, 可能查询多个表. 根据一定的规则, 让同一个用户, 下单都落在同一个表中.

路由key: 根据用户id , 作为路由的key , 对表的数量进行取模.

多库多表 先找库, 再找表.

先根据用户的id , 对数据库的数量进行取模, 再去找对应的表. 在找对应表的时候, 除以表的数量, 再对表的数量进行取模, 防止根据库进行路由后, 只插入到某一个表中去. 在这里插入图片描述 商户的路由策略: 买家下完单之后, 发送订单消息到mq, 卖家去消费这个mq , 再根据商家id 进行路由, 插入商家的订单表中.

全局ID

引入全局id 的服务.

全局唯一id的算法, 雪花算法.

雪花算法

第一部分: 0 表示正数 第二部分: 41位时间戳 第三部分: 10位. 5位的数据中心, 5位的机器id. 2^10 = 1024. 在同一个时间戳下, 最多允许1024台机器, 得到全局唯一id . 第四部分: 12位的序列号 2^12 = 4096 在同一个时间戳下, 最多允许1024台机器来获取全局唯一id, 最多可以为每台机器分配4096个id.

雪花算法的时钟回拨问题

如果系统时间被调回之前的时间了, 那么可能导致生成的id是重复的. 解决的办法就是把每次获取的时间戳缓存起来, 每次获取的时间戳和上次缓存的时间戳进行比较, 如果小于, 那么就代表时间回拨了, 则取上次的时间戳加1, 或者抛异常处理.

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0383s