前言:
  游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧重讲解Nosql在游戏排名榜中的作用. 小编(mumuxinfei)对这块认识较浅, 所述观点不代表主流(工业界)做法, 望能抛砖引玉.

秉承:
  上一篇文章, 详见: 社交游戏的排行榜设计和实现(1)

进阶篇:
  随着数据量/并发量的上涨, Mysql集群也呈现了一些疲态.
  (1). 数据库分库分表后, 表间的join事实上失去了意义. 要join的表数据在不同的库中.
  (2). 数据库的读写性能很容易达到上限.
  如何破解:
  我们先回过头来看些表定义以及使用
  表tb_score使用user_id访问score得分,其实user_id相当于key, score相当于value. 因此可借助Nosql的持久化key/value系统去实现,redis/mongodb/leveldb/hbase, 这样无论在读写速度上, 还是在应用扩展性上,都获得了很大的提升. 
  表tb_friend借助user_id来获取friend_id列表, 其本质相当于user_id为keylist<friend_id>为value, 而key对应value列表, 可借助redis(数据结构服务器),也可借助sorted key/value db系统. 这边我们选用sorted key/value db, 因其数据按key的顺序存储.
  sorted key/value db的特点是:
  (1) 支持key的前缀查找
  (2) 支持批量/范围查询
  我们可以如下好友列表的key/value格式

key => user_id:friend_id
value => score

评注:
  key=>user_id:friend_id表示friend_id为user_id的好友.
  那我们好友列表的查询, 就演变为前缀为"user_id"的范围查询.
  系统演变: 关系型数据库mysql转化为Nosql系统.
  

缓存篇:
   分布式缓存, 永远是互联网界的狗皮膏药, 无论什么疼痛, 贴一下总有疗效. 缓存的引入也是见血封喉, 效果非常显著, 不过需要注意数据一致性问题. 不过互联网能忍受弱事务性/弱数据一致性(C), 而强调可用性和可扩展性(AP). 移动端游戏, 其实也是类似的执行策略(除了和钱相关的业务). 常用的缓存有memcache/redis, 这些都是hash型散列的内存缓存.
  简单的采用Key/Value, 而不采用redis的key/sort-list的方式.
  value为json格式的列表:

json格式的内容 [{'user_id' : 'score'}, {'user_id' : 'score'}, {...}]

排名相对静止, 因此缓存系统能挡掉大部分的数据读.

  但是引入缓存以后,数据的一致性,如何去保证?
  模拟如下应用场景:
  1). 好友破了新的记录
  2). 新增/删除好友关系
  这些情况发生后, 会更新好友的排行榜. 需要更新缓存, 使得缓存和后端服务的持久数据保持一致.
  那么如何去实现? 
  这边谈谈常见的三种思路
  1). 同步更新: 当好友添加/删除以后, 主动删除排行榜缓存. 而用户的分数创新高后, 主动遍历好友列表,通知删除相应的缓存.
  2). 异步更新: 当好友添加/删除, 或者用户分数创新高, 其投递一个事件到一个队列中, 有队列消费者做这个耗时的同步操作.
  3). 缓存定期删除: 设定缓存key的有效期ttl, 不关注好友添加/删除, 得分更新事件的发生, 允许数据的一致有一定的延迟. 
  这三种方案的优缺点, 可以对比如下:

  实时性 操作代价 扩展性
同步更新 最好 有副作用,嵌入好友添加/删除代码逻辑中, 响应变大 不好, 将来的好友添加/删除逻辑会越发的臃肿
异步更新 一般 影响小 好, 引入队列, 可以由不同消费端做不同的处理
缓存定期删除 一般 几乎无影响 ---

  评注: 通知排行版更新是个重操作,比较耗时, 同步操作会影响响应时间.
  对于游戏而言, 如果排行榜不是实时排名, 采用方案2/3, 都是可接受的. 对于方案3, 这种没心没肺的做法, 其实最简单有效了(个人观点).

服务/平台化
  当一个社交类App演化为一个平台时, 好友模块和游戏模块就自然分开了, 其数据库/Nosql系统逻辑上不在一块了,比如微信App, 其内部肯定把各类服务做了拆分, 其数据是彼此隔离的. 在这种服务/平台化的演进下, 好友特定的游戏排行榜, 又该如何破?
  我们假定如下的服务, 其交互流程如下.
  GameService/FriendService模块
  
  评注:好友更新事件主动触发Game模块, 代价也特别大(如之上所述). 同时也需要Friend模块添加相关的逻辑代码,这使得模块之间紧耦合了.
  借助队列, 采用异步的方式来实现. 这相当于在模块之间采用了观察者(Observer)模式, 事件的触发者只要简单的投递事件于(topic模式)队列中. 然后由需要关注该事件的服务模块主动去订阅它. 新模式转化为如下:
  
  评注: 通过队列异步化事件, 采用订阅的方式, 来实现解耦.
  服务平台化后, 这种做法, 在工业界常常被采用.

