第一天就构建 Seam

构建高容量数据平台会迫使你做出选择。

你需要一个快速的数据库进行长期存储。但在第一天就搭建一套复杂的系统是很困难的。你甚至可能还不了解自己的数据模式。最稳妥的选择是使用你已经熟悉的标准关系型数据库。

错误的做法是将代码直接与第一个数据库绑定。如果应用程序的每个部分都直接调用数据库,你就会给自己挖下一个陷阱。以后想要切换到更好的数据库时,将需要进行大规模的重构。

正确的做法是构建一个 Seam。

Seam 是一种契约。它定义了系统“做什么”,而不规定“怎么做”。

  • 为该任务创建一个接口(interface)。
  • 使用当前的数据库编写一个基础驱动(driver)。
  • 将该驱动绑定到接口上。

应用程序的其他所有部分只与接口通信。没有人知道后台运行的是哪个数据库。

当数据量增长且你需要更快的系统时,工作会变得非常简单。你只需编写一个新的驱动,修改一行代码,然后发布即可。仪表盘不会崩溃,数据流水线也不会中断。

有些人称之为“过早抽象”(premature abstraction)。他们说你现在还不需要它。

我不同意。一个接口只会增加一个额外文件。跳过它只是把成本推迟到了以后。当你最终需要更改时,你将在压力之下不得不修复成百上千个文件。接口是一种廉价的保险。

使用以下三个习惯来增强你的 Seam:

  • 使用双重标识符。在数据库内部进行 Join 操作时使用快速的整数;对于任何离开系统的数据,使用 UUID。这能保证数据安全,并保持 Join 操作的高效。

  • 使用枚举(Enums)作为共享词汇。不要使用随机字符串来表示状态或严重程度。使用统一的枚举,让应用程序的每个部分都使用相同的语言。

  • 为数据使用版本化的信封(versioned envelopes)。如果你的系统从多个来源接收数据,请使用严格的 Schema。只添加新字段。在没有新版本的情况下,绝不要删除或重命名现有字段。这可以在你改进系统的同时,确保旧客户端仍能正常工作。

找到边界。用契约来命名它。用简单的实现来填充它。

契约是你的承诺。驱动程序只是你今天履行承诺的方式。

Source: https://dev.to/nasrulhazim/build-the-seam-on-day-one-the-second-driver-on-day-ninety-26b