gpt4 book ai didi

go - 命名空间和祖先在数据结构上的区别

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:50 24 4
gpt4 key购买 nike

有什么区别

key := datastore.NameKey("user", userID, nil)
client.Put(ctx,datastore.IncompleteKey("session",key),&sessionUser)

key :=&datastore.Key{Kind:"session",Parent:nil,Namespace:userID}
client.Put(ctx,key,&sessionUser)

如果它们具有可能导致 contention 的相同写入/读取,为什么它们会不同?从这个article

Cloud Datastore prepends the namespace and the kind of the root entity group to the Bigtable row key. You can hit a hotspot if you start to write to a new namespace or kind without gradually ramping up traffic.

因此,我真的很困惑应该如何支撑我的数据,顺便问一下,他们中谁的阅读速度更快?

最佳答案

不同之处在于,您提到的命名空间争用角落案例只是一个暂时的案例,等效于(从根本原因的角度来看),如果您愿意,可以使用 this one。 :

...

If you create new entities at a very high rate for a kind whichpreviously had very few existing entities. Bigtable will start offwith all entities on the same tablet server and will take some time tosplit the range of keys onto separate tablet servers.

...

瞬变只会持续到发生足够的 tablet 拆分以跟上写入操作速率。对于您引用的情况,逐渐增加流量将为这些拆分留出时间,然后再出现错误,从而避免出现此问题。即使没有逐渐增加 - 竞争也可能只发生到 split 发生,之后它就消失了。

另一方面,使用祖先会引发一个不同类型的永久性问题。共享相同祖先的所有实体都被放置在同一个实体组中,因此每个实体组都共享每秒最大 1 次写入的速率。组越大,争用的风险就越高。使用非祖先相关实体(带或不带命名空间)有效地创建大小为 1 的实体组 - 这种类型的最小争用。

因此,除非您真的、真的需要祖先,否则如果您的预期使用模式留有争用空间,我建议尽量避免使用它。

旁注:那篇文章只涉及写入争用,但您应该知道争用也可能发生在读取时(在事务中),请参阅 Contention problems in Google App Engine .在这种情况下,实体组大小很重要,事务试图锁定整个实体组。

关于go - 命名空间和祖先在数据结构上的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51052834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com