3.11. go的优越性提现

未匹配的标注

如何提现golang的优越性呢?
还是放到具体的场景里面来讲
如果你使用php来做一个秒杀功能
你需要搭配着nginx,redis来搞定,咱就别说mysql了,nginx+php+redis三项技术,并且你需要对nginx进行调优,使得nginx可以抵御洪水攻击调配最大连接数等等一些列优化配置
这个nginx的调优我们讲过:博客:Nginx 高级篇(九)单机并发 1 万 10 万次请求解决和优化方案 自己去看调优配置一大堆
另外你如果仅仅搭建的是redis单机架构
阿里云redis单机版最大最大应该是能支撑到8万QPS
什么概念呢?
那你得明白什么是QPS: 3.8. 突破redis的瓶颈《Go高并发实战》
当然里面的公式是理想化的,
300万的pv也许你的qps就已经达到了8万的量
具体的测试结果我们不再用php来搞了,这里告诉你的是使用golang几行代码就可以代替掉你之前使用nignx+php+redis实现的秒杀功能,并且,你配置越高那么达到的每秒qps也就会越高!
上代码:
getOne.go文件:

package main

import (
   "log"
 "net/http" "sync")

var sum int64 = 0

//预存商品的数量
var productNum int64 = 10000

//互斥锁
var mutex sync.Mutex

//获取秒杀商品
func GetOneProduct() bool{
   //加锁
  mutex.Lock()
   defer mutex.Unlock()
   //判断数据是否超限
  if sum < productNum {
      sum+=1
  return true
   }
   return false
}

func GetProduct(w http.ResponseWriter,req *http.Request){
   if GetOneProduct() {
      w.Write([]byte("true"))
   }
   w.Write([]byte("false"))
}

func main(){
   http.HandleFunc("/getOne",GetProduct)
   err := http.ListenAndServe(":12345",nil)
   if err != nil {
      log.Fatal("err:",err)
   }
}

你需要将其交叉编译为二进制文件,如何交叉编译?3.10. windows下对go文件执行较差编译
上传到linux服气即可!其他的什么nginx什么apache我们统统不需要,只要linux能运行二进制文件直接就能跑!
然后运行起来:
./getOne

go的优越性提现
没报错即OK
下一步就是准备wrk压测工具
工具介绍:3.9. wrk工具的使用《Go高并发实战》
工具安装:博客:CentOS 下安装 wrk 压测工具
完事直接运行:

wrk -t220 -c20000 -d30s --latency http://10.10.20.152:12345/getOne

这里需要特别注意几点:
wrk也是很吃cpu资源的 所以不管是wrk运行的服务器还是getOne所在的服务器都要配置高高的,我没有这么多服务器 我的服务器16核16G 我是把wrk和getOne都跑在了同一台服务器上
然后你最好安装一下htop 比你直接用top看系统资源清晰多了,如果安装:博客:CentOS 下安装 wrk 压测工具
接下里就可以跑了
执行上边的命令你会看到htop如图所示:

go的优越性提现

16核的cpu瞬间爆满 内存当然吃的很少很少啦!
对了 还有一点 ulimit -n 1000000 这个在nignx调优那里说过是干啥的或者你自己去百度
不然报错打开文件过多

接下来直接看压测结果

go的优越性提现
如图所示
别的不废话了 直接看qps 他是一个标准 这里是12万的qps 虽然有398个超时 那是我服务器不行 配置上来绝对没问题!
也不能说我服务器不行,普通的机器定都也就2万qps 我的都达到12万了也够可以的了!

现在问题不是很清晰吗?我上边golang几行代码就可以搞定你用nginx+php+redis三项技能搞定的事情,并且性能还超高!

改天去阿里云买几台按量付费的16G内存16核的服务器 wrk在一台 getOne在一台 20000个连接压测30s 起来80个线程去处理 绝对不会有超时 并且qps绝对能达到24万以上! 敬请期待!

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~