srvNodeMgr.lua 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 then
  67. return
  68. end
  69. if root.mapCluster[clusterName] == nil then
  70. return
  71. end
  72. -- 已分配
  73. if root.mapUid2NodeInfo and root.mapUid2NodeInfo[uid] and root.mapUid2NodeInfo[uid][clusterName] then
  74. local nodeName = root.mapUid2NodeInfo[uid][clusterName]
  75. if root.mapCluster[clusterName] and root.mapCluster[clusterName][nodeName] then
  76. return root.mapCluster[clusterName][nodeName]
  77. end
  78. end
  79. local rand = math.random(root.mapClusterWeight[clusterName].total)
  80. for k, v in ipairs(root.mapClusterWeight[clusterName].list) do
  81. if v.min < rand and rand <= v.max then
  82. if root.mapCluster[clusterName] and root.mapCluster[clusterName][v.nodeName] then
  83. return root.mapCluster[clusterName][v.nodeName]
  84. end
  85. break
  86. end
  87. end
  88. end
  89. -- 获取集群节点列表
  90. function root.get_type_node_list(clusterName)
  91. return root.mapCluster[clusterName]
  92. end
  93. -- 热更新 - 配置
  94. function root.update_node_config()
  95. for k, v in pairs(root.mapCluster) do
  96. for _k, _v in pairs(v) do
  97. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_config")
  98. end
  99. end
  100. return true
  101. end
  102. -- 热更新 - 逻辑
  103. function root.update_node_logic()
  104. for k, v in pairs(root.mapCluster) do
  105. for _k, _v in pairs(v) do
  106. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_logic")
  107. end
  108. end
  109. return true
  110. end
  111. -- 热更新 - 协议
  112. function root.update_node_proto()
  113. for k, v in pairs(root.mapCluster) do
  114. for _k, _v in pairs(v) do
  115. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_proto")
  116. end
  117. end
  118. return true
  119. end
  120. -- 热更新 - 节点
  121. function root.update_node()
  122. for k, v in pairs(root.mapCluster) do
  123. for _k, _v in pairs(v) do
  124. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_config")
  125. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_logic")
  126. nodeUtil:send_to_node(_v.nodeName, ".steward", "update_proto")
  127. end
  128. end
  129. return true
  130. end
  131. -- 玩家绑定节点
  132. function root.user_band_node(uid, clusterName, nodeName)
  133. if root.mapUid2NodeInfo == nil then
  134. root.mapUid2NodeInfo = {}
  135. end
  136. root.mapUid2NodeInfo[uid] = {}
  137. root.mapUid2NodeInfo[uid][clusterName] = nodeName
  138. -- 在线人数
  139. if root.totalPlayers == nil then
  140. root.totalPlayers = 0
  141. end
  142. root.totalPlayers = root.totalPlayers + 1
  143. end
  144. -- 玩家解绑节点
  145. function root.user_unband_node(uid, clusterName)
  146. if root.mapUid2NodeInfo == nil then
  147. root.mapUid2NodeInfo = {}
  148. end
  149. root.mapUid2NodeInfo[uid][clusterName] = nil
  150. -- 在线人数
  151. if root.totalPlayers == nil then
  152. root.totalPlayers = 0
  153. end
  154. root.totalPlayers = math.max(0, root.totalPlayers - 1)
  155. end
  156. function root.onStart()
  157. -- 初始化随机种子
  158. math.randomseed(tostring(skynet_time()):reverse():sub(1, 6))
  159. end
  160. baseService.start(root, ".srvNodeMgr", true)