我目前正在开发一个类似于blackjack的在线纸牌游戏,它将由一系列的表组成,其中每个表都有一个“经销商”和多个人玩家。经销商(计算机机器人)负责牌的交易和洗牌。表将存储在PostgreSQL数据库表中,人工管理员可以添加/删除/编辑表。
游戏将由一个网络前端和一个REST/websocket后端组成。我可能会使用Kubernetes和Nginx作为后端服务器的负载均衡器。
回答我的问题。假设我只有一台服务器,我可以让它从数据库中读取表列表,然后在每个表中启动一个交易商进程/线程。然而,如果我有两个或更多的服务器,事情就会变得更加混乱。
如何确保在所有服务器之间以平衡的方式分配表(例如,如果有10个表和3个服务器,则分布应该大约为3-3-4)。
如果服务器发生故障,如何确保将其表重新分配到活动服务器?
如何确保在新服务器上线时,重新分配一些现有的表(),以减少其他服务器的工作量?
发布于 2019-11-27 18:14:44
我假设每个状态更改都通过websockets转发给玩家,并存储到数据库中以保持持久性(仅用于故障恢复和一些统计)。因此,如果由于某种原因,server1停止工作,而nginx开始将table1的客户端连接到server2,那么它(Server2)在获取游戏状态方面就不会有问题,而server1在失败之前就提供了服务。
您可以使用URI或参数的散列将与同一表相关的所有请求转发到特定服务器。
当nginx看到该服务器脱机时,它将停止使用它作为池成员,并以一致的方式将所有请求迁移到另一台服务器。
当然,当新服务器上线时,现有表将不会在游戏期间重新分配到新服务器(因为您需要保持websocket连接处于工作状态)。
但是,当游戏结束时,您可以告诉客户端(通过现有的websocket连接)重新打开新的websocket连接,稍微修改URL,从而迫使nginx重新平衡服务器之间的连接。
upstream backend {
hash $request_uri consistent;
# hash $arg_table consistent;
server bj-1.card-games.com max_fails=2 fail_timeout=2s;
server bj-2.card-games.com max_fails=2 fail_timeout=2s;
server bj-3.card-games.com max_fails=2 fail_timeout=2s;
}
server {
location / {
proxy_pass http://$backend;
}
}https://stackoverflow.com/questions/57438912
复制相似问题