代码之家  ›  专栏  ›  技术社区  ›  John Balvin Arias

数据结构中命名空间和祖先之间的差异

  •  -1
  • John Balvin Arias  · 技术社区  · 6 年前

    两者之间有什么不同

    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

    云数据存储将命名空间和根实体组的类型预处理为Bigtable行键。如果您开始写入新的名称空间或类型,而不逐渐增加流量,则可以访问热点。

    我真的很困惑,我该如何炫耀我的数据呢? 顺便问一下,哪一种在阅读时更快?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Victor Herasme Perez    6 年前

    不同之处在于,您提到的名称空间争用角的情况只是一个暂时的情况(从根本原因的角度来看),如果您愿意,与 this one 以下内容:

    ……

    如果您以非常高的速率为一种 以前几乎没有现存的实体。Bigtable将开始 所有实体都在同一台平板电脑服务器上,需要一些时间 将密钥范围拆分到单独的平板电脑服务器上。

    ……

    这个瞬间只会持续到足够的平板电脑拆分,以跟上写操作速率。对于您所引用的情况,逐渐增加的交通量将为这些拆分在发生错误之前留出时间,从而避免出现问题。即使没有一个逐渐的上升-竞争可能只会发生直到发生分裂,然后它消失。

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

    因此,除非您真的、真的需要祖先,否则如果您预期的使用模式为争用留出了空间,我建议您尝试避免这种情况。

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