2012-04-24 116 views
0

我們正在開發一款IOS遊戲,並在後端使用google-app-engine。用戶可以通過點擊建築物來獲得遊戲中的錢。用戶以相當快的速度敲打幾座建築物,這會導致同一對象(USER)和不同建築物上的多個併發交易。多筆交易,併發性和性能

不幸的是,這意味着4-5分接頭因爲失去重試而超時。這也意味着由於鎖定原因,第2至第5個抽頭非常緩慢。

我的第一個想法是讓交易成爲一項任務,但是第二次調用函數時totalAmount會出錯,因爲第一次調用還沒有完成。

那麼支持多個快速更新到同一實體的任何好方法?

 int retries = 5; 
     while (retries > 0) { 

      // Wrap everything into a transaction from here 
      TransactionOptions options = TransactionOptions.Builder.withXG(true); 
      Transaction txn = datastore.beginTransaction(options); 

       try{ 
        // Ok we got the template - now check against the 

        // Update user... with money gained 
        // Update Building...money withdrawn 

        //Do the transaction 
        datastore.put(txn, user.getEntity()); 
        datastore.put(txn, building.getEntity()); 
        txn.commit(); 

        // do callback code...which returns TotalMoney 

        break; 

       } catch (Exception e) { 
        if(retries > 0){ 
         retries--; 
        } 
        else{ 
        //fail code... 
       } finally { 
        if (txn.isActive()) { 
         txn.rollback(); 
        } 
       } 
      } 
+0

是否有任何不使用memcache的原因? – greg 2012-04-24 16:58:19

+0

好的用戶競賽條件。用戶可以在1秒鐘內「挖掘」多個建築物並緩存資金。沒有交易可能會導致用戶「鬆動」水龍頭。 – Middy 2012-10-29 12:57:44

回答

3

爲了保持一致性,你需要的交易,爲響應你建議立即進行刪除使用後端:

  1. 使用後端實例將數據保存在內存中快速更新。

  2. 每當數據在後端更新時,還會啓動任務並在數據存儲中更新事務實體。

1

一種可能性是不使用XG交易或交易。相反,擁有一個事務日誌會讓你記錄所有的操作更爲有利。這樣,你可以有一個任務或後端應用事務日誌的效果,如果事情失敗了,它們最終會變得一致。這將大大提高您的前端吞吐量,並且從長遠來看,這將使客戶服務變得更容易。

要記住的一件事是關於實體組更新的一般經驗法則:設計實體組,以便以1/s的速率更新它們。實際費率要高得多,但這是防止碰撞和爭用的好規則。