SeqSvr: 分布式单调递增ID生成器
- 递增64位整型,允许空洞,不允许回退
- 每个用户拥有独立的64位sequence空间
- 内存中储存最近一个分配出去的序号
cur_seq,以及分配上限max_seq- 分配序号时,将
cur_seq++,同时与分配上限max_seq比较;如果cur_seq >= max_seq,将分配上限提升一个步长max_seq += step,并持久化max_seq- 重启时,读出持久化的
max_seq,赋值给cur_seq,重新预分配一段可分配序列号- 多个用户共享同一个
max_seq,用户按照id哈希,划分为若干组
重启时,不可避免会产生序号空洞;使用哈希分组是为了避免负载不均,也带来另一个问题:不能随意增删用户。
- 单例部署
- 注册/注销
section- 监听有哪些
Alloc实例可以用于分配,有哪些待分配的section- 按照一致性哈希规则将
section分配给Alloc- 监听下线的
Alloc, 防止Alloc宕机未能及时删除路由规则
- 监听路由规则,将请求分发到正确的实例
- 批量请求需要同时请求多台实例,性能不一定能保证
table: for_dev/for_test/for_prod 区分环境
// 数量 = alloc 实例数量
/segment/{table}/alloc/{addr} | timestamp
// 数量 = 业务场景数量 X 哈希组数量
/segment/{table}/section/{tag}/{hashId} | pending/addr
// 数量 = 业务场景数量 X 哈希组数量
/segment/{table}/routing/{addr}/{tag}/{hashId} | pending/running
假设 20 个 alloc 实例,20 个 proxy 实例, 3 个 assign 实例,10 种业务场景,id 空间为 int32,哈希组 512 个。需要
- 内存 > 16G x 10,主要是 alloc 加载到内存中的占用
- etcd key 10 x 512 x 2 + 20 > 10240 个,section/routing 占大多数
- Reduce memory reduce of alloc server
- Fix memory leak of proxy server