本文将讨论微服务中ID分配和权衡的七种策略。
ID是领域驱动设计中实体的定义特征。Id一旦在其直接上下文公开并保留,其他组件就可能会使用它。例如,如果服务A通过Id引用了服务B中的实体,则更改实体B的ID将对服务A产生连锁效应。这就是为什么使用多个工具很重要的原因。在这篇博文中,我们将讨论分配ID及其权衡的7种策略。
GUIDs (UUIDs)
这是最简单,最直接的选择:您只需生成GUID并将其用作标识符。
优点
- 生成简单快捷。
- 保证是唯一的(好的,不能保证,但生成重复GUID的概率太低,无需争论)。如果要合并来自两个不同来源的数据,这也会更容易。
- 生成GUID不需要中央权限。这意味着可以在两台不同的计算机上生成GUID,这使得它更易于在分布式系统中使用。甚至可以使用客户端生成的ID。
- 不会泄漏任何商业情报信息(更多内容见下文)
缺点
- 不可读的。 GUID是长度为36个字符的连字符,没有32个,如果编码则为22个。
- 很大(16字节)。
- GUID可能会影响数据库性能(尽管影响有多少以及是否重要的意见大家有所不同)。这在我所使用的系统中不是问题。此外,还可以选择生成顺序GUID。
顺序整数
这通常意味着依赖数据库服务器生成Id。
优点
- 易于生成,因为所有RDBM都有此选项。
- 可读且易于记忆。
- 小(4字节)。
缺点
- 由于需要一个中央权限来生成ID(通常是数据库服务器),因此有单故障点和潜在的瓶颈。这可能会在某一点之后影响系统的稳定性。
- 如果公开暴露(显示在页面或URL的一部分上),它可能会泄露商业智能数据。例如,如果我现在订购了一些东西并且我得到了一个订单ID为345并且我在一个月之后订购了一些东西并且我得到了Id 445的订单,那么我可以推断该商店每个月大约有100个订单。
- 需要往返数据库以获取Id。
随机整数
这种方法基于上面的方法。生成顺序ID,但保留仅供内部使用。对于外部使用,您使用Skip32对称加密。这将生成一个看似随机的整数。
优点
- 可读且易于记忆。
- 小(4字节)
- 不泄漏任何商业情报信息。
缺点
- 由于需要一个中央权限来生成ID(通常是数据库服务器),因此有单故障点和潜在的瓶颈。这可能会在某一点之后影响系统的稳定性。
- 需要两次往返数据库:一次用于生成顺序ID,另一次用于保存加密的Id。
短随机标识符
在这种方法中,生成一个简短但随机的标识符,然后检查它是否唯一。这是URL缩短工具使用的方法,如bitly。您可以通过多种方式生成它,例如使用随机超过62个字符或散列,base62和子字符串。
优点
- 短(5个字符将为您提供大约10亿个唯一条目)。
- 可读。
- 不泄漏任何商业情报信息。
缺点
- 由于不保证Id是唯一的,因此您需要检查数据库中的冲突并在Id已经存在的情况下重试。这可以使用数据库中Id列的唯一约束和重试轻松实现。如果您的数据在更多表中拆分(例如,如果将旧条目存档在不同的表中),则此方法可能会中断。
自然键
可以使用已具有唯一标识的实体。例如,所有书籍都应由ISBN唯一标识。这些类型的键也称为自然键。
优点
- 该ID在问题域中是众所周知的。
缺点
- 必须仔细检查是不是一个自然键,是不是是唯一的。现实中是有两个不同的人具有相同的社会安全号码的。这种ID改起来可能会非常痛苦。
用户输入
在此策略中,依靠用户提供ID。最常见的例子是博客文章。例如,在我的博客上,URL来自标题,可以用作此博客文章的唯一ID。如果创建了大量博客帖子并且碰撞的可能性很高,您可以附加一个哈希值以使其唯一(例如:https://tomharrisonjr.com/uuid-or-guid-as-primary-keys-be-小心-7b2aa3dcb439)。
优点
- ID分配部分更简单:只需把用户输入中的值作为其ID。
- ID可以提供有关实体内容的提示。
缺点
- ID一般是稳定的,但如果用户想要改变它会怎么样?变化的代价是多少?例如,如果用户想要重命名博客帖子? Vaughn Vernon在他的《实施领域驱动设计》一书中为低吞吐量域提供了基于工作流的身份审批流程。这样可以最大限度地减少拼写错误的机会。
- 需要检查数据库中ID的唯一性。
外部ID
如果您正在与第三方集成,则可以选择重用其分配的标识。这不一定需要在您的公司外部,而是在服务外部。
优点
- 容易实现,因为这只需要一个任务。
缺点
- 需要确保外部身份是稳定的。如果不是,那么当它发生变化时,它也会影响你的系统。例如,有些系统在灾难恢复期间重新生成其ID。这意味着如果恢复外部系统和自己的系统,它们将不同步。
结语
那么,你应该使用哪一个?当然,这取决于具体情况。我发现自己大部分时间都在使用GUID。如果它需要人类可读,那么可以使用短随机字符串。
您最常使用的方法是什么?为什么?您是否使用了不在此列表中的其他身份生成策略?

