예제 #1
0
파일: protocol.py 프로젝트: zhaozw/hall37
    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)
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
파일: wrapper.py 프로젝트: zhaozw/hall37
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)
예제 #5
0
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)
예제 #6
0
파일: wrapper.py 프로젝트: zhaozw/hall37
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)
예제 #7
0
파일: wrapper.py 프로젝트: zhaozw/hall37
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)
예제 #8
0
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)
예제 #9
0
파일: http.py 프로젝트: zhaozw/hall37
 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)
예제 #10
0
파일: http.py 프로젝트: zhaozw/hall37
 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)
예제 #11
0
파일: wrapper.py 프로젝트: zhaozw/hall37
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)
예제 #12
0
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)
예제 #13
0
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)
예제 #14
0
    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)
예제 #15
0
파일: service.py 프로젝트: zhaozw/hall37
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)
예제 #16
0
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)
예제 #17
0
파일: protocol.py 프로젝트: zhaozw/hall37
    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)
예제 #18
0
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()
예제 #19
0
파일: startup.py 프로젝트: zhaozw/hall37
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()