【发布时间】:2018-11-08 10:17:51
【问题描述】:
我有以下 BigTable 结构为例:
Table1 : column_family_1 : column_1 : value
这里的value 是一个数字。这是由数据流管理的,我想每次都更新值。
这个值可能是一个金额,我想在用户每次购买时更新它(以保持迄今为止的总支出),所以我在购买事件监听器数据流中执行以下操作(每当遇到购买事件时):
- 发出 BigTable 请求以通过 id 获取值
- 将新购买的金额添加到 BigTable 搜索响应中的金额
- 发出
Put请求以更新值
虽然这种方法有一些网络延迟,但它似乎有效。失败的情况是,当数据流有多个工作人员时,用户进行了多次购买并且事件转到多个工作人员,例如:
- Worker 1 获取事件 1,获取金额并将花费的金额添加到其中
- Worker 2 获取事件 2,获取 旧 金额并将已花费金额添加到其中
- 两个工作人员都提出了
Put请求,但他们被覆盖了
为了防止这种情况,我正在尝试提出一个请求,该请求仅以纯文本形式显示,add 10 to the spent amount value。这是我们可以在数据流中做的事情吗?
【问题讨论】:
-
我了解这种情况以及失败的时间/原因,但我不明白你是如何阻止它的。请您改写或详细说明这部分:“为了防止这种情况,我正在尝试提出一个请求,该请求仅以纯文本形式显示,
add 10 to the spent amount value。这是我们可以在数据流中执行的操作吗?” -
@RubénC。我试图通过 upsert 命令阻止它,它的 SQL 解释将类似于
UPDATE table SET amount = amount + <new_deposit> WHERE person_id = <person_id>;所以,我不是读取它,添加值并将其写回,而是通过发出增量或更新命令来更新它。跨度>
标签: google-cloud-dataflow apache-beam bigtable google-cloud-bigtable