亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中的 Google App Engine 數據存儲分片

Go 中的 Google App Engine 數據存儲分片

Go
拉莫斯之舞 2021-11-29 16:11:14
我在 GAE 中創建了一個分片,但有時在運行分片代碼后并不總是收到此消息。(datastore_v3: BAD_REQUEST): Key path element must not be incomplete: [ResumeShard: ]編碼://Sharding//Getting shard IDrand.Seed(time.Now().UnixNano())shardId := rand.Int63n(5)resumeShardKey := datastore.NewKey(*pC, "ResumeShard", "", accountKey.IntID()+shardId, nil)var resumeShard param.ResumeShardif err = datastore.Get(*pC, resumeShardKey, &resumeShard); err != nil {    if err == datastore.ErrNoSuchEntity {        resumeShard = param.ResumeShard{}        resumeShard.Counter = 1    } else {        log.Println(err.Error())    }} else {    resumeShard.Counter += 1}*pC 是指向來自 appengine 的上下文的指針。accountKey是Key每個用戶唯一的數據存儲。此錯誤隨機出現,例如 10 個請求中出現 3 次。我想知道因為我必須使用datastore.NewKey(..)為分片創建密鑰,我怎樣才能獲得調用后我將收到的完整密鑰,Put(..)因為這是分片并且 GAE 文檔上的示例也使用datastore.NewKey(..)。請建議。
查看完整描述

1 回答

?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

您收到一條錯誤消息,指出您提供的密鑰不完整。這是因為您指定了一個空的鍵名 ( "") ( stringID),并accountKey.IntID()加上一個隨機數(來自范圍0..4- 兩者都包括在內)作為數字鍵 ID ( intID)。請注意,如果您accountKey.IntID()的未初始化,它將是0并且隨機數也可能是0在這種情況下 a0用作intID.

并引用以下文檔datastore.Key

stringID和 中的一個或兩個都intID必須為零。如果兩者都為零,則返回的密鑰不完整。

得到的機會0intID1,總分5為20%(這是靠近您報道3滿分10分)。

的值0intID是無效的,它必須是一個非零值作為0是一個特殊值就像空字符串""stringID,這兩者都用于表示其他屬性用于標識該實體; 或者 - 如果兩者都是零值 - 表示密鑰是不完整的密鑰(因此需要系統隨機分配intID)。

請注意,此解決方案很糟糕,因為您使用具有相對數字 ID ( intID) 的鍵,與帳戶鍵 ( accountKey.IntID())的數字 ID 相比是相對的。系統分配的密鑰將隨機分配,但有可能 2 個帳戶密鑰可能彼此接近(例如,一個是另一個 +1)。在這種情況下,您的分片鍵會重疊!

如果datastore.Put()用來保存實體,系統分配的隨機key就是返回值Put()

func Put(c context.Context, key *Key, src interface{}) (*Key, error)


查看完整回答
反對 回復 2021-11-29
  • 1 回答
  • 0 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號