0

0

利用Terracotta实现SmartFoxServer2X集群

php中文网

php中文网

发布时间:2016-06-07 15:30:36

|

1513人浏览过

|

来源于php中文网

原创

博客搬家啦——为了更好地经营博客,本人已经将博客迁移至www.ijavaboy.com。这里已经不再更新,给您带来的不便,深感抱歉!这篇文章的新地址:点击我 两个多月没有更新博客了,那是因为刚进入一个新的领域,疯狂地学习并工作。这两个月,对于我来说,是一次新的

博客搬家啦——为了更好地经营博客,本人已经将博客迁移至www.ijavaboy.com。这里已经不再更新,给您带来的不便,深感抱歉!这篇文章的新地址:点击我利用Terracotta实现SmartFoxServer2X集群


        两个多月没有更新博客了,那是因为刚进入一个新的领域,疯狂地学习并工作。这两个月,对于我来说,是一次新的旅程。从之前的android开发,一不小心溜入游戏服务器端的开发。现在,终于有了一点闲暇,记录一下这两个月中学到的和领悟到的知识。

        两个月前,进入一家做互联网3D产品的创业公司,而我负责的,正是服务器端的开发。和传统的3D游戏不同,这里没有复杂的游戏逻辑,只专注于产品需要的功能,客户端中不外乎用户的登陆和聊天等功能。而服务器端主要的任务就是处理用户的登陆登出和各种信息的同步。之前的一个月,学习了SmartFoxServer引擎,同时一并学习了下Unity3D引擎(因为客户端使用的是这个,学这个主要是为了可以很好地和客户端配合)。

        一直到几个星期前,当老大说要支持高达200000个用户同时在线的时候,才知道SFS2X试用版最多只可以支持100个用户,几经周折破解了SFS2X,消除了这个限制。但是,就算消除了限制,让一台机子同时处理200K个用户同时在线并操作,最后的结果只有一个——它将活活累死!于是,到SFS官方论坛和网站上寻求答案,虽然英文马马虎虎,但还可以表情达意,最终得知Terracotta是个好东东。而且官方有一个SmartFoxServer1.6和Terracotta集成的文档。

       正当我兴致突起,准备大干一场的时候,无意中被当头一棒——SmartFoxServer2X明确表态,从2X起,SmartFoxServer不再支持Terracotta集群。花了好几个昼昼夜夜,在其官方论坛上用那生硬的English发帖询问,结果终于得到证实,2X开始真的不支持或者不再提倡使用Terracotta来集群。再次看到1.6的那份官方集群文档的最后一句:

      Finally the future releases of SmartFoxServer  will move towards a tighter integration with Terracotta,
      to provide even more distributed services out of the box, and further simplify the development

我不禁哑然!

        后来,翻阅了大量了官方论坛上的帖子,却又找到官方人员的相关言论说,可以按照1.6思想的来使用Terracotta完成SFS的集群。于是,我决定尝试一把...

        写好了集群扩展的代码,当想要测试一把的时候,才发现,怎样让Terracotta识别SFS2X呢?也就是怎样将SFS2X作为Terracotta集群的客户端来启动呢?

       下载了1.6的集群的Demo,看到了它是使用了一个新的bat文件来启动的。看了下这个文件,其中含有Terracotta的启动包,终于明白了,原来如此。于是将其拷贝到

SFS2X的启动bat文件中,成功实现将SFS2X加入到Terracotta集群中。通过Terracotta Developer Console也可以看到连接上的客户端。

