分库分表支持的场景
用户的角度 : 查询订单信息 商家角度: 获取商家订单的角度.
用户下单后, 可能查询多个表. 根据一定的规则, 让同一个用户, 下单都落在同一个表中.
路由key: 根据用户id , 作为路由的key , 对表的数量进行取模.
多库多表 先找库, 再找表.
先根据用户的id , 对数据库的数量进行取模, 再去找对应的表. 在找对应表的时候, 除以表的数量, 再对表的数量进行取模, 防止根据库进行路由后, 只插入到某一个表中去. 商户的路由策略: 买家下完单之后, 发送订单消息到mq, 卖家去消费这个mq , 再根据商家id 进行路由, 插入商家的订单表中.
引入全局id 的服务.
全局唯一id的算法, 雪花算法.
雪花算法 第一部分: 0 表示正数 第二部分: 41位时间戳 第三部分: 10位. 5位的数据中心, 5位的机器id. 2^10 = 1024. 在同一个时间戳下, 最多允许1024台机器, 得到全局唯一id . 第四部分: 12位的序列号 2^12 = 4096 在同一个时间戳下, 最多允许1024台机器来获取全局唯一id, 最多可以为每台机器分配4096个id.
如果系统时间被调回之前的时间了, 那么可能导致生成的id是重复的. 解决的办法就是把每次获取的时间戳缓存起来, 每次获取的时间戳和上次缓存的时间戳进行比较, 如果小于, 那么就代表时间回拨了, 则取上次的时间戳加1, 或者抛异常处理.