问题描述
我正在开发一款多人游戏(客户端-服务器模型),但在扩展服务器方面遇到困难。
我知道大多数游戏甚至从未达到 10 000 多名玩家,我认为我的也不会。 不过,如果我很幸运,我想开发服务器,这样它们以后就不会成为一个巨大的障碍。
我在互联网上搜索了很多解决我的问题的方法,查看 GDC 谈论它并查看本网站上的其他帖子,但似乎没有一个能解决我的具体问题。
我当前的设置如下,所有服务器都是用 C++ 编写的,使用 ENet 作为我的网络库。
游戏服务器
该服务器处理游戏的实际游戏玩法,需要在服务器与其连接的客户端之间发送大量 cpu 和数据包。 但是这个专用服务器是由玩家自己托管的,所以我根本不需要考虑扩展它。
大厅服务器
此服务器处理服务器列表,其中包含当前启动的所有服务器。
-
所有游戏服务器每 5 秒向该服务器发送一个 UDP 数据包,表示它们还活着。 这样大厅服务器就可以保存当前在线的所有服务器的更新列表。
-
当所有客户端想要获取所有服务器时(仅在服务器中),所有客户端都向该服务器发送了一个 UDP 包 list screen),大厅服务器发回所有服务器的列表。 这不会经常发生,大厅服务器被限制为每秒向客户端发送 4 个服务器(而不是包含所有服务器的巨大包)。
登录服务器
此服务器处理创建帐户、丢失密码、登录、朋友和他们当前的游戏状态, 发送给其他已登录玩家的私人消息和玩家个人资料,指明他们拥有哪些游戏内物品。
-
所有客户端每 5 秒向该服务器发送一个 UDP 包,表示它们还活着,同时也 发送他们当前正在玩的游戏。然后服务器发回他们的好友列表在线/离线/游戏中状态。 这是为了让他们的朋友可以保留在线/离线/游戏中的朋友的更新列表。
我的问题
我担心的是我的大厅和登录服务器可能无法扩展,而且它们的流量会过多。
1.理论上它们可以托管在一台计算机上吗?或者对于 10 000 多名玩家来说会不会有太多流量?
2.如果它们可以托管在一台计算机上,那么对于住得很远的人来说,服务器仍然不会有问题吗?
在这种情况下,世界每个地区都有大厅和登录服务器会更好吗?
这样做的坏处是,如果玩家住在欧洲,他们将无法看到美国的服务器,并且他们的帐户和物品不会存在于其他服务器上。
3. 可能有点牵强,但如果我将两台服务器都重写为位于带有数据库的网站上,并使客户端/游戏服务器可以 改为使用网络请求(例如 HTTPS 或使用特定标头调用 PHP), 它会以某种方式帮助解决我的问题吗?
解决方法
您的所有问题和疑问都由基于无服务器云的解决方案 AWS Lambda 解决,例如或类似。在这种情况下,可扩展性不是您的问题。只需开发逻辑。这将为您节省很多时间。
如果您想让服务器成为由您自己的服务器托管的单个应用程序。考虑使用类似的东西,例如去而不是 C++。它专为这些目的而设计。我的意思是高负载的网络/网络服务。
,嗯,这是 C++,我用 Java 编写代码,但也许逻辑对你有用,所以我会告诉你我最终如何实现类似但在赌场中的东西。
就我而言,我在同一个服务器程序中有 2 个不同的套接字,其中一个套接字是 TCP,它处理所有登录、注册和支付,而第二个套接字是 UDP,它处理多个付款人正在玩的实际游戏,然后您可以在内部将所有这些 UDP 连接分组(可能是套接字数组)以生成这些大厅。这样做您的所有服务器只是一个可以使用 2 个端口(每个套接字一个)在单个 pc 上运行的类,但是这并不能解决住得很远的人的 ping 问题。 如果 ping 有问题(不是我在赌场的情况),您可能会托管您的服务器区域基础,但删除您服务器的登录、注册和付款,并将其替换为与中央服务器的连接(该中央服务器应该是 TCP 和您还可以实现 https 套接字,以允许您的网页连接到此服务器并创建帐户或直接从浏览器向您付款)
很抱歉让您的生活更加混乱,但我希望它有所帮助