兴奋之余,将写好的SFS2X集群扩展Demo打了个jar包放到了SFS2X中,又写了个测试的Client,结果一运行,报了一个大大的异常,从异常信息看出,这个和ClassLoader有关。

        之前学习SFS2X的时候,看到过官方介绍过2X中使用了新的ClassLoader机制。核心SFS2X使用SystemClassLoader加载,每一个扩展使用一个新的ClassLoader进行加载,这样是为了方便应用扩展的热部署。但是,这个热部署我倒不太愿意用,现在又因为这个鸟东东和Terracotta集群有了冲突。

        从Terracotta的官方论坛中又再次得知,加载Terracotta中共享数据的ClassLoader必须命名,Terracotta就是根据ClassLoader的名称来完成不同JVM之间相同数据的同步。

        这下彻底死了个翘翘,难道注定了无法实现SFS2X和Terracotta的集成吗?心有不甘。。。

       这时,一个强烈的念头涌上心头,SmartFoxServer2X不是用java写的嘛,反编译你的源码,殊死一搏吧。

       这个时候,发现其代码并没有进行加密,心中大喜。反编译后的代码清楚无比,看到了在加载每个扩展的时候,其都定义了一个URLClassLoader来完成扩展的加载。那么我现在就需要替换掉这个URLClassLoader,而使用自己的定义的ClassLoader。

       于是引入Terracotta和SmartFoxServer相关的jar包,重新实现了个命了名的ClassLoader,让这个ClassLoader完成扩展的加载。

       打成jar包,替换掉原来的jar包,运行起来,OK!测试通过,集群终于实现。

       实现集群的目的,主要是为了分担负载和容错。那么现在如何实现负载均衡成为一个关键,看了很多关于负载均衡的资料,基本是基于Http请求的负载均衡。但是,对于像SmartFoxServer一样的游戏服务器端引擎来说,其使用的往往是Tcp或者Udp协议。而我们知道,Http协议是无状态的,用户的每一次请求都可以做到负载均衡。而Tcp或者Udp使用的是长连接的形式,用户一旦和某个物理机器连接了,那么直到他主动退出或者这个物理机器上的SmartFoxServer出现故障,否则其在登陆中所发出的每一次请求都是在同一个TCP或者UDP连接中完成的。那么如何实现SFS2X的负载均衡呢?

利用Terracotta实现SmartFoxServer2X集群



       有两个思路:

        1、客户端维护一个服务器端可用的SFS2X节点的列表,然后每次请求的时候随即获取一个进行连接,如果请求超时或者失败,则再重新选择一个尝试连接。但是这个方案不能根据负载状况进行请求。

        2、就是外加一个负载均衡服务器,这个服务器作为一个普通的Web Server。可以使用Tomcat或者Apache等。他主要的功能就是负责维护每个SFS2X节点的负载情况(每个节点上登陆的用户数)和可用的SFS2X节点信息。当一个客户端请求登陆SFS2X服务器的时候,其首先发送Http请求到这个WebServer,这个WebServer会查询并返回当前所有可用的节点和每个节点对应的负载信息。然后,客户端根据返回的数据,选择一个负载最小的节点进行连接。但是这个方案,这个单点的WebServer容易成为整个系统的瓶颈,同时可能成为单点故障。但是这个可以使用传统的负载均衡技术来避免这些问题。

利用Terracotta实现SmartFoxServer2X集群

        第一个基本排除,采用第二个。但是第二个又引发一个问题。就是负载均衡服务器和SFS2X集群如何完成数据的同步。是每个SFS2X节点每隔一定的时间将连接到本机的用户数等信息发送到一个存储媒介,这样,负载均衡服务器每次只需要查询这个存储媒介就可以了。但是,这个会成为瓶颈吗?

I DON'T KNOW,JUST TEST IT!











热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

28

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

7

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

漫画防走失登陆入口大全
漫画防走失登陆入口大全

2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

8

2026.01.31

php多线程怎么实现
php多线程怎么实现

PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

1

2026.01.31

php如何运行环境
php如何运行环境

本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php环境变量如何设置
php环境变量如何设置

本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php图片如何上传
php图片如何上传

本合集涵盖PHP图片上传的核心方法、安全处理及常见问题解决方案,适合初学者与进阶开发者。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.8万人学习

CSS3 教程
CSS3 教程

共18课时 | 5万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号