使用Google App Engine的NDB數據存儲,如何確保在創建新實體後對實體列表進行高度一致的讀取?Google App Engine/NDB - 在投入之後非常一致地閱讀實體列表
示例用例是我擁有Employee類的實體。
- 創建一個新員工的實體
- 立即加載員工(包括已添加的一個)
我瞭解,該辦法之下將產生的列表的最終一致的讀取列表可能包含或不包含新員工的員工。這導致後者的糟糕體驗。
e = Employee(...)
e.put()
Employee.query().fetch(...)
現在,這裏是我想過幾個選擇:
重要限定符
我只在乎讀誰補充新員工的用戶提供一致的清單。我不關心其他用戶是否有最終的一致性閱讀。
我們假設我不想讓所有員工置於祖先之下以啓用強一致的祖先查詢。在成千上萬的員工實體的情況下,5次寫入/秒限制是不值得的。
我們還假設我想要將寫入和列表讀取爲兩個單獨的HTTP請求的結果。理論上講,我可以將寫入和讀取放入單個事務(?)中,但這會成爲非RESTful API端點。
選項1
- 在數據存儲上創建一個新員工實體
- 此外,寫入新的員工對象內存緩存,本地瀏覽器的cookie,本地移動存儲。
- 職工名單(最終一致)
- 如果新員工的實體不在此名單查詢數據存儲,它從內存緩存/本地內存添加到列表(在我的應用程序代碼)
- 渲染結果的用戶。如果用戶選擇新員工實體,則使用key.get()(強烈一致)檢索實體。
選項2
- 使用事務職工名單
- 查詢數據存儲在一個事務中
我不知道選擇2創建一個新員工實體實際上有效。
- 從技術上講,在該實體的讀取事務發生之前,以前的寫入事務是否會寫入所有服務器?或者這是不正確的行爲?
- 交易(包括XG)對實體組數量和員工名單(每個都是自己的實體組)都有一定限制,可能會超出此限制。
- 只讀事務與正常讀取有什麼不同?
想法?選項#1似乎可行,但確保後續讀取的一致性似乎很多工作。
你有新員工的關鍵,所以爲什麼要查詢。執行查詢並將實體添加到結果集中。另外,獲取密鑰將強制索引寫入。問題是在創建實體後多長時間才能執行查詢以及由誰執行?如果同一個用戶,那麼會話對象可以管理具有某種時間邊界的新創建實體的列表。我參與了一個擁有2000多個用戶的系統,我們通常不會看到CRUD操作的問題。 –