2014-12-24 55 views
1

我正在開發GAE Web應用程序,我需要創建和移除兩個實體之間沒有祖先關係的實例之間的關聯(也考慮同一個實例可能有多個關聯,這些關聯可能會有所不同在祖先關係一旦創建的時候,不能被刪除)。 我經歷了「最終一致性」政策,這意味着我的網頁中的數據不會與我正在創建/刪除的關係一致地刷新。 但是我已經看到,通過執行put()方法兩次,一致性似乎是強制的。Google App Engine Datastore:處理最終一致性

這符合「最終一致性」定義,該定義聲明「......未提供新更新......」數據最終將保持一致,並且由於我正在進行另一次更新(實際上兩次更新)我想系統會強制一致性。

對嗎?還有其他更優雅的方式嗎?

更新:我的目標

考慮我有A型的實體名單,它並不重要,他們實際上代表,讓我們說,他們代表了我的生意 的主要實體我有一個列表類型B的另一個實體表示類型A的實體可以依賴的服務。 它是一個多對多的關係,以便 服務B可以通過許多實體使用的A型 的實體可以通過B B型的許多服務送達的

我有一個網頁,讓我創造這樣的關係(一個Jinja2模板,帶有來自客戶端的Jquery Ajax回調和一個依賴於服務器端數據存儲的webapp2 python請求處理程序)。 從數據存儲中刪除關係時,我通過對實體進行另一個查詢並描述它與其相關的b鍵列表來刷新數據。在這種情況下,我仍然可以在與a相關的b鍵列表中看到刪除的b.key。這不是我所期望的。

UPDATE:一些代碼

這裏是模型

class A(ndb.Model): 
    name = ndb.StringProperty() 
    services = ndb.KeyProperty(repeated=True) 

class B(ndb.Model): 
    name = ndb.StringProperty() 
    servedEntities = ndb.KeyProperty(repeated=True) 

這裏我用它來創建的關係

   a.services.append(b.key); 
       b.servedEntities.append(a.key); 
       a.put() 
       b.put() 

這裏的代碼是我使用的刪除代碼關係

   a.services.remove(b.key); 
       b.servedEntities.remove(a.key); 
       a.put() 
       b.put() 

還有就是我如果從數據存儲我仍然可以看到b.key在a.services

+0

你不能強迫它做兩次,它沒用。你能描述爲什麼你需要他們一致? –

+0

已更新,我希望我已經清楚 – lowcoupling

+0

如果您將包含代表問題的最小可能代碼示例 - 將更容易幫助您。 –

回答

1

答案上市再次檢索A和B(以及不能有) 之間沒有祖先關係的關係去除之後你的問題在於這個聲明:

當從數據存儲刪除關係時,通過對實體進行另一個查詢刷新數據 。

爲什麼你需要一個新的查詢?

假設用戶訂閱了服務x,y和z。現在,用戶告訴您從列表中刪除服務z。您前往數據存儲並進行必要的更改。但是,不是運行新的查詢,而是可能仍然在返回的實體中顯示z,您可以簡單地從客戶端的用戶實體中刪除z並相應地更新UI。

這顯然是一個簡化的例子。我在編寫學校日程安排應用程序時面臨類似的挑戰,該應用程序具有更復雜的用例 - 單個更改可能會影響選定時間段內的許多實體(例如,「每個上學日安排課程直到本季度末)」 ,所以我試圖簡單地運行一個新的查詢來刷新計劃視圖。顯然,我碰到了最終的一致性問題,因爲有時需要創建數十個實體。然後我意識到我已經擁有了所有需要刷新視圖而不需要運行新查詢的數據。這是更多的代碼,但它是一個乾淨可靠的解決方案。

+0

好的,但如果用戶刷新頁面,他會看到舊的項目再次回來 – lowcoupling

+0

考慮到用戶手指的速度和網絡延遲,刷新頁面將被正確更新,除非用戶以某種方式設法在毫秒內點擊刷新按鈕點擊保存按鈕。這種情況發生的頻率如何?爲了解決這種可能性,您是否希望將寫入成本加倍? (根據我的經驗,即使涉及多個實體,最終一致性也很少需要超過一秒的時間來解決問題)。 –

+0

@lowcoupling由於這是一個ajax-y應用程序,因此刷新不太常見。你也可以[利用memcache] [1]來最小化這種情況發生。但是,最終,如果您需要這種一致性,您的選擇或者1)重構您的架構以使用實體組或數據存儲的其他高度一致的功能或2)不使用應用程序引擎。 https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/#h.kzvtug7i4vlw – Chris