高负载Java服务器

4
我正在制作一个多人游戏。现在我正在尝试选择连接Android设备到服务器的技术。客户端在Android上运行,游戏是MMORPG。我想用Java编写服务器。
现在我只有三个想法:
1)使用纯Java和套接字创建多线程环境。这样可以更容易地在游戏客户端和服务器之间执行全双工连接。但我有以下担忧:
1.1)游戏是具有大量对象的MMORPG,如果有例如5000人同时玩,我不确定这种解决方案如何扩展。我能在Java机器上运行多少线程?我怎样大概计算它?如果每个套接字都有1个线程读取并且1个线程写入(因此每个玩家需要2个线程)。
1.2)当玩家数量增加时,我将如何扩展自己编写的jar归档文件以分布在几个服务器上?也许有一些特殊的技巧可做到?
1.3)很多编程开销 - 套接字API相当低级。
2)创建用于提供HTTP请求的Servlet接口。
2.1)只要每个玩家都有自己的会话,就容易控制会话(和授权)。
2.2)可以连接到Java EE EJB或其他任何东西 - 系统级编程的许多复杂性都被消除了。因此,我可以专注于编写业务逻辑。
2.3)可以为所有类型的客户端提供HTTP - 移动设备+浏览器。
2.4)高速 - 即使一个Servlet容器也可以每秒处理几千个请求,因此它将非常快。
2.4)但这种方法不能提供全双工通信。我将不得不每1秒发送一次请求以检查更新。对于回合制游戏而言,1秒的延迟并没有太大影响,但仍会产生很多流量。当有很多玩家时,这是否可行?我听说过某些COMET技术,但似乎如果服务器必须连续推送多条消息,则仍需每次发送请求+此技术尚未得到很好的确立。
3)创建套接字并通过JMS将它们连接到Java EE服务器。
3.1)很酷,因为允许客户端和服务器之间进行全双工通信,并提供Java EE的所有酷功能。稍后可以通过servlet接口扩展到浏览器。
3.2)它似乎是某种过度设计。真的是人们会这样做吗?我的意思是这是否正确的方式?任何理智的开发者都会这样做吗?
请帮我选择一下。我没有太多这样的工作经验。并希望坚持最佳实践。

1
你应该阅读这篇关于C10K问题的论文。里面有很多创建可扩展网络应用程序的建议和良好实践。 - nouney
1
2.4:你应该看一下Comet框架,它允许全双工的servlet... IBM上有一篇很好的文章介绍它 http://www.ibm.com/developerworks/web/library/wa-cometjava/ - David
1个回答

2

我认为Idea 3并不会过度工程化,我会赞成这样做。

在onMessage方法中构建@MessageDriven Bean“适配器”以处理传入的套接字连接非常容易开发,并且从那里开始,您可以进入良好扩展的EE世界。

在你的情况下,甚至可能希望依赖UDP。请参见以下示例:http://www.apprigger.com/2011/06/javaee-udp-resource-adapter-example/

但是从我的角度来看,沿着这条路走还有其他重要原因。一些指针:

1.) 正如您已经提到的。构建自己的Socket服务器处理线程和请求需要大量工作,最后您可能会建立自己的小型“应用程序服务器”。

2.) 不要害怕使用应用程序服务器。当然,人们倾向于称这样的平台为“额外负担”。虽然当我测量调用其他服务或EBB所花费的时间时,使用本地接口的成本不到10微秒。拥有自己的线程池和工作程序,以及自己处理它们可能会更快,但也远远不接近0微秒;-)

3.) 有了AS,您可以非常轻松地配置实例边界。更重要的是,您可以比自己制作的软件更容易地扩展应用程序。想象一下在2个或多个服务器上运行的集群(如果您的MMO很受欢迎,您就会这样做)。网络负载均衡器适用于各种架构,但具有在EE包中“免费”共享会话信息(可能不适用于游戏玩家连接,但为何不适用于已登录用户会话)或聚合实体节点的可能性。

所有这些EE工具和模式都可以让您有时间开发游戏而不是框架;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接