2011-05-30 93 views
14

我是App Engine的新手,我想確認我對高複製數據存儲的理解。App Engine高複製數據存儲

該文件說實體組是一個「一致性單元」,並且所有數據最終一致。同樣,它也表示「跨實體組的查詢可能是陳舊的」。

有人可以提供一些例子,查詢可以「陳舊」嗎?是不是說我可以在沒有任何父母的情況下保存一個實體(即它是自己的組),然後很快查詢並找不到它?這是否也意味着如果我希望數據始終保持100%的最新狀態,我需要將它們全部保存在同一個實體組中?

對於使用memcache來緩存實體的時間比使數據在所有數據中心中保持一致的平均時間長一段時間,這是常見的解決方法嗎?這是什麼球場延遲?

感謝

回答

18

難道說我可能會救 一個實體沒有任何父(即它的 自己的組),然後查詢很 不久後找不到呢?

正確。從技術上講,這種情況也適用於常規的主 - 從數據存儲,因爲索引是異步更新的,但實際上,可能發生的時間窗口非常小,您從來不會看到它。

如果通過「查詢」您的意思是「做一個按鍵獲取」,但是,這將始終返回在任一實現中強烈一致的結果。

這是否意味着也說如果我想數據 是始終爲100%,跟上時代的我需要 保存他們所有的同一實體 組?

您需要在可以回答之前定義「100%最新」的含義。

就是這個共同的解決辦法,以 使用內存緩存緩存的 一段時間實體比一般 花費的時間進行數據成爲所有數據中心 一致更長?

否。Memcache嚴格用於改善訪問時間;你不應該在緩存驅逐會導致麻煩的任何情況下使用它。

如果您需要保證您看到最新版本,則始終可以獲得強一致的獲取。但是,如果沒有你想要做的具體事例,很難提供建議。

+1

對不起,我沒有一個具體的例子。我在學習這個系統,所以我可以開始做我的項目。我只想將數據存儲在數據存儲中,並在需要時檢索最新版本。我只是想弄清楚什麼時候不是這種情況,以及我如何保證在查詢結果時我會得到最新的結果。通過「查詢」我的意思是通過屬性查詢,就像SQL中的一樣,而不是按鍵。我只想了解祖先團體的意思是「一致性的單位」,什麼可以是「不一致的」。 – amatsukawa 2011-05-30 19:43:43

+0

Nick,在此文檔的使用說明部分:http://code.google.com/intl/zh-CN/appengine/docs/python/datastore/hr/overview.html說,「您可以將最近發佈的內容放入memcache中過期,然後顯示來自memcache的最近發佈的帖子和從數據存儲中檢索的帖子。「 – fjsj 2011-09-07 13:31:20

+0

@ user439383(你有沒有考慮過設置一個更有用的用戶名?)我個人不會再擔心這件事,除非你有特定的情況它是關心的。最終一致的語義在大多數情況下都很好,你會知道什麼時候需要強大的一致性。 – 2011-09-08 00:45:09

11

強制性博客示例設置; AuthorsPosts

class Author(db.Model): 
    name = db.StringProperty() 

class Post(db.Model): 
    author = db.ReferenceProperty() 
    article = db.TextProperty() 

bob = Author(name='bob') 
bob.put() 

要記住第一件事是在一個單一的實體組(包括單一實體),經常GET/PUT /刪除將作爲預期:

post1 = Post(article='first article', author=bob) 
post1.put() 

fetched_post = Post.get(post1.key()) 
# fetched_post is latest post1 

你只能通知如果您開始在多個實體組之間進行查詢,則會出現不確定性。除非您已指定parent屬性,否則您的所有實體都位於不同的實體組中。所以,如果重要的是後直bob創建了一個帖子,說他可以看到有自己的職位的話就要小心了以下內容:

fetched_posts = Post.all().filter('author =', bob).fetch(x) 
# fetched_posts _might_ contain latest post1 

fetched_posts威力包含來自bob最新post1,但它可能不。這是因爲所有Posts都不在同一個實體組中。當在HR中這樣查詢時,你應該認爲「可能是我的最新帖子」

由於作者在創建後可以在列表中直接看到他的帖子,因此我們將使用parent屬性將它們綁定在一起,並使用ancestor查詢來僅從該內容中獲取帖子組:

post2 = Post(parent=person, article='second article', author=bob) 
post2.put() 

bobs_posts = Post.all().ancestor(bob.key()).filter('author =', bob).fetch(x) 

現在我們知道post2將在我們bobs_posts結果。

如果我們的查詢的目的是爲了獲取「可能所有最新的帖子+鮑勃最新的帖子」我們需要做另一個查詢。

other_posts = Post.all().fetch(x) 

那麼結果other_postsbobs_posts合併在一起,以獲得所需的結果。

+0

這實際上是一個很好的解釋。只有我不明白的是你的例子中的「人」是什麼?一個類或實例? – Houman 2014-01-30 12:07:00

5

剛剛將我的應用程序從主/從設備遷移到高複製數據存儲區後,我不得不說,實際上,對於大多數應用程序而言,最終一致性不是問題。

考慮一個典型的留言板示例,在這裏您可以在put()的新留言中發佈實體,然後立即查詢留言板中的所有帖子。使用高複製數據存儲,直到幾秒鐘後(Google I/O,Google工程師表示滯後時間爲2-5秒),您纔會在查詢結果中看到新帖子。

現在,在實踐中,您的留言板應用程序可能正在做一個新的留言板帖子條目的AJAX帖子。提交新帖子後不需要重新提交所有帖子。一旦AJAX請求成功,webapp可以簡單地將新條目插入UI。在用戶離開網頁並返回時,甚至點擊瀏覽器刷新按鈕時,幾秒鐘就會過去,並且很有可能新查詢將返回到查看所有留言板帖子的查詢。

最後,請注意,最終一致性性能僅適用於查詢。如果您實體put()立即呼叫db.get()將其取回,則結果將非常一致,即您將獲得實體的最新快照。

相關問題