多服务并发场景下从集合获取未使用ID的方案选型
ID分配方案选型求助
需求背景
客户端发起特定请求时,后端需分配符合以下规则的ID(关联第三方,规则不可修改):
- ID必须唯一
- 值范围为0到2^32(即4294967296)
- 资源按ID删除后,需复用已删除的ID,且优先复用间隙值
- ID分配由多实例微服务处理,存在并发分配场景;流程失败会产生ID间隙,因取值范围有限必须复用这些间隙
已考虑的方案
- 方案1:在Redis或数据库表中维护一个递增计数器;流程失败或资源删除时,将对应ID放入复用池。分配时优先从复用池取ID,无可用值时再使用计数器递增。
- 方案2:锁定资源表,查询现有ID确定可用的新ID,插入新资源后解锁表。但该方案性能问题明显,不考虑。
- 方案3:初始化一个包含所有ID值的池;服务从池中取ID尝试创建资源,若流程失败或资源被删除,将ID放回池。但觉得实现起来过于复杂。
疑问与求助
目前倾向方案3但嫌复杂,方案2性能太差,想知道有没有更简便的实现方案?项目基于ASP.NET C#。
另外,曾考虑过Postgres序列(或其他数据库的等效机制),但测试后发现复用ID的操作并不简单,若此结论有误请指正;也考虑过随机ID,但受生日悖论影响,碰撞概率不可接受,不可行。
内容的提问来源于stack exchange,提问作者Magnesiam
相关产品推荐
相关产品推荐

