Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 使用GCP BigQuery进行事件寻源_Google Cloud Platform_Google Bigquery_Cqrs_Event Sourcing - Fatal编程技术网

Google cloud platform 使用GCP BigQuery进行事件寻源

Google cloud platform 使用GCP BigQuery进行事件寻源,google-cloud-platform,google-bigquery,cqrs,event-sourcing,Google Cloud Platform,Google Bigquery,Cqrs,Event Sourcing,我们正在构建一个存储客户购买历史记录的系统。主要是三个实体 订单(订单状态不断变化时的可变数据) 返回值(由于返回值可能会发生状态更改,因此返回值也是可变的) 发票(不可变) 对于“订单”和“退货”,我们将从另一个GCP项目订阅pubsub事件。最后,我们需要所有事件的事件日志,以及“订单”和“退货”的当前状态。在我看来,BigQuery在存储事件方面会做得很好,因为它主要是一个只附加的数据库,可以帮助跟踪事件的时间。但是,BigQuery的一些用户只对最终状态感兴趣 Eg: Events

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

  • 订单(订单状态不断变化时的可变数据)
  • 返回值(由于返回值可能会发生状态更改,因此返回值也是可变的)
  • 发票(不可变)
对于“订单”和“退货”,我们将从另一个GCP项目订阅pubsub事件。最后,我们需要所有事件的事件日志,以及“订单”和“退货”的当前状态。在我看来,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中。要创建最终状态,请在表顶部创建BQ视图,按时间戳排序并选择最新版本

选项2: 我读过一些关于投影查询(使用CQR)的文章,这些查询有助于在任何时间点构建应用程序状态。但我不确定这实际上是如何做到的

请在这里告诉我哪个选项更好,以及关于选项2的更多详细信息,选项2是构建“事件资源+CQR”类系统的标准实践

问候,,
Prasad。

如果需要筛选表并仅显示事件的最后状态,使用视图是最简单和最好的选择。如果事件表中有时间戳列,则可以使用如下查询创建视图,例如:

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的行,这意味着最终结果将是所有事件的最新注册表

  • 谢谢你,史蒂文斯。这绝对是选项1的答案。你知道如何使用CQRS来实现这一点吗?@Prasad Sawant我认为在BigQuery中这是不可能的。你能分享一下你在哪里找到的参考资料吗?不,我实际上没有找到BigQuery做事件来源的参考资料。但我想知道这是否可行。或者说事件源需要特殊的产品吗?BigQuery不像一个经典的事务数据库系统,所以有些体系结构根本不适合使用。基本上,您的第一种方法可以轻松解决您的问题。若您明确地需要使用CQR,那个么您的问题可能无法在BigQueryDo中解决,您仍然有一些问题吗?