在 前面的文章 中,我们已经开始了不少逻辑功能的开发,在这期间也有不少可以分享的经验点,这个我们以后慢慢道来。今天,我们主要讨论下如何让服务端能进行分布式部署和工作。

一:为什么要支持分布式部署和开发
    众所周知,python是单线程的语言,存在GIL锁、无法利用多核CPU等诸多限制,为了能让服务端能承载更多的用户,我们必须让程序能在逻辑上、甚至物理上分开,当用户达到一定数量的时候,我们能新开一个进程来响应请求,或多加一台服务器来处理请求。这样就能达到理论上无限扩展的可能性。

二:如何让程序能达到上述效果
    我们简单分析下我们的服务端要实现的功能:
    战斗服务器:
    通过 之前的文章 可以知道,我们的战斗是类似回合制的战斗模式,每场战斗之间的数据是无关联的,仅需要处理战斗中各玩家之间的数据交互即可,这很容易可以让逻辑分开处理。
    地图服务器:
    每个地图之间的玩家,在大部分时间里,也是不需要交互的,因此我们可以按地图来处理逻辑,在切换地图时,若下一张地图的服务进程在其他服务器,则先将当前地图的数据保存到memcache,连接到下一个服务器的时候,在从memcache中将数据取回即可。
    聊天服务器:
    在不同的地图的玩家,会存在聊天的交互(比如:私聊,世界频道,公告频道等),因此所有的玩家都需要连接至一个公共的聊天服务进程,来达到数据交互的目的。

三:源代码
    下面,我以战斗服务器为例来看看,首先,得有一个主调度进程,客户端在进入战斗前,先连接该进程,该进程在收到请求后,根据各战斗逻辑进程当前玩家的数量,来判定是否需要开启新的进程,并返回当前人数最少的进程的IP:PORT。

我通过以下方法来开启战斗进程:

  1. FIGHTNUM = {}
  2. MAXNUM = 1000 #每个进程的承载上限 超过该值自动新开启一个服务进程
  3. NOWFIGHTPORT = 7000 #战斗服务进程初始端口
  4. #开启一个新的战斗服务进程
  5. import subprocess
  6. def openFight():
  7. global NOWFIGHTPORT,FIGHTNUM
  8. FIGHTNUM[NOWFIGHTPORT] = 0 #该服务器当前战斗数
  9. subprocess.Popen('python '+os.getcwd()+'/fightserver.py ' + str(NOWFIGHTPORT)+' &',shell=True) #运行脚本
  10. NOWFIGHTPORT = NOWFIGHTPORT + 1
  11. openFight() #初始化,开启一个服务进程

新建一个调动服务进程 ,在dataReceived时处理:

  1. def dataReceived(self, data):
  2. global MAXNUM
  3. msgArr = data.split('|')
  4. if msgArr[0] == 'get':
  5. n = sorted(FIGHTNUM.items(), key=lambda d: d[1]) #按value低->高排序
  6. #达到预设上限,开启新进程
  7. if n[0][1]>=MAXNUM:
  8. openFight()
  9. p = NOWFIGHTPORT #返回新开启的进程的port
  10. else:
  11. p = n[0][0] #返回人数最少的进程的port
  12. client.transport.write(str(p))
  13. elif msgArr[0] == 'add':
  14. FIGHTNUM[msgArr[1]] = FIGHTNUM[msgArr[1]] + 1
  15. elif msgArr[0] == 'del':
  16. FIGHTNUM[msgArr[1]] = FIGHTNUM[msgArr[1]] - 1
  17. client.transport.loseConnection()

在进入战斗前,连接调度进程的端口,并发送'get',调度程序会返回一个战斗进程的port,客户端连接该port,连接成功后,向调度端口发送'add|7001',战斗结束时,向调度端口发送'del|7001'(其中的7001为战斗服务器监听的端口),这样即可达到在同服务器分布的目的,实现了这一步,那跨服务器的分布也就变得很容易了。
    对于地图服务器也可以采用类似的处理方法,完善以上功能后,我们的服务端就变得更加强壮了,承载人数方面可以也可以多了一个保障。

