srvNodeMgr.lua 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. --[[
  2. Descripttion:节点管理
  3. version:
  4. Author: Neo,Huang
  5. Date: 2022-07-05 20:33:57
  6. LastEditors: Neo,Huang
  7. LastEditTime: 2022-07-05 20:35:03
  8. --]]
  9. local baseService = require("baseService")
  10. local nodeUtil = require("utils.nodeUtil")
  11. local root = {}
  12. -- 服务器心跳
  13. function root.node_heart_beat(nodeInfo)
  14. if is_empty(nodeInfo) or is_empty(nodeInfo.clusterName) or is_empty(nodeInfo.nodeName) then
  15. return false
  16. end
  17. if root.mapCluster == nil then
  18. root.mapCluster = {}
  19. end
  20. if root.mapCluster[nodeInfo.clusterName] == nil then
  21. root.mapCluster[nodeInfo.clusterName] = {}
  22. end
  23. nodeInfo.updateTime = skynet_time()
  24. root.mapCluster[nodeInfo.clusterName][nodeInfo.nodeName] = nodeInfo
  25. -- 更新权重
  26. if root.mapClusterWeight == nil then
  27. root.mapClusterWeight = {}
  28. end
  29. local weightInfo = {}
  30. weightInfo.total = 0
  31. weightInfo.list = {}
  32. for k, v in pairs(root.mapCluster[nodeInfo.clusterName]) do
  33. local info = {}
  34. info.nodeName = v.nodeName
  35. info.min = weightInfo.total + 1
  36. weightInfo.total = weightInfo.total + (v.weight or 0)
  37. info.max = weightInfo.total
  38. if info.max > info.min then
  39. table.insert(weightInfo.list, info)
  40. end
  41. end
  42. root.mapClusterWeight[nodeInfo.clusterName] = weightInfo
  43. return true
  44. end
  45. -- 获取所有服务器节点
  46. function root.get_node_info_list()
  47. if root.mapCluster == nil then
  48. return
  49. end
  50. local nodeInfoList = nil
  51. for k, v in pairs(root.mapCluster) do
  52. for _k, _v in pairs(v) do
  53. if nodeInfoList == nil then
  54. nodeInfoList = {}
  55. end
  56. table.insert(nodeInfoList, _v)
  57. end
  58. end
  59. return nodeInfoList
  60. end
  61. -- 根据集群类型获取节点
  62. function root.user_dispatch_cluster_node(uid, clusterName)
  63. if is_empty(clusterName) then
  64. return
  65. end
  66. if root.mapCluster == nil or root.mapCluster[clusterName] == nil then
  67. return
  68. end
  69. -- 已分配
  70. if root.mapUid2NodeInfo and root.mapUid2NodeInfo[uid] and root.mapUid2NodeInfo[uid][clusterName] then
  71. local nodeName = root.mapUid2NodeInfo[uid][clusterName]
  72. if root.mapCluster[clusterName] and root.mapCluster[clusterName][nodeName] then
  73. return root.mapCluster[clusterName][nodeName]
  74. end
  75. end
  76. local rand = math.random(root.mapClusterWeight[clusterName].total)
  77. for k, v in ipairs(root.mapClusterWeight[clusterName].list) do
  78. if v.min < rand and rand <= v.max then
  79. if root.mapCluster[clusterName] and root.mapCluster[clusterName][v.nodeName] then
  80. return root.mapCluster[clusterName][v.nodeName]
  81. end
  82. break
  83. end
  84. end
  85. end
  86. -- 获取集群节点列表
  87. function root.get_type_node_list(clusterName)
  88. return root.mapCluster[clusterName]
  89. end
  90. -- 热更新 - 配置
  91. function root.update_node_config()
  92. for k, v in pairs(root.mapCluster) do
  93. for _k, _v in pairs(v) do
  94. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_config")
  95. end
  96. end
  97. return true
  98. end
  99. -- 热更新 - 逻辑
  100. function root.update_node_logic()
  101. for k, v in pairs(root.mapCluster) do
  102. for _k, _v in pairs(v) do
  103. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_logic")
  104. end
  105. end
  106. return true
  107. end
  108. -- 热更新 - 协议
  109. function root.update_node_proto()
  110. for k, v in pairs(root.mapCluster) do
  111. for _k, _v in pairs(v) do
  112. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_proto")
  113. end
  114. end
  115. return true
  116. end
  117. -- 热更新 - 节点
  118. function root.update_node()
  119. for k, v in pairs(root.mapCluster) do
  120. for _k, _v in pairs(v) do
  121. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_config")
  122. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_logic")
  123. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_proto")
  124. end
  125. end
  126. return true
  127. end
  128. -- 玩家绑定节点
  129. function root.user_band_node(uid, clusterName, nodeName)
  130. if root.mapUid2NodeInfo == nil then
  131. root.mapUid2NodeInfo = {}
  132. end
  133. root.mapUid2NodeInfo[uid] = {}
  134. root.mapUid2NodeInfo[uid][clusterName] = nodeName
  135. -- 在线人数
  136. if root.totalPlayers == nil then
  137. root.totalPlayers = 0
  138. end
  139. root.totalPlayers = root.totalPlayers + 1
  140. end
  141. -- 玩家解绑节点
  142. function root.user_unband_node(uid, clusterName)
  143. if root.mapUid2NodeInfo == nil then
  144. root.mapUid2NodeInfo = {}
  145. end
  146. root.mapUid2NodeInfo[uid][clusterName] = nil
  147. -- 在线人数
  148. if root.totalPlayers == nil then
  149. root.totalPlayers = 0
  150. end
  151. root.totalPlayers = math.max(0, root.totalPlayers - 1)
  152. end
  153. function root.onStart()
  154. -- 初始化随机种子
  155. math.randomseed(tostring(skynet_time()):reverse():sub(1, 6))
  156. end
  157. baseService.start(root, ".srvNodeMgr", true)