在2013年初马化腾被问及“过去两年腾讯在海外投资中最成功的案例是什么”时,他毫无疑问的回答:“投资美国的RiotGames,做出《英雄联盟》。”在那个时候,《英雄联盟》这款游戏仅上市3年,却以500万同时在线(日活跃用户1200万)玩家数量横扫全球,成为全世界第一大线上游戏。

而值得一提的是,一年后(2014年),该游戏的日活跃玩家数量已超过2700万,最高同时在线玩家也达到了750万。

  回顾《英雄联盟》的发展无疑是一个高速成长的光辉史,然而这个光辉史赖以生存的基础设施却不得不克服一次又一次的挑战,历经一次又一次的迭代,就比如下面我们要说的聊天服务。

  近日High Scalability创始人Todd Hoff总结了Riot Games公司Michal Ptaszek在Strange Loop2014会议上的演讲“Scaling Leagueof Legends Chatto70million Players”,简述了该游戏聊天服务“Makeitwork.Makeitright. Makeitfast.”理念的实现途径。

如上图所示,该游戏的聊天服务需要支撑750万并发用户,2700万日活跃用户,每秒钟需要处理的消息上万条,每台服务器每天处理消息达十亿条。

  对于对战类型游戏,团队间交流直接影响到了比赛的胜负。为了帮助完成这一目标,聊天服务初始就使用了XMPP特性,就如WhatsApp一样。在小规模下实现并没有什么难度,可以说是开箱即用,然而当用户快速增长时,挑战也随之而来。

  为了更快和更好的实现这一点,WhatsApp和LOL(英雄联盟)不得不定制化ErlangVM,对其进行优化并添加多个监控功能,只为解决大规模下的性能瓶颈。

  纵观整个服务架构,RiakCRDTs(commutativereplicateddatatypes,可交换多副本数据类型)应用无异是最大的亮点,通过零可变贡献实现大规模线性横向扩展。

  时至今日,CRDTs的使用范围仍然很小,甚至大多数人都没听说过这项技术,但是它将来必将成为众多机构的宠儿,在写操作上另辟奇径。下面我们一起看LOL如何打造支撑超过7千万玩家的聊天系统:

  状态
  月6700万的独立访问玩家,不包括其他使用这个系统的服务

  日活跃玩家2700万

  750万的并发玩家

  每台服务器每天路由10亿个事件,值得一提的是,CPU和内存使用率只有20-30%

  每秒处理1.1万条消息

  世界范围内部署的chat服务器达数百台,负责运维人员只有3个

  99%的可用率

  平台
  Ejabberd(Erlangbased)XMPPserver

  Riak

  LoadBalancer

  Graphite

  Zabbix

  Nagios

  Jenkins

  Confluence

