2013-06-11 42 views
4

我正在制作多人游戏。现在我试图选择将Android设备连接到服务器的技术。客户端运行在Android上,游戏是MMORPG。我想用java编写服务器。 现在我只有3个想法:高负载Java服务器

1)使用普通的java和套接字创建多线程环境。通过这种方式,在游戏客户端和服务器之间执行全双工连接将变得更加容易。但我有以下担忧:

1.1)游戏是MMORPG与大量的对象,我不知道如果有这样的解决方案是如何缩放比如有5000人同时玩。我能在java机器上运行多少个线程?我如何近似计算?在情况1线程正在读取每个套接字和1个线程正在写入套接字(所以2个线程为1个球员)。

1.2)当玩家人数增加时,我将如何扩展自我写入的jar-archive以分布在多个服务器上?也许有一些特殊的技巧可以做到这一点?

1.3)很多编程开销 - 套接字API是相当低的水平。

2)为服务HTTP请求创建一个Servlet接口。

2.1)只要每个玩家都有他/她自己的会话,便于控制会话(和授权)。

2.2)可以连接到Java EE EJB或其他任何东西 - 系统级编程带来的很多复杂问题都会被带走。所以我可以专注于编写业务逻辑。 2.3)可以使用HTTP - 移动设备+浏览器为所有类型的客户端提供服务。 2.4.2)高速 - 甚至1个servlet容器每秒可以处理几千个请求,因此速度非常快。

2.4),但这种方法不能提供全双工通信。我将不得不每隔1秒发送一次请求以检查更新。 1秒延迟对游戏没有太大的影响,因为它是基于回合的,但它仍然会产生很多流量。有很多玩家玩的时候可行吗?我听说过一些COMET技术,但似乎如果服务器必须在行中推送很多消息,我仍然必须每次都发送请求+这种技术尚未建立。

3)创建套接字并通过JMS将它们连接到Java EE服务器。

3.1)酷,因为允许客户端和服务器之间的全双工通信+提供java EE的所有酷功能。以后可以通过servlet接口扩展到浏览器。

3.2)这似乎是某种过度设计的。人们真的会这么做吗?我的意思是它甚至是正确的方式?任何一个健全的开发者会这样做吗?

我想请你帮助我的选择吧。我没有太多经验来做这样的工作。并希望坚持最佳做法。

+1

你应该读作[本文约C10K问题(http://www.kegel.com/c10k。 HTML)。建立可扩展的网络应用程序有很多建议和好的做法。 – nouney

+1

2.4:您应该看看彗星框架,它允许使用全双工servlet ...这是一篇关于IBM的好文章http://www.ibm.com/developerworks/web/library/wa-cometjava/ – David

回答

2

我不认为Idea 3会超过工程设计,我会走上这条路。

大厦@MessageDriven豆“适配器”,处理在onMessage方法传入套接字连接易于开发,并从那里你在井缩放EE世界是。

你是你的情况,你甚至可能想依靠UDP。见下面的例子: http://www.apprigger.com/2011/06/javaee-udp-resource-adapter-example/

但是从我的角度来看也有走这条路的另一重要原因。一些指针:

1.)正如你已经提到的。构建一个自己的Socket服务器来处理线程和请求是很多工作,最后你可以建立自己的小型“应用服务器”。

2.)不要害怕使用应用程序服务器。当然,人们倾向于称这种平台为“开销”。虽然当我测量调用其他服务或ebbs的时间量时,使用本地接口的成本不到10微秒。有自己的线程池&工作和自己处理它们可能会更快,虽然也不接近0微秒;-)

3.)有一个AS你可以很容易地配置你的实例边界。更重要的是,您可以比自制软件更容易地扩展您的应用程序。假设有一个集群运行在2台服务器上(如果你的MMO成功的话,你会这么做的)。网络负载均衡器适用于所有类型的体系结构,尽管有可能共享会话信息(可能不是用于游戏者连接,但为什么不用于登录用户会话)或集群节点上的实体管理者在EE包中是“免费”的。

所有这些EE工具&模式让您有时间来开发游戏,而不是一个框架;-)