第一天就构建 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
