2012-05-27 33 views
1

我想圍繞爭用以及它如何應用於應用程序引擎堆棧。避免AppEngine中的爭用

我有一個模型,它是建立像這樣

class Events(db.Model): 
    #Owner Identification Number 
    owner_id  = db.StringProperty(required=True) 

    #Authentication Token 
    auth_token  = db.StringProperty(required=True) 

    #generic, b, c, d, ... 
    driver   = db.StringProperty(required=True) 

    #Start Time and Date 
    tStart   = db.DateTimeProperty(auto_now=True) 

    #Define whether the event is active or inactive 
    active   = db.BooleanProperty(default=False) 

    #Payload store, this will store each payload block sent or pulled 
    payloads  = db.StringListProperty(indexed=False) 

這個模型持有若干事件,每個事件都有一個所有者和有效載荷,該事件的店主會寫的有效載荷,並從他的活動,許多其他人將從該事件中讀取,這是一種轉錄堆棧。

我的問題是關於爭用,我會受到這個影響,如果是的話,我該如何重組,以防止它。

謝謝。

回答

1

我沒有看到你的模型的任何問題:

  1. Events實體將不會支付任何爭稅,因爲他們似乎從你的話,例如,只是任何實體組外根實體judgding。
  2. 單個實體的頻繁更新可能導致爭用,但我毫不懷疑業主會每秒更新任何實體超過一次(1QPS是您必須牢記的閾值,高於您處於危險區域)。
  3. 數據存儲區讀取操作不會導致爭用問題。
2

我也是Google App Engine的新手。所以基本上避免爭用實際上是在詢問如何增加寫入吞吐量。我能想到的解決方案是:

  1. 犧牲交易
  2. 一批memcached的
  3. 碎片計數器寫入
  4. 後臺任務隊列

https://developers.google.com/appengine/articles/sharding_counters

https://developers.google.com/appengine/articles/scaling/contention

還有其他想法嗎?我也想知道!

+0

1.事務與寫入限制無關。 2.批處理 - 是的,通過保存到後端實例? 3.分片 - 改善寫入,但不允許併發讀取。 4.和3一樣。 –

1

在您的情況下,適用的限制是實體寫入/更新限制,即每秒每個實體(或實體組)寫入/更新1次。

閱讀沒有限制。

爲了降低成本並縮短響應時間,使用memcache進行緩存讀取仍然是一個好主意。如果你使用Python NDB然後caching is enabled by default

解決方案:恕我直言,增加寫入吞吐量和同時有讀取的好方案是backends。它們(大部分)始終處於可用作共享內存的實例上。所以你可以批量寫入(並通過任務隊列刷新),同時讀取。

注:實例得到重新啓動,每天一次,所以你不能把他們當作可靠的存儲 - 您可以使用他們的智能高速緩存,而異步(通過後臺線程或任務隊列)的數據存儲事務更新實體。

1

在App Engine中,Event的每個實例都被讀寫爲整個對象。您會擔心每個事件的爭用。如果您必須頻繁更新單個事件實例,那麼您可能需要擔心爭用。如果你更新不同的實例,那麼沒有什麼可擔心的。

我不確定你說的是什麼意思的爭論。您可能指的是a)交易完整性或b)有限的寫入性能。閱讀表現你應該沒有問題,儘管你確實存在最終一致性問題。

a)如果您必須在更新事件實例後讀取正確的數據,則需要使用按鍵的數據存儲get()請求。查詢()請求可能會返回舊數據。

b)如果您擔心寫入性能,您需要以某種方式將您的實體分成多個實體。你也許考慮讓每個事件的多個有效載荷的實體,是這樣的:

class Payload(db.Model): 
    event = db.ReferenceProperty(Events) 
    payload = db.StringProperty() 

這種方式可以單獨寫每個有效載荷,但它會稍貴一些,因爲需要對它們進行索引,你需要通過事件來查詢它們以獲取它們。您可能希望將事件設置爲祖先,以便您可以使用祖先查詢進行一致查詢。