Chat
  1.支持私聊和群聊

  2.Chat拥有独立的界面,同时还支持好友列表。你可以查看好友的连接状态(在线或离线)、游戏状态、游戏时间,以及获得过的奖项。

  3.RESTAPIs让chat可以作为其他LoL服务的后端服务。举个例子,store会与chat通信来验证好友关系。Leagues会使用chat的社交图谱将新玩家组织到一起。这样一来,这些新玩家就可以交到一些志同道合的朋友,从而增加在线时间。

  4.Chat必须稳定的保持在一个低延时环境,chat的宕机会拉低整个游戏的用户体验。

  5.选择XMPP作为协议,提供消息、状态信息并且负责通讯列表维护。

  6.基于性能和新功能等原因,他们不得不偏离核心XMPP协议。

  7.Chat服务打造时就选择了Ejabberd作为服务器。Erlang同样非常棒,拥有更好的错误隔离和可追溯性。同时,它还支持代码的热加载,如此一来,给bug打补丁时就不需要再重启服务。

  8.目标是零共享以实现线性横向扩展,同时零共享还更有益于错误隔离及追溯。在零共享实现上,系统刚还有一些提升空间。

  9.运维人员只有3人,这样就对chat服务器容错提出了非常高的要求,同时也意味着不是每个故障都需要人力介入。

  10.让它崩溃。不要试图从一个严重的故障中做缓慢的恢复。取而代之,从一个已知的状态下重启更加适合。举个例子,当大量数据库查询积压时,重启可以让新的查询实时完成,队列中的查询则另选恰当时间进行。

  11.每台服务器上都运行了Ejabberd和Riak,Riak作为服务器使用。在需要时,可添加服务器对系统进行横向扩展。Ejabberd和Riak运行在不同的集群中。

  12.Riak服务器使用了多数据中心备份机制,它们还会提供数据给第二Riak集群。类似社交图等昂贵的ETL查询都运行在第二集群上,从而避免主集群受到影响。备份操作同样会在第二集群上进行。

  13.扩展性、性能和容错机制是个长期奋斗目标,大部分的Ejabberd代码都已经被重写。

  重写以匹配自己的需求。举个例子,LoL中只存在双向好友关系,但是XMPP机制却允许不一致的好友关系。也就说是,基于XMPP建立好友列表需求16条客户端与服务器之间的消息(对于数据库来说这是一个非常重的负载),而重写后的协议完成这个操作只需要3条消息。

  移除不必要及不期望的代码。

  优化协议的本身。

  编写测试以避免崩溃。

  14.消除明显的瓶颈。

  15.避免共享可能会变化的状态,这样可以更容易的进行大规模线性扩展。

  MultiUserChat(MUC)。每个Chat服务器都可以支撑数百万连接数。每个用户连接中都包含了一个会话进程,当用户期望修改状态或者给一个房间发送消息时,事件则会被传送到一个被称为MUC路由器的单进程,然后MUC会将消息传递给相关的群聊。

  这是一个很明显的瓶颈,解决的方法是并发路由。优化之后,群聊房间的寻找会放在用户会话中,从而利用所有的核心。

  每个Ejabberd服务器都包含了会话列表的一个副本,它是用户ID和会话之间的映射。发送消息需要查找用户会话在集群中的位置,随后消息会被写入会话列表。

  通过校验会话是否存在、优先级以及一些其他的查询,写入操作的数量可以降低96%。这些校验对系统的提升非常大,可以大幅度减少用户登陆操作及状态修改时间。

  16.增加功能以获得生产环境中代码的能见度。让代码可以在涉及到同一事务的多个服务器上同时升级。

  17.优化ErlangVM中的服务器调试功能。获得会话内存使用情况,以更好地进行内存使用优化。

  18.项目开始时就考虑到了数据库扩展性。开始时选择的MySQL造成了性能、可靠性、扩展性等多方面的问题。比如,数据模式的修改速度匹配不了代码的变更。

  因此他们选择了Riak。Riak是个分布式的高容错键值存储。无主的机制让它可以避免单点故障,即使两台服务器同时发生故障也不会影响服务或丢失数据。

  需要在chat服务器上投入大量的精力以实现最终一致。实现了一个EjabberdCRDT库处理所有的写入冲突。尝试将对象转换到一个稳定的状态。

  CRDT是如何工作的?取代给好友列表直接添加一个新层,CRDT中为对象维护了一个操作日志,日志中记录的格式类似“AddPlayer1”和“AddPlayer2”。下一次对象会以请求的方式读取日志,从而解决了任何冲突。提供给对象的日志是无序的,因为这里并不需要去关心顺序。

  这样操作保证了好友列表的一致性。这里的理念是在合适时即对值进行修改,而不是为对象建立一个冗长的操作日志,并且只在对象的读取时完成操作。

  Riak是个非常大的成功,它提供了几乎线性的扩展性,鉴于对象可以被非常快的修改还提供了不错的模式灵活性。

  这是一个非常大的观念变革,它改变了服务测试和工具建立的方式。

  监视
  Chat服务建立了500个以上的计数器,每分钟都会对结果进行收集并传送给监视系统(Graphite、Zabbix、Nagios)。

  为计数器设定了阈值,在超过警戒线时会进行提醒。因此,在影响用户体验或者系统发生问题之前,问题就会被定位。

  举个例子,最近有一次客户端升级造成了无限广播用户状态的问题。着眼Graphite,工程师很快定位到服务器因新客户端上线(带来的新特性)而崩溃。

  实现FeatureToggles(功能表示)

  在无需重启服务的情况下实现新和功能上线下线。

  新功能开发时就会被添加Toggles(on/off)特性,如果一个功能导致问题产生,工程师可以立刻关闭它。

  部分部署。新代码可以只对某些特定的用户开放,或者只是某些特定的用户可以激活新代码,这允许在某个范围内测试风险较高的功能。一旦该功能通过测试,它就会被发布到所有用户。

  动态代码重载
  Erlang的一大特性就是动态热加载新的代码。

  在第三方客户端(比如pidgin)并没有经过良好的测试时,比如它会发送与官方客户端不同类型的事件,补丁在无需重启整个chat服务器时就可以快速被部署并集成到chat服务器,从而显著的减少玩家宕机。

  日志
  记录所有异常情况,比如错误和警报。

  服务器同样提供了健康检查报告,这样就可以查看日志(登陆用户数量、接受新的连接数以及好友列表修改情况)并决定这个服务器是否运行良好。

  为调试模式嵌入选择用户会话功能。如果存在可以或者测试用户(生产服务器上的QA测试),即使chat服务器上存在10万个会话,需要加载的会话也只有一个。日志只包括XML流量、事件以及度量,这将节省大量的日志空间。

  通过整合功能标识、部分部署和日志选择功能,系统已经完成了给部分用户推送新功能的准备;同时,系统还可以在没有其他用户干扰的情况下收集和分析日志。

  加载测试代码
  每天晚上,自动校验系统都会在测试环境中部署所有改变,并进行一连串的负载测试。

  测试过程中,服务器健康状态会被监控,度量会被取出并分析。系统会建立一个Confluence页面来记录所有度量和测试结果,测试结果概要会通过邮件发送。

  可以做功能发布前后的对比,这样很容易对比代码改变产生的影响,也很容易定位造成灾难或者提升内存消耗X个百分比的问题。

  未来的工作
  弃用MySQL。

  将chat服务扩展到游戏外,这样玩家在不登陆游戏的情况下就可以与好友交互。

  通过社交图来提升体验。分析玩家关系,并找出影响游戏兴趣的原因。

  计划将游戏内chat迁移到游戏外服务器。

  学到的知识
  1.故障肯定会产生,你不需要做到完全控制。即使你的代码不存在bug,也可能存在一个ISP路由器以及10万个用户同时丢失的情况。做好万全之策。确保系统可以承担同时丢失一半用户的情况,或者在丢失1/4chat服务器的情况下不会影响到性能。

  2.规模扩大小概率事件变常态。如果某个bug发生的概率是十亿分之一,但是在LoL的规模,这个bug可能每天都会发生一次。即使某些完全不可能发生的事件都有可能发生。

  3.成功的关键是清楚系统发生的所有事情。必须清楚你系统是健康的或者濒临崩溃。

  4.指定一个策略。LoL为其chat服务选择了横向扩展策略。为了支撑这个策略,他们选择了一个不同的途径来支撑这个策略。他们不仅选择了Riak这个NoSQL数据库,同时还挑战了CRDTs这个途径,只为了横向扩展能尽可能的无缝和强大。

  5.可用。贯穿开始和衍变。他们开始于Ejabberd,这并不一定代表着Ejabberd更容易开始,但是Ejabberd绝对可以更匹配他们的需求。

  6.让一切更可见。增加追踪、警报、监视、同样一级一切有意义的东西。

  7.让系统可运维。LoL给软件更新添加了事务特性,还给系统添加了功能标识、热更新、自动化测试加载、高可配置日志等级等功能,这一切都只是为了更容易管理。

  8.减少无用协议。定制系统所需的功能。如果你的系统只存在双向好友关系,那么你不再需要那个通用的昂贵协议。

  9.避免可变状态共享。这条已众所周知,但是仍然有系统会共享可变状态,从而导致横向扩展时的各种问题。

  10.利用好你的社交图。Chat服务提供了一个原生的社交图。这些信息可以被用于提升用户体验,以及开发更有意思的新功能。

