Blame view

robot/start.lua 2.78 KB
4dc77717   zhouhaihai   压测
1
2
3
4
5
6
7
8
9
  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
  
3a646dea   zhouhaihai   拆分网关
10
11
12
13
14
15
  local onlineCount, startId, endId, inpre = ...
  onlineCount = tonumber(onlineCount)
  startId = tonumber(startId)
  endId = tonumber(endId)
  inpre = tonumber(inpre)
  
4dc77717   zhouhaihai   压测
16
17
18
19
  local queue = {}
  local fd2serv = {}
  local id2fd = {}
  local MSG = {}
3a646dea   zhouhaihai   拆分网关
20
  local id_max = startId - 1 -- robot id
4dc77717   zhouhaihai   压测
21
22
23
  
  
  function MSG.open( ... )
a5fa0074   zhouhaihai   robot
24
  	log("open", ...)
4dc77717   zhouhaihai   压测
25
26
27
  end
  
  function MSG.close(fd)
7d31daa8   zhouhaihai   调整压测
28
29
30
  	if fd2serv[fd] and not fd2serv[fd].closing then
  		fd2serv[fd].closing = true
  		skynet.call(fd2serv[fd].agent, "lua", "exit")
4dc77717   zhouhaihai   压测
31
32
33
34
35
36
37
38
  		log(string_format("logout %s", fd2serv[fd].id))
  
  		id2fd[fd2serv[fd].id] = nil
  		fd2serv[fd] = nil
  	end
  end
  
  function MSG.error(fd, msg)
a5fa0074   zhouhaihai   robot
39
  	log("MSG.error", fd, msg)
4dc77717   zhouhaihai   压测
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
  	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
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
100
101
102
  	log(string_format("login %s", fd2serv[fd].id))
  
  	-- 定时下线
  	skynet.timeout(math.randomInt(config.online_time[1], config.online_time[2]) * 100, function()
4dc77717   zhouhaihai   压测
103
  		MSG.close(fd)
7d31daa8   zhouhaihai   调整压测
104
  		socketdriver.close(fd)
4dc77717   zhouhaihai   压测
105
106
107
108
109
110
111
112
113
114
  	end)
  end
  
  local function online()
  	local curCount = 0
  	for _, _ in pairs(fd2serv) do
  		curCount = curCount + 1
  	end
  
  	-- 及时补充人数
3a646dea   zhouhaihai   拆分网关
115
116
  	if curCount < onlineCount then
  		for i = curCount + 1, onlineCount do
4dc77717   zhouhaihai   压测
117
118
119
120
121
122
123
124
125
126
127
  			add_robot()
  		end
  	end
  
  	-- log(string_format("online  %s", curCount))
  	skynet.timeout(100, online)
  end
  
  local function start()
  	log("start testing ...")
  
3a646dea   zhouhaihai   拆分网关
128
129
  	for i = 1, onlineCount, inpre do
  		for j = 1, inpre do
4dc77717   zhouhaihai   压测
130
131
132
133
134
135
136
137
138
139
140
141
  			add_robot()
  		end
  		skynet.sleep(100)
  	end
  
  	-- 每秒检查补充在线人数
  	online()
  end
  
  skynet.start(function()
  	skynet.fork(start)
  end)