【译】微服务中的7种ID(Identities)分配策略

本文将讨论微服务中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。如果它需要人类可读,那么可以使用短随机字符串。

您最常使用的方法是什么?为什么?您是否使用了不在此列表中的其他身份生成策略?

浩子淘天下 wechat
扫码关注我
鼓励原创