用python来开发webgame服务端(5)相关推荐

  1. 聚播微信多开客服系统二次开发SDK服务端接口

    聚播微信多开客服系统二次开发SDK服务端接口 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo);bre ...

  2. python搭建客户端和服务端

    python搭建客户端和服务端 前言 一.客户端搭建 搭建过程整理 TCP客户端 2.x版本 3.x版本 UPD客户端 2.x版本 3.x版本 二.TCP服务端搭建 搭建过程整理 2.x版本 3.x版 ...

  3. C++后端开发程序员应该彻底搞懂的【libevent网络库】,libevent组件构成以及编程要领丨Linux服务器开发丨服务端编程

    90分钟搞懂libevent网络库 1. 服务端事件组成 2. libevent组件构成以及编程概要 3. memcached是如何使用libevent 视频讲解如下,点击观看: C++后端开发程序员 ...

  4. 聚播微信群控云控引擎二次开发SDK服务端对接接口

    聚播微信群控云控引擎二次开发SDK服务端对接接口 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo);b ...

  5. 17 SSR:使用 React.js 开发 Serverless 服务端渲染应用

    今天我想和你聊一聊怎么用 Serverless 开发一个服务端渲染(SSR)应用. 对前端工程师来说,Serverless 最大的应用场景之一就是开发服务端渲染(SSR)应用.因为传统的服务端渲染应用 ...

  6. C++ 开发SOAP服务端和SOAP客户端

    C++ 开发SOAP服务端和SOAP客户端 作者:flyfish  2012-5-12 目的:利用gSOAP自带的Calc例子 仿写一个 网络中使用计算器 客户端通过http发送xml格式的数据请求, ...

  7. 使用KBEngine开发UE4服务端——开发详解

    使用KBEngine开发UE4服务端--开发详解 1. 简述 开始正式进入开发,网络上关于开发和修改文件的文章较少,这里会记录自己开发过程中需要更改的地方和一些流程. 2. 前期的配置说明 根据前文配 ...

  8. Python 主流棋牌游戏 服务端 框架分析 原创笔记

    经测试此产品运营稳定 包含数十款房卡子游戏.俱乐部(五级权限).比赛场 客户端采用Lua脚本开发 .后端Python 看过一些棋牌产品 很多产品基于此套棋牌框架开发而来 算市面上一个主流框架 但却没有 ...

  9. 【转】使用Apache CXF开发WebServices服务端

    原地址:http://cnjava.blog.51cto.com/1208887/335630 在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apach ...

  10. grpc(3):使用 golang 开发 grpc 服务端和client

    1,关于grpc-go golang 能够能够做grpc的服务端和client. 官网的文档: http://www.grpc.io/docs/quickstart/go.html https://g ...

最新文章

  1. web前端3.0时代,“程序猿”如何“渡劫升仙”?
  2. 数据结构(莫队算法):国家集训队2010 小Z的袜子
  3. 青龙羊毛——放羊娃(教程)
  4. centos下部署启动elasticsearch错误集合与解决方案
  5. laravel artisan
  6. 网工路由基础(1)静态路由
  7. layer.alert/confirm文字换行
  8. 797. 所有可能的路径
  9. 用Tomcat构建一个简单图片服务器
  10. android同步aar到jcenter,android上传aar到jcenter
  11. Socket通讯成功案例
  12. MYSQL-主键、外键
  13. matlab 给参数赋值,未对输出参数赋值 求大神帮忙解惑
  14. 安捷伦or是德信号源+频谱仪操作: 从程控到自动测试 (四)平坦度检测的程控实现
  15. Matlab数据标准化——mapstd、mapminmax
  16. 减少域名DNS解析时间将网页加载速度提升新层次
  17. “诗词吾爱”第38期擂台赛《伤春、惜春》获胜作品欣赏【转载】
  18. 【今日CV 计算机视觉论文速览 第118期】Tue, 21 May 2019
  19. 获得拼多多商品详情(商品主图、sku)
  20. 多表查询(连接查询)

热门文章

  1. 学位论文参考文献格式
  2. java代码实现注册发送邮件激活账户
  3. 自我成长与团队管理——一些总结
  4. 第二章、Zigbee模块参数(DRF1609H、DRF2657C)
  5. 【考研政治】马克思主义基本原理概论——导论篇
  6. 日文輸入法学习和日文键盘图
  7. 官网版本的windows pe系统启动盘制作过程
  8. 加拿大java技术移民_加拿大技术移民分析贴之新手入门级!
  9. V-by-one 与lvds
  10. java.sql.SQLException: Access denied for user ‘root‘@‘127.0.0.1‘ (using password: YES)