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

本文介绍了在订单系统中如何利用分库分表策略确保用户查询和商家订单处理的高效性。用户订单通过用户ID进行路由,避免数据集中在单一表中。同时,商家订单处理依赖于MQ消息,根据商家ID插入商家订单表。全局ID采用雪花算法生成,确保全局唯一性,但需处理时钟回拨导致的ID重复问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分库分表支持的场景

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

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

路由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, 或者抛异常处理.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值