微信公众号

Golang高性能web框架gin

原文连接

引言

之前分享了一篇如何提高django的并发能力文章,在文章的最后分享了进一步提升qps的方法,其中讲到了gin,下边在同样的业务场景分享一下压测数据。

说明

  • 服务器: 4核+4G (docker)
  • 压测机: 4核+2G (docker)
  • Go: 1.11.4
  • msyql: 4核+4G(docker) max_connections:1000 max_user_connections:1000

压测方式及命令

数据表说明

字段名 类型 索引类型
id int(11) PRI
name varchar(40) MUL
url varchar(150)
descp varchar(50)
zan_num int(11)
like_num int(11)
create_time datetime(6) MUL

写压测

代码

随机写一条数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
view.go:
func FeedGet(c *gin.Context) {
// nt := time.Now().Nanosecond()
// id, _ := models.FeedZanGet(nt % 200000)
res, _ := uuid.NewV4()
t := time.Now().Unix()
st := strconv.FormatInt(t, 10)
name := res.String()
id, _ := models.FeedAdd(
name, stringAdd("http://", name),
stringAdd(name, st), int(t/10000), int(t/13000))

c.JSON(200, gin.H{
"code": 200,
"id": id,
})
}
util.go:
func FeedAdd(name, url, desc string, like_num, zan_num int) (id int64, err error) {
stm, err := db.MySQLCon.Prepare(
"insert into feed(name, url, descp, zan_num, like_num,create_time) values(?, ?, ?, ?, ?, ?)")
if err != nil {
return 0, err
}
defer stm.Close()
res, err := stm.Exec(name, url, desc, zan_num, like_num, time.Now())
if err != nil {
return 0, err
}
return res.LastInsertId()
}

压测数据

  • 机器负载(几乎没什么负载)
    机器负载

  • 数据库连接数
    数据库连接数

  • qps
    qps

读压测

场景说明

数据库表中大概有50万条数据, 随机取出一条数据,上边的代码里已有

压测数据

  • 机器负载(几乎没什么负载)
    机器负载

  • 数据库连接数
    数据库连接数

  • qps
    qps

总结

Golang为什么会有这么好的性能,得益于goroutine以最低的耗损,充分利用多核,这里有一篇关于goroutine的说明
当然不管选择python的Django还是Golang的gin,关键看业务场景,如果本身没有这么高的并发量,Django还是很合适的,尤其是在试探型项目,从0到1的开发,不得不说利用Django能非常快速的完成。当然量(io密集型)比较大了,由于CPython的GIL的制约,这时候需要考量一种编译语言了,Golang还是个不错的选择。

文章推荐

ysab基于golang的压测工具
yunorm轻量接orm

yunsonbai wechat
微信公众号