我在 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
必須為零。如果兩者都為零,則返回的密鑰不完整。
得到的機會0
為intID
1,總分5為20%(這是靠近您報道3滿分10分)。
的值0
為intID
是無效的,它必須是一個非零值作為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)
- 1 回答
- 0 關注
- 191 瀏覽
添加回答
舉報
0/150
提交
取消