Blame view

robot/start.lua 3.11 KB
4dc77717   zhouhaihai   压测
1
2
3
  require("utils.StringUtil")
  require("utils.TableUtil")
  require "utils.MathUtil"
66e696ae   zhouhaihai   Revert "修改 robot"
4
  local config = require "robot_config"
4dc77717   zhouhaihai   压测
5
6
7
  local skynet = require "skynet"
  local netpack = require "skynet.netpack"
  local socketdriver = require "skynet.socketdriver"
cbfd0513   zhouhaihai   增加池子
8
  local deque = require "deque"
4dc77717   zhouhaihai   压测
9
10
  local string_format = string.format
  
cbfd0513   zhouhaihai   增加池子
11
12
  local poold, pooldObj, onlineCount, startId, endId, inpre
  local factory
3a646dea   zhouhaihai   拆分网关
13
  
4dc77717   zhouhaihai   压测
14
15
16
17
  local queue = {}
  local fd2serv = {}
  local id2fd = {}
  local MSG = {}
cbfd0513   zhouhaihai   增加池子
18
  local id_max 
4dc77717   zhouhaihai   压测
19
20
21
  
  
  function MSG.open( ... )
a5fa0074   zhouhaihai   robot
22
  	log("open", ...)
4dc77717   zhouhaihai   压测
23
24
25
  end
  
  function MSG.close(fd)
7d31daa8   zhouhaihai   调整压测
26
27
  	if fd2serv[fd] and not fd2serv[fd].closing then
  		fd2serv[fd].closing = true
7d31daa8   zhouhaihai   调整压测
28
  		skynet.call(fd2serv[fd].agent, "lua", "exit")
cbfd0513   zhouhaihai   增加池子
29
  		pcall(skynet.send, poold, "lua", "feed")
4dc77717   zhouhaihai   压测
30
  
cbfd0513   zhouhaihai   增加池子
31
  		log(string_format("logout %s", fd2serv[fd].id))
4dc77717   zhouhaihai   压测
32
33
34
35
36
37
  		id2fd[fd2serv[fd].id] = nil
  		fd2serv[fd] = nil
  	end
  end
  
  function MSG.error(fd, msg)
a5fa0074   zhouhaihai   robot
38
  	log("MSG.error", fd, msg)
4dc77717   zhouhaihai   压测
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  	MSG.close(fd)
  end
  
  function MSG.data(fd, msg, sz)
  	if fd2serv[fd] then
  		skynet.redirect(fd2serv[fd].agent, 0, "client", 0, msg, sz)
  	end
  end
  
  local function dispatch_queue()
  	local fd, msg, sz = netpack.pop(queue)
  	if fd then
  		skynet.fork(dispatch_queue)
  		MSG.data(fd, msg, sz)
  		for fd, msg, sz in netpack.pop, queue do
  			MSG.data(fd, msg, sz)
  		end
  	end
  end
  MSG.more = dispatch_queue
  
  skynet.register_protocol {
  	name = "socket",
  	id = skynet.PTYPE_SOCKET,
  	unpack = function (msg, sz)
  		return netpack.filter(queue, msg, sz)
  	end,
  	dispatch = function (_, _, q, type, ...)
  		queue = q
  		if type then
  			MSG[type](...)
  		end
  	end
  }
  
  skynet.register_protocol {
  	name = "client",
  	id = skynet.PTYPE_CLIENT,
  }
  
  local function add_robot()
cbfd0513   zhouhaihai   增加池子
80
81
  	local time = skynet.time()
  	local robot = factory:pop()
4dc77717   zhouhaihai   压测
82
83
84
  	local fd = socketdriver.connect(config.host, config.port)
  	socketdriver.start(fd)
  	local id
3a646dea   zhouhaihai   拆分网关
85
  	if id_max >= endId then
4dc77717   zhouhaihai   压测
86
  		while true do
3a646dea   zhouhaihai   拆分网关
87
  			id = math.randomInt(startId, endId)
4dc77717   zhouhaihai   压测
88
89
90
91
92
93
94
95
96
97
  			if not id2fd[id] then
  				break
  			end
  		end
  	else
  		id_max = id_max + 1
  		id = id_max
  	end
  	fd2serv[fd] = {agent = robot, id = id}
  	id2fd[id] = fd
3a646dea   zhouhaihai   拆分网关
98
  	pcall(skynet.call, robot, "lua", "start", fd, id, prefix)
4dc77717   zhouhaihai   压测
99
  	log(string_format("login %s", fd2serv[fd].id))
4dc77717   zhouhaihai   压测
100
101
  	-- 定时下线
  	skynet.timeout(math.randomInt(config.online_time[1], config.online_time[2]) * 100, function()
4dc77717   zhouhaihai   压测
102
  		MSG.close(fd)
7d31daa8   zhouhaihai   调整压测
103
  		socketdriver.close(fd)
4dc77717   zhouhaihai   压测
104
105
106
107
108
109
110
111
112
113
  	end)
  end
  
  local function online()
  	local curCount = 0
  	for _, _ in pairs(fd2serv) do
  		curCount = curCount + 1
  	end
  
  	-- 及时补充人数
3a646dea   zhouhaihai   拆分网关
114
115
  	if curCount < onlineCount then
  		for i = curCount + 1, onlineCount do
4dc77717   zhouhaihai   压测
116
117
118
119
120
121
122
123
  			add_robot()
  		end
  	end
  
  	-- log(string_format("online  %s", curCount))
  	skynet.timeout(100, online)
  end
  
cbfd0513   zhouhaihai   增加池子
124
  local function start(pooldp, pooldObj, onlineCountp, startIdp, endIdp, inprep)
4dc77717   zhouhaihai   压测
125
  	log("start testing ...")
66e696ae   zhouhaihai   Revert "修改 robot"
126
  
cbfd0513   zhouhaihai   增加池子
127
128
129
130
  	factory = deque.clone(pooldObj)
  	poold, onlineCount, startId, endId, inpre = pooldp, onlineCountp, startIdp, endIdp, inprep
  	id_max = startId - 1
  
3a646dea   zhouhaihai   拆分网关
131
132
  	for i = 1, onlineCount, inpre do
  		for j = 1, inpre do
d9c023b8   zhouhaihai   压测
133
134
135
  			if i + j - 1 > onlineCount then
  				break
  			end
4dc77717   zhouhaihai   压测
136
137
138
139
140
141
142
143
144
145
  			add_robot()
  		end
  		skynet.sleep(100)
  	end
  
  	-- 每秒检查补充在线人数
  	online()
  end
  
  skynet.start(function()
cbfd0513   zhouhaihai   增加池子
146
147
148
149
150
151
  	skynet.dispatch("lua", function (_, _, command, ...)
  		if command == "start" then
  			start(...)
  			return
  		end
  	end)
4dc77717   zhouhaihai   压测
152
  end)