我的應用程式在 Google App Engine 上運行并使用 Google Cloud Datastore。我的一位用戶提醒我,他們關聯的一些條目之前已經看到的條目沒有出現在他們面前。
實際上,當我在資料存盤中查詢這些物體(使用單個屬性過濾器)時,它們不會被回傳。我能夠通過查詢不同的屬性找到它們,并且在將它們寫入資料存盤后,索引會更新并在查詢中回傳。
也許從技術上講,我的查詢不能保證回傳物體,因為它是弱一致的,但是最近沒有任何物體被更改,通常任何不一致的結果都會很快得到解決。(現在已經好幾天了)
因此,這些物體上此屬性的索引條目似乎以某種方式丟失或損壞。該怎么辦?等待并希望索引會重新生成?我可以將此用戶的物體寫入資料存盤以重新生成索引......但為我的所有用戶執行此操作并不是一個真正的選擇。
我可以在 SA 上看到的唯一類似情況是這個問題:似乎索引缺少自 2015 年 6 月 1 日下旬以來創建的新物體的索引,這是由此事件引起的:https ://status.cloud.google.com/incident/ appengine/15015但根據狀態儀表板,最近沒有發生類似事件。
uj5u.com熱心網友回復:
您是否更改了索引哪些屬性的狀態?
如果這樣做,以前存在的物體只會在下次放置時在索引中更新。
這可能會導致較舊的物體不會出現在查詢中。
uj5u.com熱心網友回復:
一位 App Engine 工程師親切地指出了問題的根源——我的查詢過濾器屬性位于 UserProperty 型別上。
來自https://cloud.google.com/appengine/docs/legacy/standard/python/users/userobjects的檔案:
帶有在創建時不代表 Google 帳戶的電子郵件地址的 User 值永遠不會與代表真實用戶的 User 值匹配。
我的用戶的電子郵件不是 Google 帳戶,但他可能最近創建了一個,導致 user_id() 變為None
整數 id。
這意味著從現在開始,當我執行這樣的查詢時:
u = User('name@non_google_domain.com')
Entity.all().filter('user_property', u)
在內部,現在實際上是通過和 的整數 id 的組合而不是和的組合來查找的,u
導致我的物體不被回傳。name@non_google_domain.com
name@non_google_domain.com
None
實際上,檢查e._entity['user_property']
回傳的物體,新物體是 formUser('name@non_google_domain.com', _user_id='12345678912345678900')
而舊物體是User('name@non_google_domain.com')
.
UserProperty
不再推薦使用,因為這樣的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507766.html
標籤:Google Cloud Collective 谷歌应用引擎 谷歌云数据存储