def onMsg(self): pack = stackless.getcurrent()._fttask.pack ftlog.debug('A2SProtocol->[' + pack + ']') src, dst, queryid, userheader1, userheader2, message = agentmsg.unpack(pack) if src == None or dst == None: ftlog.info("ERROR, recive a error format message") return if self.peer_id == 0: self.peer_id = src ftcon.serverid_protocol_map[self.peer_id] = self ftlog.info("Receive service register, serverid=", self.peer_id, self) return # 处理agent服务自身的命令 if dst == ftcon.global_config["server_id"] and A2SProtocol.onCommand != None: # ftlog.debug('A2SProtocol-> it self command !!') A2SProtocol.onCommand(self, src, queryid, userheader1, userheader2, message) return if dst.find('AG') == 0: # 如果是直接发送给另外的一个AGENT, 那器agent就是其本身 agent_id = dst else: server_conf = ftcon.getServerConf(dst) agent_id = server_conf['agent'] try: # 从src发过来的数据,转给dst所在的agent # 如果是agent所属内部进程过来的数据, 直接转发至dst进程 if agent_id == ftcon.global_config["server_id"]: agent_id = dst # ftlog.debug('A2SProtocol->send to agentid->', agent_id, 'dst=', dst) protocol = ftcon.serverid_protocol_map[agent_id] protocol.transport.write(pack + '\r\n') except: ftlog.error('msg route error, not found agent protocol, dst_server_id=', dst, 'agend=', agent_id)
def query(dst, data, userheader1='', userheader2='', timeout=2, notimeoutex=0, returnDeffer=0): src = ftcon.global_config["server_id"] server_conf = ftcon.getServerConf(src) agent_id = server_conf['agent'] protocol = ftcon.serverid_protocol_map[agent_id] if ide_debug(): ide_print_pack("Query[%s]" % dst.split("-")[0], json.loads(data)) d = protocol.query(src, dst, userheader1, userheader2, data, timeout, notimeoutex=notimeoutex) if returnDeffer == 1: return d res = stackless.getcurrent()._fttask.waitDefer(d) global _QUERY_SLOW_TIME if isinstance(res, tuple): msg = res[0] query_write_time = res[1] query_recive_time = res[2] ct = time() if ct - query_write_time > _QUERY_SLOW_TIME: if performance.PERFORMANCE_NET: msg = performance.linkMsgTime('DO', msg) ftlog.warn('QUERY REPLAY SLOW ! reply=%0.6f' % (query_recive_time - query_write_time), 'schedule=%0.6f' % (ct - query_recive_time), 'total=%0.6f' % (ct - query_write_time), 'dst=', dst, 'request=', data, 'response=', msg) return msg return res
def query(dst, data, userheader1='', userheader2='', timeout=2): src = ftcon.global_config["server_id"] server_conf = ftcon.getServerConf(src) agent_id = server_conf['agent'] protocol = ftcon.serverid_protocol_map[agent_id] d = protocol.query(src, dst, userheader1, userheader2, data, timeout) return stackless.getcurrent()._fttask.waitDefer(d)
def send(dst, data, userheader1='', userheader2=''): src = ftcon.global_config["server_id"] server_conf = ftcon.getServerConf(src) agent_id = server_conf['agent'] message = agentmsg.packstr(src, dst, '', userheader1, userheader2, data) protocol = ftcon.serverid_protocol_map[agent_id] ftlog.debug('transport.write', message) protocol.transport.write(message)
def _response(dst, data, queryid, userheader1, userheader2): src = ftcon.global_config["server_id"] server_conf = ftcon.getServerConf(src) if 'agent' in server_conf: agent_id = server_conf['agent'] else: agent_id = dst if dst in ftcon.serverid_protocol_map: agent_id = dst else: server_conf = ftcon.getServerConf(dst) if 'agent' in server_conf: agent_id = server_conf['agent'] message = agentmsg.packstr(src, dst, queryid, userheader1, userheader2, data) ftlog.debug('transport.write', message) protocol = ftcon.serverid_protocol_map[agent_id] protocol.transport.write(message)
def send(dst, data, userheader1='', userheader2=''): src = ftcon.global_config["server_id"] server_conf = ftcon.getServerConf(src) agent_id = server_conf['agent'] if ide_debug(): ide_print_pack("Send_[%s]" % dst.split("-")[0], json.loads(data)) message = agentmsg.packstr(src, dst, '', userheader1, userheader2, data) protocol = ftcon.serverid_protocol_map[agent_id] ftlog.debug('transport.write', message) protocol.transport.write(message)
def sendToWriter(self, _type, _group, logid, body): sid = ftcon.global_config["server_id"] svrconf = ftcon.getServerConf(sid) try: writer = svrconf["writer"] except: ftlog.error("writer not config!", svrconf) return header = "%s_%s_%s" % (str(_type), str(_group), str(logid)) for w in writer: ftagent.send(str(w), base64.b64encode(body), header)
def connect_agent(server_id, proto_func): """ Service进程调用,连接配置的Agent """ _c = proto_func("s2a") if _c == None: ftlog.error("s2a protocol must be implemented!!!") ftlog.error("read demo/protocol/__init__.py") sys.exit(0) server_conf = ftcon.getServerConf(server_id) agent_id = server_conf['agent'] agent_conf = ftcon.getServerConf(agent_id) ip = agent_conf['ip'] inner_port = agent_conf['protocols']['server']['a2s'] # outer_port = agent_conf['protocols']['server']['a2a'] factory = FTReconnectFactory() factory.protocol = _c reactor.connectTCP(ip, inner_port, factory) ftlog.info("Service connect to agent", server_id, agent_id)
def _response(dst, data, queryid, userheader1, userheader2): src = ftcon.global_config["server_id"] server_conf = ftcon.getServerConf(src) if 'agent' in server_conf: agent_id = server_conf['agent'] else: agent_id = dst if dst in ftcon.serverid_protocol_map: agent_id = dst else: server_conf = ftcon.getServerConf(dst) if 'agent' in server_conf: agent_id = server_conf['agent'] message = agentmsg.packstr(src, dst, queryid, userheader1, userheader2, data) protocol = ftcon.serverid_protocol_map[agent_id] if performance.PERFORMANCE_NET: message = performance.linkMsgTime('LW', message) ftlog.debug('transport.write', message) if ide_debug(): ide_print_pack("Resp [%5s]" % dst.split("-")[0], data) protocol.transport.write(message)
def onMsg(self): pack = stackless.getcurrent()._fttask.pack ftlog.debug('A2SProtocol->', FTTasklet.concurrent_task_count, '[', pack, ']') src, dst, queryid, userheader1, userheader2, message = agentmsg.unpack( pack) #zxdebug:测试query时,AG直接返回的性能 #self.transport.write("GA01|CO01|"+queryid+"|||"+message+"\r\n") #return #zxdebug if src == None or dst == None: ftlog.info("ERROR, recive a error format message") return if self.peer_id == 0: self.peer_id = src ftcon.serverid_protocol_map[self.peer_id] = self ftlog.info("Receive service register, serverid=", self.peer_id, self) return # 处理agent服务自身的命令 if dst == ftcon.global_config[ "server_id"] and A2SProtocol.onCommand != None: # ftlog.debug('A2SProtocol-> it self command !!') A2SProtocol.onCommand(self, src, queryid, userheader1, userheader2, message) return if dst.find('AG') == 0: # 如果是直接发送给另外的一个AGENT, 那器agent就是其本身 agent_id = dst else: server_conf = ftcon.getServerConf(dst) agent_id = server_conf['agent'] try: # 从src发过来的数据,转给dst所在的agent # 如果是agent所属内部进程过来的数据, 直接转发至dst进程 if agent_id == ftcon.global_config["server_id"]: agent_id = dst # ftlog.debug('A2SProtocol->send to agentid->', agent_id, 'dst=', dst) protocol = ftcon.serverid_protocol_map[agent_id] if performance.PERFORMANCE_NET: pack = performance.linkMsgTime('LW', pack) protocol.transport.write(pack + '\r\n') except: ftlog.error( 'msg route error, not found agent protocol, dst_server_id=', dst, 'agend=', agent_id)
def _initProtocol(sid, proto_func): svrconf = ftcon.getServerConf(sid) if not svrconf: ftlog.error("server(%s) config not found,bye" % sid) import sys sys.exit(0) protos = svrconf.get("protocols", None) if sid.startswith("AG"): # listen and connect other agent ftagent.connect_agent_eachother(sid) else: if protos: ftcon.protoParser(protos, proto_func, "server") ftcon.protoParser(protos, proto_func, "client") # connect agent if "agent" in svrconf: ftagent.connect_agent(sid, proto_func)
def onMsg(self): pack = stackless.getcurrent()._fttask.pack ftlog.debug('A2SProtocol->', FTTasklet.concurrent_task_count, '[', pack, ']') src, dst, queryid, userheader1, userheader2, message = agentmsg.unpack(pack) # zxdebug:测试query时,AG直接返回的性能 # self.transport.write("GA01|CO01|"+queryid+"|||"+message+"\r\n") # return # zxdebug if src == None or dst == None: ftlog.info("ERROR, recive a error format message") return if self.peer_id == 0: self.peer_id = src ftcon.serverid_protocol_map[self.peer_id] = self ftlog.info("Receive service register, serverid=", self.peer_id, self) return # 处理agent服务自身的命令 if dst == ftcon.global_config["server_id"] and A2SProtocol.onCommand != None: # ftlog.debug('A2SProtocol-> it self command !!') A2SProtocol.onCommand(self, src, queryid, userheader1, userheader2, message) return if dst.find('AG') == 0: # 如果是直接发送给另外的一个AGENT, 那器agent就是其本身 agent_id = dst else: server_conf = ftcon.getServerConf(dst) agent_id = server_conf['agent'] try: # 从src发过来的数据,转给dst所在的agent # 如果是agent所属内部进程过来的数据, 直接转发至dst进程 if agent_id == ftcon.global_config["server_id"]: agent_id = dst # ftlog.debug('A2SProtocol->send to agentid->', agent_id, 'dst=', dst) protocol = ftcon.serverid_protocol_map[agent_id] if performance.PERFORMANCE_NET: pack = performance.linkMsgTime('LW', pack) protocol.transport.write(pack + '\r\n') except: ftlog.error('msg route error, not found agent protocol, dst_server_id=', dst, 'agend=', agent_id)
def initialize(): ''' 扑克大厅系统的初始化入口 当所有的REDIS和MYSQL链接建立完成后调用此方法 ''' try: if _DEBUG: debug('==== poker.initialize begin ====') sconf = ftcon.getServerConf(ftsvr.getId()) taskc = sconf.get('task-concurrent', 0) if taskc > 0: FTTasklet.MAX_CONCURRENT = taskc if _DEBUG: debug('reset FTTasklet.MAX_CONCURRENT=', FTTasklet.MAX_CONCURRENT) from poker.entity.dao import daobase daobase._REDIS_CMD_PPS_ = 1 configure._CONFIG_CMD_PPS_ = 1 protocol._COUNT_PPS = 1 performance.regPPSCounter(protocol.ppsCountProtocolPack) performance.regPPSCounter(configure.ppsCountConfigCmds) performance.regPPSCounter(daobase.ppsCountRedisCmd) performance.regPPSCounter(performance.threadInfo) # 初始化基本全局配置数据 updateStatus(10) gdatas = gdata._initialize() from poker.entity.biz import bireport bireport.report('bireport', 'open') # 初始化DAO updateStatus(20) daobase._initialize() # 初始化旧命令对照表 updateStatus(30) from poker.protocol import oldcmd oldcmd._initialize() # 装载游戏的PLUGIN updateStatus(40) tygamelist = _loadTYGames(gdatas) # 加载各游戏插件44捕鱼、9999大厅 # 初始化命令路由 updateStatus(50) from poker.protocol import router router._initialize() if gdata.serverType( ) == gdata.SRV_TYPE_UTIL: # 服务类型: 游戏的无状态消息处理服务(例如: 取得插件列表) router._initialize_udp() # 初始化房间配置 updateStatus(60) _loadRoomDefines(gdatas) # 各个游戏PLUGIN的命令入口初始化 updateStatus(70) from poker.protocol import handler handler._initializeCommands(gdatas) if gdata.serverType() not in (gdata.SRV_TYPE_AGENT, gdata.SRV_TYPE_CONN): # 所有游戏PLUGIN进行初始化 updateStatus(80) for tygame in tygamelist: if _DEBUG: debug('call init function: ', tygame.gameId(), 'tygame.initGameBefore()') tygame.initGameBefore() # 各游戏实例的前处理脚本 # 所有游戏PLUGIN进行初始化 updateStatus(90) for tygame in tygamelist: if _DEBUG: debug('call init function: ', tygame.gameId(), 'tygame.initGame()') tygame.initGame() # 房间实例初始化 updateStatus(100) _initializeRooms(gdatas) # 初始化房间 # 桌子示例初始化 updateStatus(110) _initializeTables(gdatas) # 所有游戏PLUGIN进行初始化 updateStatus(120) for tygame in tygamelist: if _DEBUG: debug('call init function: ', tygame.gameId(), 'tygame.initGameAfter()') tygame.initGameAfter() # 各游戏实例的后处理脚本 # 大厅全局命令入口初始化 updateStatus(130) _initializePoker(gdatas) # 设置初始化完成标记 updateStatus(200) gdatas['initialize.ok'] = 1 if _DEBUG: debug('==== poker.initialize done ====') # 启动服务系统心跳处理事件 FTTimer(1, _doServertHeartBeat) except: updateStatus(500) ftlog.error('poker.initialize ERROR') ftsvr.terminate()
def initialize(): """ 扑克大厅系统的初始化入口 当所有的REDIS和MYSQL链接建立完成后调用此方法 """ try: if _DEBUG: debug('==== poker.initialize begin ====') sconf = ftcon.getServerConf(ftsvr.getId()) taskc = sconf.get('task-concurrent', 0) if taskc > 0: FTTasklet.MAX_CONCURRENT = taskc if _DEBUG: debug('reset FTTasklet.MAX_CONCURRENT=', FTTasklet.MAX_CONCURRENT) from poker.entity.dao import daobase daobase._REDIS_CMD_PPS_ = 1 configure._CONFIG_CMD_PPS_ = 1 protocol._COUNT_PPS = 1 performance.regPPSCounter(protocol.ppsCountProtocolPack) performance.regPPSCounter(configure.ppsCountConfigCmds) performance.regPPSCounter(daobase.ppsCountRedisCmd) performance.regPPSCounter(performance.threadInfo) # 初始化基本全局配置数据 updateStatus(10) gdatas = gdata._initialize() from poker.entity.biz import bireport bireport.report('bireport', 'open') # 初始化DAO updateStatus(20) daobase._initialize() # 初始化旧命令对照表 updateStatus(30) from poker.protocol import oldcmd oldcmd._initialize() # 装载游戏的PLUGIN updateStatus(40) tygamelist = __loadTYGames(gdatas) # 初始化命令路由 updateStatus(50) from poker.protocol import router router._initialize() if gdata.serverType() == gdata.SRV_TYPE_UTIL: router._initialize_udp() # 初始化房间配置 updateStatus(60) __loadRoomDefines(gdatas) # 各个游戏PLUGIN的命令入口初始化 updateStatus(70) from poker.protocol import handler handler._initializeCommands(gdatas) from poker.protocol import rpccore rpccore._initializeRpcMehodss(gdatas) if gdata.serverType() not in (gdata.SRV_TYPE_AGENT, gdata.SRV_TYPE_CONN): # 所有游戏PLUGIN进行初始化 updateStatus(80) for tygame in tygamelist: if _DEBUG: debug('call init function : ', tygame.gameId(), 'tygame.initGameBefore()') tygame.initGameBefore() # 所有游戏PLUGIN进行初始化 updateStatus(90) for tygame in tygamelist: if _DEBUG: debug('call init function : ', tygame.gameId(), 'tygame.initGame()') tygame.initGame() # 房间实例初始化 updateStatus(100) __initializeRooms(gdatas) # 桌子示例初始化 updateStatus(110) __initializeTables(gdatas) # 所有游戏PLUGIN进行初始化 updateStatus(120) for tygame in tygamelist: if _DEBUG: debug('call init function : ', tygame.gameId(), 'tygame.initGameAfter()') tygame.initGameAfter() # 大厅全局命令入口初始化 updateStatus(130) __initializePoker(gdatas) # 设置初始化完成标记 updateStatus(200) gdatas['initialize.ok'] = 1 if _DEBUG: debug('==== poker.initialize done ====') ide_print("==== poker.initialize done ====") # 启动服务系统心跳处理事件 FTTimer(1, __doServertHeartBeat) except: updateStatus(500) ftlog.error('poker.initialize ERROR') ftsvr.terminate()