iapps.site

command module
v1.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 22, 2019 License: Apache-2.0 Imports: 8 Imported by: 0

README

iapps.site

A practise project written with golang

概述

  • 本程序服务器和客户端使用Golang开发。需求见工程readme.txt中【开发要求】部分

  • 程序流程说明: 服务器监听Tcp端口(默认9001),接受客户端连接。 客户端连接服务器后,发起CGLoginMessage登录消息,服务器收到登录消息后,将消息push 到QueueService的消息队列中(channel),实现登录排队同时,负责账号Token验证的多个goroutine,从channel中读取登录消息,验证(最小化模拟sleep 100 ms)成功后,添加到PlayerManager中,表示玩家登录成功。

  • 服务器保护:

队列channel有容量限制,超出后,再请求登录的客户端将直接提示 queue full。 服务器主动断开连接。
最大同时在线人数限制,超出后,不在消费等待队列中的数据,除非有在线玩家退出(时间关系暂未模拟在线玩家退出)

环境要求

Windows/Linux
Go1.9+

安装部署

部署前请正确安装Golang,并正确设置Path环境变量,确保go version 命令运行OK。
如有疑问请 google golang 安装,并请正确设置GOPATH环境变量。
以笔者GOPATH=E:\develop\golang 为例

	
mkdir -p E:\develop\golang\src
cd /d E:\develop\golang\src

将本工程下载到src目录下,则 E:\develop\golang\src\iapps.site,此目录即为程序脚本工作目录

通过github下载运行

通过github下载本工程源码方式如下
使用git命令行下载
git clone https://github.com/huianlei/iapps.site.git
通过工程界面Clone or Download下载 zip 包
https://github.com/huianlei/iapps.site/archive/master.zip
确保加压后的目录为iapps.site  (源码import 语句中有该目录设定)
windows下完整路径为:%GOPATH%\src\iapps.site
linux 下完整路径为:$GOPATH/src/iapps.site
GOPATH 为上文提到的环境变量

如何使用

  • on Windows
运行服务器
 双击 win_server_start.bat 运行服务器
 或者命令行模式下,cd 当前目录输入以下命令:
 go run app.go 
运行客户端
 双击 win_client_start.bat 运行压测客户端(如需调整参数,请自行修改此脚本,或者直接运行下面的命令)
 或者命令行模式下,cd 当前目录输入以下命令:(开启10000个客户端连接,每秒并发200个,参数可根据需要调整)
 go run app.go -connect localhost:9001 -count 10000 -concurrent 200	
  • on Linux
cd iapps.site
sh server_start.sh  // 启动服务器前台运行,终端 Ctrl+C 终止运行
sh client_start.sh  // 启动客户端前台运行,终端 Ctrl+C 终止运行

注意:上述脚本为先编译源码,再运行方式。方便修改配置参数后,重新运行。

配置常量说明

常量配置文件目录: iapps.site/common/common.go
可根据压测数据调整下列参数。

	
// PlayerManager const config
const (
	// max online player count 
	// 最大同时在线人数,达到最大在线后,不再消费登录队列消息,除非有玩家退出(这个时间关系,尚未模拟)
	MaxOnline int32 = 1000
)

// QueueService const config
const (
	// tick milliseconds
	TickInterval = int64(100)
	// queue service channel capacity  
	// 登录排队队列容量,超出容量则直接给客户端提示 queue full
	QueueCapacity = int(500)
	// check interval to broadcast position in queue. in seconds
	// 登录队列扫描时间间隔:秒。对于排队的客户端,发生变化后,定期同步给客户端排队的位置
	QueueCheckInterval = int64(3)
)

// TcpServer const
const (
	// Listen port
	Port = ":9001"
	// simulate validate token sleep time in milliseconds
	// 模拟登录Token校验的时间消耗:毫秒
	ValidateTokenSleep = int64(100)
)	

压力测试

  • 测试环境及模式:
CPU:
Intel CoreI7  , 6核心  12个逻辑内核
内存:
16G
模式:
本机同时运行服务器和压测客户端。经测试该模式下本机最大能够打开13000个连接(win10默认系统参数)
  • 服务器参数
最大在线人数:20000		(本机测试最终可承载所有客户端)
队列容量:10000		 (本机测试完全用不了这么多)
账号验证处理能力:120/s	      (12cpu * 10,即单goroutine模拟sleep 100ms,及并发10) -- goroutine数等于cpu数
排队同步间隔:2s
  • 压测数据
总连接数:13000 
并发连接数:200
此并发连接下,会出现排队,位置更新后推送排队位置
PID初始内存稳定内存CPU峰值
264608056K397064K5.1%
  • 结论:
并发200 最大承载连接数 13000 服务器工作正常
经过多伦测试,瓶颈还是在于单机同时运行客户端造成的连接数上限瓶颈,不能压出服务器本身性能上限。
因手中暂时没有其他机器资源,来支持分开测试,在服务器保护机制下,即便出现过多连接,也不会影响服务器本身性能和稳定运行

参考资料

Go 指南

Go语言TCP/IP网络编程

Go中文标准库

深入解析Go

Documentation

Overview

network.go

Directories

Path Synopsis
common.go
common.go
network.go
network.go
proto.go
proto.go

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL