| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- -- 跨服鏈接和重连管理
- local msg_parse = _G.msg_inner_parse
- local Config = require("Config")
- local Log = require("common.Log")
- local CommonDB = require("common.CommonDB")
- local InnerMsg = require("core.InnerMsg")
- local MiddleManager = require("middle.MiddleManager")
- local MiddleHeartBeat = require("middle.MiddleHeartBeat")
- local Define = require("platform.Define")
- local Json = require("common.Json")
- local JjcLadderMiddle = require("jjcLadder.JjcLadderMiddle")
- IS_MIDDLE_CONNECT = IS_MIDDLE_CONNECT or nil -- 是否連上跨服 收到WLhello才認為連上了
- YY_ACT_FLAG = nil
- -- 请求middleInfo
- local s2aParam = {}
- local function questMiddleInfo()
- s2aParam.sid = Config.SVR_INDEX
- s2aParam.api_cbMethod = "setMiddleInfo"
- _G.thread_http.send(Define.MIDDLE_INFO_URL, Json.Encode(s2aParam))
- end
- function setMiddleInfo(ip, port, host)
- if _G.is_middle == true then return end
- local middleDBInfo = CommonDB.getMiddleInfo()
- if middleDBInfo.ip == ip and middleDBInfo.port == port and middleDBInfo.host == host then
- -- 沒變化
- return
- end
- local oldIp = middleDBInfo.ip
- local oldPort = middleDBInfo.port
- CommonDB.setMiddleInfo(ip, port, host)
- if oldIp == ip and oldPort == port then
- -- 只有host变了 不需要重連
- return
- else
- tryConnectMiddle(ip, port) -- try的時候會把之前的鏈接斷開
- end
- end
- function getMiddleInfo()
- --调试模式使用配置的IP
- if Config.IS_DEBUG then
- return Config.MIDDLE_IP, Config.MIDDLE_PORT, Config.MIDDLE_HOST
- end
- local middleDBInfo = CommonDB.getMiddleInfo()
- return middleDBInfo.ip, middleDBInfo.port, middleDBInfo.host
- end
- function initAfterStart()
- onTimer() -- 啟動拉取一下middleInfo
- end
- function onTimer()
- if _G.is_middle == true then return end
- -- 如果没有middleip 去找后台请求middleip 1分钟1次
- local ip, port = getMiddleInfo()
- if ip == nil then
- -- reyes todo get ip
- print("no middleInfo try to get")
- questMiddleInfo()
- return
- end
- -- 如果ip有了 但是一直没连上 1分钟重连1次
- if isConnect() ~= true then
- tryConnectMiddle(ip, port)
- return
- end
- -- 如果3分钟之内 没有收到middle的心跳包 并且底层还是连接中的状态 我们认为出故障了 这个时候重连一下middle 这是一个异常处理
- if MiddleHeartBeat.LAST_HEARTBEAT_TIME then
- local now = os.time()
- if now - MiddleHeartBeat.LAST_HEARTBEAT_TIME > 180 then
- stopConnectMiddle()
- end
- end
- end
- function autoResetMiddle()
- if _G.is_middle == true then return end
- -- 每周一凌晨2點 斷開鏈接 并且重新取一下php的跨服信息 重新連新跨服
- CommonDB.setMiddleInfo(nil, nil, nil)
- stopConnectMiddle()
- onTimer() -- 拉取一下middleInfo
- end
- function isConnect()
- -- 這個接口和IS_MIDDLE_CONNECT的區別是 這個表示底層鏈接連上了 但是不一定正確收到了middle會包 lua層業務判斷最好別用這個接口 盡量用IS_MIDDLE_CONNECT
- local ret = msg_parse.check_connect()
- if ret == true then
- return true
- end
- end
- function tryConnectMiddle(ip, port)
- print("try connect middle ", ip, port)
- Log.write(Log.LOGID_INNER_CLOSE, "tryConnectMiddle", ip, port)
- msg_parse.set_connect(ip, port)
- end
- function stopConnectMiddle()
- print("stop connect middle ")
- Log.write(Log.LOGID_INNER_CLOSE, "stopConnectMiddle")
- msg_parse.close_connect()
- IS_MIDDLE_CONNECT = nil
- MiddleHeartBeat.LAST_HEARTBEAT_TIME = nil
- MiddleHeartBeat.LAST_SEND_HB_TS = nil
- end
- function LW_HELLO(fd, msg)
- print("LW Hello")
- Log.write(Log.LOGID_INNER_CLOSE, "LW_HELLO")
- MiddleManager.addLogicServer(fd, msg.svrIndex)
- local msg = InnerMsg.wl.WL_HELLO
- InnerMsg.sendMsg(fd, msg)
- msg = InnerMsg.wl.WL_HEARTBEAT
- InnerMsg.sendMsg(fd, msg)
-
- -- 同步其它信息
- JjcLadderMiddle.sendWLMobaiCnt(fd)
- end
- function WL_HELLO(fd, msg)
- print("WL hello")
- Log.write(Log.LOGID_INNER_CLOSE, "WL_HELLO")
- if not IS_MIDDLE_CONNECT then
- print("middle server upup!!!---")
- IS_MIDDLE_CONNECT = true
- local openTime = CommonDB.getServerOpenTime()
- if openTime ~= 0 then
- local msg = InnerMsg.lw.LW_SET
- msg.openTime = openTime or 0
- msg.svrIndex = Config.SVR_INDEX
- InnerMsg.sendMsg(fd, msg)
- end
- end
- end
- function LW_SET(fd,msg)
- MiddleManager.setServerOpenDay(fd,msg.svrIndex,msg.openTime)
- end
- function LW_DISCONNECT(fd, msg)
- print("LW_DISCONNECT")
-
- MiddleManager.delLogicServer(fd)
- end
- --middle断线,C++层触发
- function WL_DISCONNECT(fd, msg)
- if IS_MIDDLE_CONNECT then
- IS_MIDDLE_CONNECT = nil
- MiddleHeartBeat.LAST_HEARTBEAT_TIME = nil
- MiddleHeartBeat.LAST_SEND_HB_TS = nil
- Log.write(Log.LOGID_INNER_CLOSE, "middle server disconnect!!!")
- print("middle server disconnect!!!---")
- end
- end
|