Blame view

robot/start.lua 2.64 KB
4dc77717   zhouhaihai   压测
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  require("utils.StringUtil")
  require("utils.TableUtil")
  require "utils.MathUtil"
  local config = require "robot_config"
  local skynet = require "skynet"
  local netpack = require "skynet.netpack"
  local socketdriver = require "skynet.socketdriver"
  local string_format = string.format
  
  local queue = {}
  local fd2serv = {}
  local id2fd = {}
  local MSG = {}
  local id_max = 0 -- robot id
  
  
  function MSG.open( ... )
  	print("open", ...)
  end
  
  function MSG.close(fd)
7d31daa8   zhouhaihai   调整压测
22
23
24
  	if fd2serv[fd] and not fd2serv[fd].closing then
  		fd2serv[fd].closing = true
  		skynet.call(fd2serv[fd].agent, "lua", "exit")
4dc77717   zhouhaihai   压测
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  		log(string_format("logout %s", fd2serv[fd].id))
  
  		id2fd[fd2serv[fd].id] = nil
  		fd2serv[fd] = nil
  	end
  end
  
  function MSG.error(fd, msg)
  	print("MSG.error", fd, msg)
  	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()
  	local robot = skynet.newservice("robot")
  	local fd = socketdriver.connect(config.host, config.port)
  	socketdriver.start(fd)
  	local id
  	if id_max >= config.max then
  		while true do
  			id = math.randomInt(1, config.max)
  			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
  	pcall(skynet.call, robot, "lua", "start", fd, id)
  	log(string_format("login %s", fd2serv[fd].id))
  
  	-- 定时下线
  	skynet.timeout(math.randomInt(config.online_time[1], config.online_time[2]) * 100, function()
4dc77717   zhouhaihai   压测
97
  		MSG.close(fd)
7d31daa8   zhouhaihai   调整压测
98
  		socketdriver.close(fd)
4dc77717   zhouhaihai   压测
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
  	end)
  end
  
  local function online()
  	local curCount = 0
  	for _, _ in pairs(fd2serv) do
  		curCount = curCount + 1
  	end
  
  	-- 及时补充人数
  	if curCount < config.online then
  		for i = curCount + 1, config.online do
  			add_robot()
  		end
  	end
  
  	-- log(string_format("online  %s", curCount))
  	skynet.timeout(100, online)
  end
  
  local function start()
  	log("start testing ...")
  
  	for i = 1, config.online, config.inpre do
  		for j = 1, config.inpre do
  			add_robot()
  		end
  		skynet.sleep(100)
  	end
  
  	-- 每秒检查补充在线人数
  	online()
  end
  
  skynet.start(function()
  	skynet.fork(start)
  end)