【问题标题】:Difference between namespace and ancestor in data structure数据结构中命名空间和祖先的区别
【发布时间】:2018-12-05 18:17:41
【问题描述】:

这两者有什么区别

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 将命名空间和根实体组的种类添加到 Bigtable 行键。如果您开始写入一个新的命名空间或种类而不逐渐增加流量,您可以点击一个热点。

我真的很困惑我应该如何支撑我的数据, 顺便问一下,哪个阅读速度更快?

【问题讨论】:

  • 您没有使用datastore.NewKeydatastore.NewIncompleteKey 方法是否有原因?
  • 既不完整的键也不 nameKey 在其参数中接受命名空间,所以这就是我直接使用它的原因

标签: go google-cloud-datastore datastore


【解决方案1】:

不同之处在于,您提到的命名空间争用极端情况只是暂时的,如果您愿意,与this one 等效(从根本原因的角度来看):

...

如果您以非常高的速度创建新实体, 以前只有很少的现有实体。 Bigtable 将启动 所有实体都在同一台平板电脑服务器上,需要一些时间 将键范围拆分到单独的平板服务器上。

...

瞬态仅持续到出现足够的平板电脑拆分以跟上写入操作率。对于您引用的情况,逐渐增加的流量将使这些拆分有时间在遇到错误之前发生,从而避免了该问题。即使没有逐渐增加 - 争用也可能只发生在分裂发生之前,然后它就会消失。

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

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

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

【讨论】:

  • 将所有用户数据放入同一个命名空间是否是一种好习惯?或命名空间用于有机更大的数据
  • 命名空间主要是为多租户应用程序设计的——对数据进行分区。请注意,如果您使用它们,则必须在使用时保持一致。例如,如果您进行查询,它们包含在一个命名空间中,请参阅stackoverflow.com/questions/50071038/…
  • 多租户是指“多租”吗?不要不懂意思,我翻译成我的母语但对我来说没有意义
  • 与此类似 - 您的应用程序将代表他们为客户提供服务,并且您希望他们的数据单独分区。请参阅cloud.google.com/appengine/docs/standard/python/multitenancy/… 就像 Google 为所有 GAE 应用提供服务一样,没有应用相互交互。
猜你喜欢
  • 1970-01-01
  • 2020-08-21
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 2014-08-10
相关资源
最近更新 更多