使用 GCP BigQuery 进行事件溯源
Event sourcing with GCP BigQuery
我们正在构建一个系统来存储客户的购买历史记录。主要是3个实体,
- 订单(亩table数据作为订单状态不断变化)
- Returns(mutable 因为 return 可以进行状态更改)
- 发票 (immutable)
对于 '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
这个查询的主要作用是:
- 按事件table将您分组
- 对每个组内的行进行编号,从最近的注册表到较旧的注册表
- 只选择编号为 1 的行,这意味着最终结果将是所有事件的最新注册表。
我们正在构建一个系统来存储客户的购买历史记录。主要是3个实体,
- 订单(亩table数据作为订单状态不断变化)
- Returns(mutable 因为 return 可以进行状态更改)
- 发票 (immutable)
对于 '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
这个查询的主要作用是:
- 按事件table将您分组
- 对每个组内的行进行编号,从最近的注册表到较旧的注册表
- 只选择编号为 1 的行,这意味着最终结果将是所有事件的最新注册表。