使用 GCP BigQuery 进行事件溯源

Event sourcing with GCP BigQuery

我们正在构建一个系统来存储客户的购买历史记录。主要是3个实体,

对于 'Orders' 和 'Returns',我们将订阅来自另一个 GCP 项目的 pubsub 事件。最终,我们需要所有事件的 事件日志 以及 'orders' 和 'returns' 的 当前状态 .在我看来,BigQuery 可以很好地存储事件,因为它主要是一个仅附加的数据库,它可以帮助及时跟踪事件。然而,一些 BigQuery 用户只对最终状态感兴趣。

Eg:
Events | State
----------------     
Order1 | created
Order1 | in_Progress
Order2 | created
Order1 | out_for_Delivery

So the current state would be
Events | State
----------------     
Order1 | out_for_Delivery
Order2 | created

我可以看到如下选项,

选项 1: 将所有事件存储在 BigQuery 中。为了创建最终状态,在按时间戳排序的 table 之上创建 BQ Views,并选择最新版本

选项 2: 我阅读了有关投影查询(使用 CQRS)的信息,它有助于在任何时间点及时构建应用程序状态。但我不确定这实际上是如何完成的。

请在这里指导我哪个选项更好,以及选项 2 的更多详细信息,这是构建 “事件溯源 + CQRS” 类系统的标准做法。

此致, 普拉萨德.

如果您需要过滤 table 并仅显示活动的最后状态,使用 View 是最简单和最好的选择。如果您的事件 tables 中有时间戳列,您可以使用如下查询创建视图:

SELECT
   event, 
   state, 
   timestamp_column
FROM (
   SELECT
       event, 
       state, 
       timestamp_column,
       ROW_NUMBER() OVER(PARTITION BY event ORDER BY timestamp_column DESC) AS rn
   FROM
       `your-event-table`
     ) 
WHERE rn =1

这个查询的主要作用是:

  1. 按事件table将您分组
  2. 对每个组内的行进行编号,从最近的注册表到较旧的注册表
  3. 只选择编号为 1 的行,这意味着最终结果将是所有事件的最新注册表。