不可变数据的BigQuery表设计

时间:2016-01-03 14:23:11

标签: google-bigquery immutability sharding

背景

我们可能会将BigQuery用于store our immutable business events,以便我们以后可以将它们重播到其他服务。我认为一种方法基本上只是将每个事件存储为blob(带有一些元数据)。为了轻松地重放它们,保持事件的全局顺序当然是好的,并且只是将每个事件保存到BigQuery中的同一个表中。我们可能每秒有10个事件(这远远超过每秒100000个消息的限制)。

问题

  1. 将所有事件保存在同一个表中是否可以?
  2. 在不同的表中对消息进行分片(可能基于事件类型,主题或日期)可能会更好吗?
  3. 如果(2),是否可以加入/扫描按时间排序的多个表,以便能够以相同的顺序重放事件?

2 个答案:

答案 0 :(得分:1)

我更喜欢基于事件类型创建表并将时间存储在事件表中,您可以使用关系(使用主键,外键)连接表。由于它的存储时间基础,您也可以重放。

  

你必须记住的要点:

  1. 一旦发生事件,不可变的业务事件将为您提供并发性 已被接受和承诺,它变得不可改变,它可以 到处复制。
  2. “撤消”事件的唯一方法是添加补偿事件 最像会计中的负面交易。
  3. 希望它对你有用。

答案 1 :(得分:1)

如果主要使用场景存储事件然后回复它们 - 没有理由将不同的事件类型拆分到不同的表中。特别是因为每个事件都是不透明的blob。将它们全部保存在同一个表中将使您能够根据事件类型和其他元数据进行分析。 按天划分是有道理的,特别是如果您要查看最新数据 - 这将有助于您降低BigQuery查询成本。

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