多人游戏的可扩展 login/lobby 服务器
Scalable login/lobby servers for a multiplayer game
我正在开发一款多人游戏(client-server 模型),但在扩展其服务器时遇到困难。
据我所知,大多数游戏的玩家人数从未超过 10 000 人,我认为我的游戏也不会。
虽然如果我很幸运能得到它,我想开发服务器,这样它们以后就不会变成一个巨大的障碍物。
我在互联网上搜索了很多解决我的问题的方法,检查了 GDC 讨论它并检查了该网站上的其他帖子,但是 none 似乎解决了我的具体问题。
我当前的设置如下,所有服务器都是用 C++ 编写的,使用 ENet 作为我的网络库。
游戏服务器
此服务器处理游戏的实际游戏玩法,需要在服务器与其连接的客户端之间发送大量 CPU 和数据包。
但是这个专用服务器是玩家自己托管的,根本不用考虑扩容。
大厅服务器
此服务器处理服务器列表,其中包含当前运行的所有服务器。
所有游戏服务器每 5 秒向该服务器发送一个 UDP 包,表示它们还活着。
这样大堂服务器可以保留当前在线的所有服务器的更新列表。
所有客户端在想要获取所有服务器时都向该服务器发送一个UDP包(仅在服务器中
列表屏幕),大厅服务器发回所有服务器的列表。
这种情况不会经常发生,并且大厅服务器被限制为每秒向客户端发送 4 个服务器(而不是包含所有服务器的大包)。
登录服务器
此服务器处理创建帐户、丢失密码、登录、好友及其当前游戏状态,
发送给其他登录玩家的私人消息和玩家资料,指定他们拥有的 in-game 物品。
所有客户端每 5 秒向该服务器发送一个 UDP 包,表示它们还活着,同时
发送他们当前所在的游戏。服务器然后发回他们的好友列表 online/offline/in-game 状态。
这样他们的朋友就可以更新 online/offline/in-game.
的朋友列表
它仅发送玩家操作的消息,否则,如创建帐户、登录、changing/resetting 密码,
adding/removing/ignoring 朋友,私信给朋友等
我的问题
我担心的是我的大厅和登录服务器可能无法扩展,而且它们的流量会太大。
1. 理论上它们可以托管在一台计算机上吗?或者对于 10 000 多名玩家来说流量会太大吗?
2.如果它们可以托管在一台计算机上,服务器对于住在很远的人来说仍然没有问题吗?
在这种情况下,世界上每个地区都有大厅和登录服务器会更好吗?
不好的是,如果玩家住在欧洲,他们将无法在美国看到服务器,并且他们的帐户和物品将不会存在于其他服务器上。
3. 可能是 far-fetched,但如果我重写这两个服务器,而不是在一个有数据库的网站上,并使 client/game 服务器做
改为网络请求(例如 HTTPS 或使用特定的 headers 调用 php),
它会以某种方式帮助解决我的问题吗?
您所有的问题和问题都可以通过基于无服务器云的解决方案来解决AWS Lambda 例如或类似的。在这种情况下,可伸缩性不是您的问题。只是发展逻辑。这将为您节省很多时间。
如果您想将服务器作为由您自己的服务器托管的单个应用程序。考虑使用类似的东西Go 而不是 C++。它正是为这些目的而设计的。我的意思是高负载 web/network 服务。
好吧,这是 C++,我在 java 中编写代码,但也许逻辑对你有用,所以我会告诉你我最终如何在赌场实现类似的东西。
在我的例子中,我在同一个服务器程序中有 2 个不同的套接字,其中一个套接字是 TCP,它处理所有登录、注册和支付,而第二个套接字是 UDP,它处理多个付款人的实际游戏播放,那么您可以在内部将所有这些 UDP 连接分组(可能是套接字数组)以生成这些大厅。这样做你所有的服务器只是一个 class 可以 运行 在一台电脑上使用 2 个端口(每个插座一个)但是这并不能解决住在很远的人的 ping 问题。
如果 ping 是一个问题(不是我在赌场的情况),你可能会托管你的服务器区域基础,但删除你的服务器的登录、注册和支付,并替换它以连接到中央服务器(这个中央服务器应该是 TCP 和您还可以实施 https 套接字,以允许您的网页连接到此服务器并创建帐户或直接从浏览器向您付款)
抱歉让您的生活更加混乱,但希望对您有所帮助
我正在开发一款多人游戏(client-server 模型),但在扩展其服务器时遇到困难。
据我所知,大多数游戏的玩家人数从未超过 10 000 人,我认为我的游戏也不会。 虽然如果我很幸运能得到它,我想开发服务器,这样它们以后就不会变成一个巨大的障碍物。
我在互联网上搜索了很多解决我的问题的方法,检查了 GDC 讨论它并检查了该网站上的其他帖子,但是 none 似乎解决了我的具体问题。
我当前的设置如下,所有服务器都是用 C++ 编写的,使用 ENet 作为我的网络库。
游戏服务器
此服务器处理游戏的实际游戏玩法,需要在服务器与其连接的客户端之间发送大量 CPU 和数据包。 但是这个专用服务器是玩家自己托管的,根本不用考虑扩容。
大厅服务器
此服务器处理服务器列表,其中包含当前运行的所有服务器。
所有游戏服务器每 5 秒向该服务器发送一个 UDP 包,表示它们还活着。 这样大堂服务器可以保留当前在线的所有服务器的更新列表。
所有客户端在想要获取所有服务器时都向该服务器发送一个UDP包(仅在服务器中 列表屏幕),大厅服务器发回所有服务器的列表。 这种情况不会经常发生,并且大厅服务器被限制为每秒向客户端发送 4 个服务器(而不是包含所有服务器的大包)。
登录服务器
此服务器处理创建帐户、丢失密码、登录、好友及其当前游戏状态, 发送给其他登录玩家的私人消息和玩家资料,指定他们拥有的 in-game 物品。
所有客户端每 5 秒向该服务器发送一个 UDP 包,表示它们还活着,同时 发送他们当前所在的游戏。服务器然后发回他们的好友列表 online/offline/in-game 状态。 这样他们的朋友就可以更新 online/offline/in-game.
的朋友列表它仅发送玩家操作的消息,否则,如创建帐户、登录、changing/resetting 密码, adding/removing/ignoring 朋友,私信给朋友等
我的问题
我担心的是我的大厅和登录服务器可能无法扩展,而且它们的流量会太大。
1. 理论上它们可以托管在一台计算机上吗?或者对于 10 000 多名玩家来说流量会太大吗?
2.如果它们可以托管在一台计算机上,服务器对于住在很远的人来说仍然没有问题吗?
在这种情况下,世界上每个地区都有大厅和登录服务器会更好吗?
不好的是,如果玩家住在欧洲,他们将无法在美国看到服务器,并且他们的帐户和物品将不会存在于其他服务器上。
3. 可能是 far-fetched,但如果我重写这两个服务器,而不是在一个有数据库的网站上,并使 client/game 服务器做 改为网络请求(例如 HTTPS 或使用特定的 headers 调用 php), 它会以某种方式帮助解决我的问题吗?
您所有的问题和问题都可以通过基于无服务器云的解决方案来解决AWS Lambda 例如或类似的。在这种情况下,可伸缩性不是您的问题。只是发展逻辑。这将为您节省很多时间。
如果您想将服务器作为由您自己的服务器托管的单个应用程序。考虑使用类似的东西Go 而不是 C++。它正是为这些目的而设计的。我的意思是高负载 web/network 服务。
好吧,这是 C++,我在 java 中编写代码,但也许逻辑对你有用,所以我会告诉你我最终如何在赌场实现类似的东西。
在我的例子中,我在同一个服务器程序中有 2 个不同的套接字,其中一个套接字是 TCP,它处理所有登录、注册和支付,而第二个套接字是 UDP,它处理多个付款人的实际游戏播放,那么您可以在内部将所有这些 UDP 连接分组(可能是套接字数组)以生成这些大厅。这样做你所有的服务器只是一个 class 可以 运行 在一台电脑上使用 2 个端口(每个插座一个)但是这并不能解决住在很远的人的 ping 问题。 如果 ping 是一个问题(不是我在赌场的情况),你可能会托管你的服务器区域基础,但删除你的服务器的登录、注册和支付,并替换它以连接到中央服务器(这个中央服务器应该是 TCP 和您还可以实施 https 套接字,以允许您的网页连接到此服务器并创建帐户或直接从浏览器向您付款)
抱歉让您的生活更加混乱,但希望对您有所帮助