Google cloud dataflow Google Cloud BigTable:更新列值

Google cloud dataflow Google Cloud BigTable:更新列值,google-cloud-dataflow,apache-beam,bigtable,google-cloud-bigtable,Google Cloud Dataflow,Apache Beam,Bigtable,Google Cloud Bigtable,我有以下BigTable结构作为示例: Table1 : column_family_1 : column_1 : value 值这里是一个数字。这是由数据流管理的,我希望每次都更新该值 该值可能是一个金额,我希望在用户每次购买时更新该值(以保持截至日期的总花费),因此我在purchase event listener数据流中执行以下操作(每当遇到购买事件时): 发出BigTable请求以按id获取值 将新购买花费的金额添加到BigTable搜索响应中的金额 发出Put请求以更新值 虽然这

我有以下BigTable结构作为示例:

Table1 : column_family_1 : column_1 : value
这里是一个数字。这是由数据流管理的,我希望每次都更新该值

该值可能是一个金额,我希望在用户每次购买时更新该值(以保持截至日期的总花费),因此我在purchase event listener数据流中执行以下操作(每当遇到购买事件时):

  • 发出BigTable请求以按id获取值
  • 将新购买花费的金额添加到BigTable搜索响应中的金额
  • 发出
    Put
    请求以更新值
虽然这种方法有一定的网络延迟,但似乎是可行的。失败的情况是,当一个数据流有多个worker时,用户进行多个购买,事件转到多个worker,例如:

  • Worker 1获取事件1,获取金额并将花费的金额添加到其中
  • Worker 2获取事件2,获取旧的金额并将花费的金额添加到其中
  • 两个工作人员都发出
    Put
    请求,并被覆盖

为了防止出现这种情况,我试图发出一个请求,它只是用纯文本表示,
在“花费金额”值中添加10。这是我们在数据流中可以做的吗?

Bigtable能够
增加值。您可以在中看到更多详细信息

幂等性在理解Bigtable中的计数器方面起着重要作用。 在Bigtable中,
Put
s通常是幂等的,这意味着您可以多次运行它们并始终得到相同的结果(
a=2
将产生相同的结果,无论运行多少次)<代码>增量
s不是幂等的,因为多次运行它们将产生不同的结果(
a++
a++
的结果与
a++
a++
a++
的结果不同)

瞬时故障可能执行或可能不执行
增量
。客户端永远不清楚在这些瞬时错误期间,
增量是否成功

由于这种幂等性,在数据流中构建这个
增量
特性非常复杂。数据流有一个“bundle”的概念,它是作为工作单元的一组操作。对于瞬时故障,将重试这些捆绑包(您可以阅读有关数据流瞬时故障重试的更多信息)。数据流将“bundle”视为一个单元,bug Cloud Bigtable必须将“bundle”中的每个单独项目视为一个不同的事务,因为Cloud Bigtable不支持多行事务

鉴于“bundles”的预期行为不匹配,Cloud Bigtable将不允许您通过数据流运行
Increment
s

您拥有的选项应该得到比我在此提供的更多的文档,但我可以提供一些高级别的选项:

  • 对于发现的任何新事件,始终使用
    Put
    ,并对读取的值进行汇总。您还可以编写另一个作业,通过创建删除所有当前值的“事务”来定期清理行,并使用总和写入新单元格

  • 用于侦听发布/订阅事件并执行增量。这是一个例子。您还可以使用您在帖子中描述的算法执行
    Get
    、执行加法和执行
    CheckAndMutate
    (如果我选择此选项,我个人会选择
    CheckAndMutate
    以确保一致性)

  • 用于编写自己的执行增量的
    DoFn
    CheckAndMutate
    ,但要理解这可能会导致数据完整性问题


  • 如果系统足够大,选项#1是最稳健的选项,但会以系统复杂性为代价。如果你不想那么复杂,那么选择#2是你的下一个最佳选择(尽管我会选择
    CheckAndMutate
    )。如果您不关心数据完整性,并且需要高吞吐量(如“页面计数”或其他遥测,在这些情况下,一小部分时间是错误的),那么选项3将是您的最佳选择。

    Bigtable具有
    增加值的功能。您可以在中看到更多详细信息

    幂等性在理解Bigtable中的计数器方面起着重要作用。 在Bigtable中,
    Put
    s通常是幂等的,这意味着您可以多次运行它们并始终得到相同的结果(
    a=2
    将产生相同的结果,无论运行多少次)<代码>增量
    s不是幂等的,因为多次运行它们将产生不同的结果(
    a++
    a++
    的结果与
    a++
    a++
    a++
    的结果不同)

    瞬时故障可能执行或可能不执行
    增量
    。客户端永远不清楚在这些瞬时错误期间,
    增量是否成功

    由于这种幂等性,在数据流中构建这个
    增量
    特性非常复杂。数据流有一个“bundle”的概念,它是作为工作单元的一组操作。对于瞬时故障,将重试这些捆绑包(您可以阅读有关数据流瞬时故障重试的更多信息)。数据流将“bundle”视为一个单元,bug Cloud Bigtable必须将“bundle”中的每个单独项目视为一个不同的事务,因为Cloud Bigtable不支持多行事务

    鉴于“bundles”的预期行为不匹配,Cloud Bigtable将不允许您通过数据流运行
    Increment
    s

    您拥有的选项应该得到比我在此提供的更多的文档,但我可以提供一些高级别的选项:

  • 对于您发现的任何新事件,始终使用
    Put
    ,并将Rea上的值相加