转载于:https://www.cnblogs.com/ELsky/p/7474036.html

深度分析《英雄联盟》游戏运营商背后的大数据支撑体系相关推荐

  1. 饶少阳:运营商急需网络大数据能力

    在"合作共建大网络"专题峰会上,中国电信北京研究院网络规划中心副主任饶少阳表示,网络大数据通过运用大数据技术,分析和挖掘网络上用户流量流经各网元产生的数据,可实现网络的可视化,当前 ...

  2. 数据资产的运营商--天市大数据交易平台

    信息大爆炸的今天,不讨论大数据这个话题似乎有点跟不上时代节奏.从金融到教育,再到医疗等其他各个领域,大数据正在融入人们的生活中.随着互联网的发展,人们在网络上的一举一动几乎都成为了网络数据,这些数据经 ...

  3. 中国大数据资产运营商九次方大数据估值或将突破100亿

    大数据是信息化发展的新阶段,我国旺盛的大数据应用需求和巨大的市场空间,在为大数据产业的创新发展提供强大驱动力的同时,催生了一大批大数据企业在中国崛起.2010年就投身其中的中国大数据资产运营商,九次方 ...

  4. 运营商常见的大数据业务学习笔记

    关键绩效指标(KPI:Key Performance Indicator)是通过对组织内部流程的输入端.输出端的关键参数进行设置.取样.计算.分析,衡量流程绩效的一种目标式量化管理指标,是把企业的战略 ...

  5. 无处不数据的时代 三大运营商如何变现大数据价值?

    5月18日消息,昨天是世界电信日,其主题是"发展大数据,扩大影响力". 其实我们已经处在了无处不数据的时代,但大数据的发展才刚刚开始,城市中的数据利用率仅为0.4%,且大部分数据还 ...

  6. League-X:深度学习+英雄联盟,英雄联盟小地图识别器,标定对面打野位置

    League-X:使用深度学习的英雄联盟小地图辅助器 简介 本人是一个英雄联盟爱好者,同时对人工智能,深度学习之类的课题很感兴趣,去年心血来潮,使用图像识别写了一个识别英雄联盟小地图的代码: 这是第一 ...

  7. Python爬取熊猫TV 英雄联盟游戏分类下面所有主播的人气排行

    编写这个原生爬虫项目的3个主要目的: 1.巩固 python 基础知识 2.了解合理的编码规范和方式 3.了解爬虫基本原理 项目分析: 1.爬取网站: 熊猫TV(https://www.panda.t ...

  8. Docker在英雄联盟游戏中的实践探索(五)

    本文讲的是Docker在英雄联盟游戏中的实践探索(五),[编者的话] 这篇博客是Riot的Docker实践系列博客的第五篇,主要讨论了如何从头创建你的Docker镜像. 在以前的帖子中,我们讲解了如何 ...

  9. 基于NodeJS英雄联盟游戏游戏综合网站

    21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确.快速. ...

  10. 游戏迷英雄联盟游戏高清壁纸!扮演你的英雄

    简介:英雄联盟游戏的风靡已经持续了好长一段时间了. 这个由腾讯旗下的公司开发的竞技网游,目前已经累计了相当多的玩家和粉丝. lol英雄联盟壁纸大全让你重新燃起战斗的热情. 说到电脑壁纸,你是否也是一个 ...

最新文章

  1. centos7安装mysql缺失依赖_CentOS7安装mysql5.7不成功,解决依赖包之后还是无法安装成功...
  2. React Native ScrollableTabView的自定义tabBar
  3. 如何找出Fiori frontend server的systen ID
  4. Unity AssetBundles and Resources指引 (三) AssetBundle基础
  5. npm安装vue_vue搭建脚手架的方式
  6. 如何排查mysql数据乱码_如何解决MYSQL数据库中文乱码问题?
  7. 树莓派串口通信编码_树莓派和STM32通过USB和串口通信记录
  8. 安装 ActiveState Perl
  9. 南京大学计算机考研的重点,南京大学计算机考研
  10. U8v10.1 出纳票据打印在 Nantian PR2E上打印不正确问题的解决方法
  11. Pygame简易版2048小游戏:超详细解说,看完还不会可以剁手了(附完整源码)
  12. 2012年8月编程语言就业趋势
  13. gta5怎么设置画质最好_GTA5画面如何设置最好_GTA5画质设置成最高配置推荐-win7之家...
  14. 阴阳师手游服务器维护,12月30日阴阳师服务器维护更新公告
  15. 数据结构之冒泡排序的两个优化细节
  16. openharmony开发TS语言基础
  17. opencv之fitline直线拟合
  18. 弘辽科技跨境电商创业不得不知的6个问题,第一,哪些人适合,有哪些门槛
  19. 岁末回首,义无反顾!
  20. 微型计算机安装教程,微型计算机的软件安装

热门文章

  1. Android模拟点击屏幕,实现按键精灵点击屏幕功能
  2. Python 好玩代码
  3. Ffmpeg常用转码命令
  4. 实用的技巧之免费下载百度文库VIP文章
  5. ProE/Creo8.0学习笔记(更新中)
  6. 史上最简单的土地利用转移矩阵分析(附练习数据下载)
  7. Word1——word 2016(笔记本预装)安装MathType 7教程
  8. 怎么自己发表计算机学术论文,计算机学术论文写做与发表
  9. JAVA程序入门(✨详解✨)
  10. 从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?