BigQuery table 为 immutable 数据设计

BigQuery table design for immutable data

背景

我们可能会使用 BigQuery 来 以便我们稍后可以将它们重播到其他服务。我认为一种方法是基本上将每个事件存储为一个 blob(带有一些元数据)。为了轻松重放它们,当然最好维护我们事件的全局顺序,并将每个事件持久保存到 BigQuery 中的相同 table。我们可能每秒有 10 个事件(这远不及每秒 100000 条消息的限制)。

问题

  1. 将所有事件简单地保存在同一个 table 中是否可以?
  2. 将消息分成不同的 table 可能会更好(可能基于事件类型、主题或日期)?
  3. 如果 (2),是否可以 join/scan 通过按时间排序的多个 table,以便可以按相同顺序重播事件?

我更喜欢根据事件类型创建 table 并将时间存储在事件 table 中,您可以使用关系(使用主键、外键)加入 table。因为它按时间存储,您也可以重播。

Points you must remember:

  1. Immutable业务事件会给你并发,一旦一个事件 已经被接受和承诺,它成为一个不可改变的,它可以是 随处复制。
  2. “撤消”事件的唯一方法是在 top 就像会计中的负交易。

希望对你有用。

如果您的主要使用场景是存储事件然后回复它们 - 没有理由将不同的事件类型拆分为不同的 table。特别是因为每个事件都是一个不透明的 blob。将它们全部保持在同一个 table 中对您能够按事件类型和其他元数据进行分析的好处很小。 按天进行分片很有意义,尤其是当您要查看最新数据时 - 这将帮助您降低 BigQuery 查询成本。

但是我担心你要求按顺序回复事件。 BigQuery 中没有聚集索引,因此每次您需要回复事件时,您都必须在查询中使用 "ORDER BY timestamp",并且它只能扩展到相对较小的数据量(数十兆字节)。所以你会想要重播很多事件 - 这种设计不适合你。