后记:
  本来只想写一篇文章, 关于社区游戏排行榜的设计的. 但发现内容有些长, 于是就拆分成了两篇, 里面的内容简单的涉及了一些, 并没有具体展开. 小编(mumuxinfei)对这块还是入门尚浅, 如果有什么不足, 希望能指正.

移动互联网实战--社交游戏的排行榜设计和实现(2)相关推荐

  1. 移动互联网实战--社交游戏的排行榜设计和实现(1)

    前言: 游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧 ...

  2. 社交游戏的排行榜设计和实现:mysql数据库的应用

    前言 游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧重 ...

  3. 社交游戏的排行榜设计和实现进阶篇:Nosql系统

    前言: 游戏领域, 特别是移动端的社交类游戏, 排行榜成为了一种增强体验交互, 提高用户粘性的大法宝. 这边讲述在不同用户规模下, 游戏服务化/游戏平台化趋势下, 如何去设计和实现游戏排名榜. 本文侧 ...

  4. 基于Android的社交游戏百宝箱App设计与实现

    目录 一.产品设计方案 1 (一)项目实施可行性报告 1 1.可行性研究前提 1 2.技术可行性分析 2 3.市场可行性分析 3 (二)产品定位及目标 4 1.产品需求 4 2.产品定位 4 3.产品 ...

  5. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  6. 游戏服务器排行榜的设计

    排行榜是游戏服务器中不可缺少的一部分,几乎所有的游戏都有排行榜.游戏排行榜根据排行榜需要上榜的人数有不同的设计,但是普遍来说一般都是显示前100名或者50名,排行榜排100,1k,1w人数,超过1w名 ...

  7. 共享游戏:社交游戏设计

    It's a truism that even in the era of instantly accessible content, nothing quite rivals the power o ...

  8. 如果现在让你来设计一款更受人欢迎的社交游戏,你会进行怎样的设计?以真实的社交游戏市场来分析,你可以自行组织描述结构,例如市场状况与对手分析、产品设计要点等均可描述。

    原创不易,麻烦点个关注,点个赞,谢谢各位. 目前市场上最火的社交游戏为王者荣耀. 市场状况:真实情感的互动社交游戏未来市场前景非常巨大,"游戏有很多年轻男性喜欢看的东西,比如打球.打枪.动作 ...

  9. 手机社交游戏设计中交互理念的渗透

    文/郑金条 延长玩家与游戏的生命周期 我从游戏设计中了解最多的除了游戏本身的机制效能,就是游戏化概念对其他产品价值及其衍生属性的影响.从本质上讲,游戏所提供的就是虚拟性的服务,而这层服务从用户获得体验 ...

最新文章

  1. 在CentOS 6.3 64bit上安装Apache Trafficserver 4.2.3挂载SAS硬盘和SSD
  2. Python爬虫入门(8):Beautiful Soup的用法
  3. iOS点击推送消息跳到应用指定页面
  4. 第二章 创建webGL设备和绘制缓冲区呈现 Context Creation and Drawing Buffer Presentation
  5. OpenCASCADE:Modeling Algorithms模块之布尔运算
  6. JAVA基础知识系列---进程、线程安全
  7. Hacking Team Flash 0day漏洞学习笔记
  8. oracle对查询结果求和_oracle基础知识分享
  9. 3月份分享一套 abcchn 的网站程序
  10. Github-Git for windowsTortoiseGit下载与安装
  11. ping首包慢的问题(及icmp对应关系)
  12. Kotlin 的工作原理
  13. 关于最近打断点的总结
  14. 智能替换DataTable.Select中会导致错误的单引号 的另一种算法实现.
  15. C语言程序——math库的函数应用
  16. 微信开发者工具如何使用SCSS和配置wxml文件高亮及格式化
  17. 8 EXCEL选择填充与粘贴
  18. Vue运行环境及淘宝镜像(cnpm命令)安装
  19. 智头条 | 四部门:2025年建立500家智能家居体验中心,小米发布人形仿生机器人,2022光亚展智能成主角
  20. 积极适应大数据时代要求 提升科技化和智能化水平

热门文章

  1. mysql freeing items_freeing items
  2. BT5:DecoratorNodes源码解析
  3. VMware超级详解安装
  4. Python爬虫-带你爬取高清美女图片
  5. python读写excel指定sheet
  6. AppStore 上架中的分类
  7. 《思科绿色数据中心建设与管理》——1.4 绿色阻力
  8. Docker镜像仓库配置
  9. 不是你不会做菜,你只是缺个好厨房:深谈御膳房架构演进
  10. 乐观锁与悲观锁的概念及实现方式