2013-01-23 38 views
1

我正在嘗試開發一個遊戲網站。用戶可以添加其他用戶作爲他們的朋友。用戶在完成各種遊戲關卡時將獲得積分。現在我需要顯示已經在其頁面上玩過遊戲的所有用戶的朋友的平均分數(例如:當用戶玩遊戲A時,他的朋友贏得的分數的平均值應顯示在遊戲A頁面上。當他玩B遊戲時,他的朋友的平均分數應該顯示出來)。應用引擎上的web應用設計策略

我的方法:

  • 存儲用戶的好友列表(最多1000個)作爲數據存儲多值屬性,並將其加載到 GAE的memcache,當用戶登錄的網站進入。
  • 使用常駐後端來緩存所有用戶的遊戲數據(每個特定遊戲獲得的點數爲 )。 cron作業每小時更新後端緩存。 當用戶第一次請求遊戲頁面(例如:遊戲A)時,請求處理程序聯繫後端以通過URL提取服務計算朋友點的平均值。
  • 現在後端從memcache獲取用戶的好友列表(Max 1000),從內存中高速緩存(後端高速緩存)獲取遊戲A的好友點並返回計算出的平均值。 請求處理程序獲得平均值後,將其保存在數據存儲中,並將其存儲在memcache中,以便後續對遊戲A頁面的請求可從memcache/datastore中獲取數據,而不會在後端開銷。此平均值有效1小時,然後在下一次遊戲A頁面請求後再次重新計算。

我的問題

  • 是上面提到的方法來解決這個問題的一個正確的方式?
  • 如何通過後端實例(python-2.7)高效可靠地實現內存中緩存?
  • 如何估計只有在這個工作後端所需的內存和CPU? (假設10萬個鍵值對必須以「userid/gamename」作爲鍵值和用戶點值存儲,用戶好友列表最大值爲1000.)
  • 如果我必須使用多個後端實例作爲負載增加,如何平衡它們?

在此先感謝。

回答

0

看一看從尼克·約翰遜這個博客帖子大約計數器:http://blog.notdot.net/2010/04/High-concurrency-counters-without-sharding

使用NDB數據存儲區: - 自動緩存,而不是你自己的memcache - NDB有一些新的有趣的特性,如:JSON屬性與壓縮,重複propeties,其行爲像Python列表

並看看mapreduce有效更新。

+0

首先,我想到了自己的緩存,用於存儲所有用戶點而不是GAE內存緩存,因爲後者不可靠(大多數用戶朋友數據可能會被驅逐)。爲了計算平均分數,我需要爲每個用戶獲取〜1000(最大)朋友遊戲點數。這對於數據存儲在時間限制內(1分鐘)並不實際,如果我使用GAE內存緩存,則有可能大部分數據都會被驅逐,因爲它不會頻繁發生。一旦我計算平均數,我會堅持它在NDB數據存儲。後續請求無需計算即可從數據存儲/內存緩存中獲取平均值。 – ravi