【问题标题】:Datastore transaction - hitting entity write limit数据存储事务 - 达到实体写入限制
【发布时间】:2022-01-23 17:19:22
【问题描述】:

问题

使用 golang cloud.google.com/go/datastore 包创建事务,执行一系列 getMultiputMulti,在提交此事务时我遇到实体写入限制错误。

2021/12/22 09:07:18 err: rpc error: code = InvalidArgument desc = cannot write more than 500 entities in a single call

问题

我的问题是如何创建超过 500 次写入的事务?

虽然我希望我的操作保持原子性,但我似乎无法解决事务的写入限制错误,并且当我在模拟器上进行测试时,查询集运行良好,写入500个批次。

我的尝试

请原谅 sudo 代码,但我正试图了解我所做的事情 一体机

    transaction, err := datastoreClient.NewTransaction(ctx)
    transaction.PutMulti(allKeys, allEntities)
    transaction.commit()
// err too many entities written in a single call

为了避免写入限制而进行批处理

    transaction, err := datastoreClient.NewTransaction(ctx)
    transaction.PutMulti(first500Keys, first500Entities)
    transaction.PutMulti(second500Keys, second500Entities)
    transaction.commit()
// err too many entities written in a single call

一个简单的常规 putmulti 也会失败

    datastoreClient.PutMulti(ctx,allKeys, allEntities)
// err too many entities written in a single call

什么有效

对数据存储的非原子写入

    datastoreClient.PutMulti(ctx,first500Keys, first500Entities)
    datastoreClient.PutMulti(ctx,second500Keys, second500Entities)

这是我用于写入的真实代码,作为批处理事务或常规 putMulti

    for i := 0; i < (len(allKeys) / 500); i++ {
        var max int = (i + 1) * 500
        if len(allKeys) < max {
            max = len(allKeys) % 500
        }

        _, err = svc.dsClient.PutMulti(ctx, allKeys[i*500:max], allEntities[i*500:max])
        if err != nil {
            return
        }
    }

我迷路的地方

所以为了让我的工作保持原子性,是否有任何方法可以提交包含超过 500 个实体的事务?

【问题讨论】:

  • 不要使用 Google Datastore,它有一些严重的设计缺陷。除了作为皇家供应商锁定它之外,它还不能跳过未知列。这意味着如果所有现有客户都立即中断,就无法安全地添加新列。
  • @rustyx 后视率往往是 20/20 :) 我正在继承这项工作,所以选择不是我也不是我,但我们的目标是过渡到不同的存储解决方案最终!

标签: go transactions datastore


【解决方案1】:

你无能为力。此限制由平台强制执行,以确保可扩展性并防止性能下降。您不能在单个事务中写入超过 500 个实体。

Google 方面可以更改限制,但您的 方面无能为力。

【讨论】:

  • 感谢您的回复!我希望情况不会如此,但这是我得出的结论。我在网上发现的一些东西令人困惑,比如每秒 500 次写入,所以我什至没想到我的批处理、非事务 put 一定会起作用。
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2021-01-17
  • 1970-01-01
相关资源
最近更新 更多