【问题标题】:web application design strategy on app engine应用引擎上的网络应用设计策略
【发布时间】:2013-01-23 20:39:43
【问题描述】:

我正在尝试开发一个游戏网站。用户可以将其他用户添加为他们的朋友。用户将在完成各种游戏关卡时获得积分。现在我需要在其页面上显示所有已经玩过游戏的用户的朋友的平均积分(例如:当用户玩游戏A时,他的朋友获得的平均积分应该显示在游戏A页面上。同样的游戏在他玩游戏 B) 时,将显示他朋友的 B 平均分。

我的做法:

  • 将用户的好友列表(最多 1000 个)作为多值属性存储在数据存储中并将其加载到 用户登录网站时的 GAE 内存缓存。
  • 使用常驻后端缓存所有用户的游戏数据(获得的积分 每个特定的游戏)。一个 cron 作业每小时更新一次后端缓存。 当用户第一次请求游戏页面(例如:游戏 A)时,请求处理程序通过 URL-Fetch 服务联系后端计算好友积分平均值。
  • 现在后端从内存缓存中获取用户的好友列表(最多 1000 个),从内存缓存(后端缓存)中获取游戏 A 的好友点数并返回计算的平均值。 获取平均值后的请求处理程序,将其保存在数据存储中,并将其存储在内存缓存中,以便对游戏 A 页面的后续请求从内存缓存/数据存储中获取数据,而无需在后端进行计算开销。这个平均值的有效期为 1 小时,之后在下一次请求游戏 A 页面时重新计算。

我的问题

  • 上述方法是解决此问题的正确方法吗?
  • 如何使用后端实例 (python-2.7) 高效可靠地实现内存缓存?
  • 如何估计仅此作业在后端所需的内存和 cpu? (假设必须存储 10 万个键值对,其中“userid/gamename”作为键,用户点作为值。用户好友列表最大大小为 1000。)
  • 如果随着负载的增加必须使用多个后端实例,如何对它们进行负载均衡?

提前致谢。

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    请查看 Nick Johnson 的这篇关于计数器的博文:http://blog.notdot.net/2010/04/High-concurrency-counters-without-sharding

    将 NDB 数据存储用于: - 自动缓存,而不是你自己的内存缓存 - NDB 有一些新的有趣属性,例如:带压缩的 json 属性、重复的属性,其作用类似于 Python 列表

    看看 mapreduce 的高效更新。

    【讨论】:

    • 首先,我想到了自己的缓存来存储所有用户点而不是GAE memcache,因为后者不可靠(大多数用户朋友数据可能被驱逐)。为了计算平均分,我需要为每个用户获取约 1000(最大)个好友游戏点数。这在时间限制(1 分钟)内从数据存储中是不切实际的,如果我使用 GAE 内存缓存,则有可能大部分数据将被驱逐,因为它不经常被命中。一旦我计算出 avg,我将把它保存在 NDB 数据存储中。后续请求无需计算即可从数据存储/内存缓存中获取平均值。
    猜你喜欢
    • 2021-12-16
    • 2016-07-24
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多