agentPool.lua 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. -- agent池
  2. local skynet = require "skynet"
  3. local root = class("agentPool")
  4. function root:ctor(agentService, count)
  5. self.objs = {}
  6. self.init = count or 4 -- 自增服务数量
  7. self.agentService = agentService
  8. -- 生成agent
  9. self:new_agent_services(self.init)
  10. end
  11. -- 创建agent服务
  12. function root:new_agent_service(agentCount)
  13. local addr = skynet.newservice(self.agentService)
  14. return {addr = addr, max = agentCount or 50, used = 0}
  15. end
  16. -- 创建一批agent服务
  17. function root:new_agent_services(count)
  18. local list = {}
  19. for i = 1, count do
  20. local agentInfo = self:new_agent_service()
  21. table.insert(self.objs, agentInfo)
  22. table.insert(list, agentInfo)
  23. end
  24. return list
  25. end
  26. -- 获取可用agent服务列表
  27. function root:get_agent_srv_list()
  28. -- 没有现成可用的,创建新的
  29. local list = {}
  30. for _, v in ipairs(self.objs) do
  31. if v.used < v.max then
  32. table.insert(list, v)
  33. end
  34. end
  35. if is_empty(list) then
  36. -- agent服务不够
  37. list = self:new_agent_services(self.init)
  38. end
  39. return list
  40. end
  41. -- 获取agent地址列表
  42. function root:get_agent_srv_addr_list()
  43. local list = {}
  44. for k, v in pairs(self.objs) do
  45. table.insert(list, v.addr)
  46. end
  47. return list
  48. end
  49. -- 获取agent服务信息
  50. function root:get_agent_info_by_addr(addr)
  51. for k, v in pairs(self.objs) do
  52. if addr == v.addr then
  53. return v
  54. end
  55. end
  56. end
  57. -- 分配
  58. function root:alloc_agent_srv()
  59. local list = self:get_agent_srv_list()
  60. local id = math.random(1, #list)
  61. local obj = list[id]
  62. return obj.addr
  63. end
  64. -- 绑定
  65. function root:bind_agent(id, addr)
  66. local agentInfo = self:get_agent_info_by_addr(addr)
  67. if is_empty(agentInfo) then
  68. return false
  69. end
  70. agentInfo.used = agentInfo.used + 1
  71. agentInfo.bindTime = skynet_time()
  72. return true
  73. end
  74. -- 解绑
  75. function root:unbind_agent(id, addr)
  76. local agentInfo = self:get_agent_info_by_addr(addr)
  77. if is_empty(agentInfo) then
  78. return false
  79. end
  80. agentInfo.used = math.max(agentInfo.used - 1, 0)
  81. agentInfo.unbindTime = skynet_time()
  82. -- 回收不活跃agent服务
  83. self:recycle_agent_service()
  84. return true
  85. end
  86. -- 一次最多回收10个agent
  87. function root:recycle_agent_service()
  88. if #self.objs <= 5 then
  89. return
  90. end
  91. local list = {}
  92. local nowTime = skynet_time()
  93. for index, v in ipairs(self.objs) do
  94. -- 超过一小时未被使用
  95. if v.used <= 0 and v.bindTime and v.unbindTime and v.unbindTime >= v.bindTime and nowTime - v.unbindTime >= 3600 then
  96. table.insert(list, index)
  97. end
  98. end
  99. if #self.objs <= 0 then
  100. return
  101. end
  102. for i = 10, 1, -1 do
  103. local index = list[i]
  104. if index then
  105. local addr = self.objs[index].addr
  106. table.remove(self.objs, index)
  107. skynet.send(addr, "lua", "recycle")
  108. end
  109. end
  110. end
  111. -- 移除agent服务
  112. function root:remove_agent_service(addr)
  113. for k, v in pairs(self.objs) do
  114. if v.addr == addr then
  115. table.remove(self.objs, k)
  116. return true
  117. end
  118. end
  119. return false
  120. end
  121. -- 当前活跃agent服务数
  122. function root:get_agent_service_count()
  123. return #self.objs
  124. end
  125. return root