【问题标题】:BigQuery table design for immutable data针对不可变数据的 BigQuery 表设计
【发布时间】:2016-04-07 06:18:38
【问题描述】:

背景

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

问题

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

【问题讨论】:

    标签: google-bigquery immutability sharding


    【解决方案1】:

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

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

    【讨论】:

    • 是否可以使用某种“表格扫描”并避免“按时间戳排序”? IE。按插入顺序流式传输表中的所有事件?我希望如果我以与收到它们相同的顺序插入它们,这将起作用。但这意味着(我假设)我需要将所有事件保存在同一张表中?
    • 不,不可能使用插入时间作为排序来进行表扫描。如果你需要订购,你真的必须有时间戳字段。
    • 感谢您的澄清。我们的主要用例是为了回放而存储事件。对于这个用例排序(通过插入或时间戳)很重要。你会说 BigQuery 可能不适合这个吗?
    • 是的,根据您的要求 - 我会说 BigQuery 不太适合。
    • 这里有一个想法:您可以使用 BigQuery 收集一天的数据(带有时间戳),然后每天对数据进行排序并导出到 GCS。可以从 Google Cloud Storage 中的数据进行回放。 BigQuery 为您解决了 fan-in-and-append 问题,而 GCS 允许流式传输 blob 读取,以便您获得重播。您可以根据需要将“1 天的数据价值”调整到尽可能小,以允许 BigQuery 排序操作正常工作。
    【解决方案2】:

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

    你必须记住的要点:

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

    希望对你有用。

    【讨论】:

    • 您能否详细说明一下在这种情况下您所说的“关系”是什么意思?我不明白为什么我需要在我的事件之间建立关系?
    • 您可以在没有关系的情况下使用 johan,但如果您使用,您将拥有更少的重复数据,从而为您提供更高的性能。
    • 我是否理解正确,您的意思是我应该将事件时间(作为 id?)存储在“事件表”中,但实际事件根据其类型(即“分片”)存储在另一个表中按事件类型)?当我想重播事件时,我从“事件表”中的日期/时间戳开始,并将其与相应“事件类型”表中的实际事件连接起来?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多