golang下的并发、并行优化

栏目: Go · 发布时间: 5年前

内容简介:GO语言是非常适合高并发场景的,那么,业务系统具体会遇到哪些高并发的场景呢?该如何考虑性能开销呢?那么本文就笔者在业务系统常常遇到的问题来抛砖引玉~这是什么场景呢?回源!回源DB,二进制流回源源站等等~高并发的场景下,大量用户访问同一个对象,那么做请求合并可以节省非常可观的资源,好像和请求合并有点像?不太一样。比较经典的case就是redis的pipeline。能批量就批量,减少太多的封包解包,减少cpu和带宽~

GO语言是非常适合高并发场景的,那么,业务系统具体会遇到哪些高并发的场景呢?该如何考虑性能开销呢?那么本文就笔者在业务系统常常遇到的问题来抛砖引玉~

请求合并

这是什么场景呢?回源!回源DB,二进制流回源源站等等~高并发的场景下,大量用户访问同一个对象,那么做请求合并可以节省非常可观的资源, singleflight~ 当然这是进程内的用法。

批量协议

好像和请求合并有点像?不太一样。比较经典的case就是 redis 的pipeline。能批量就批量,减少太多的封包解包,减少cpu和带宽~

merge请求

额~~merge什么?比如一个视频id更新计数,那么9->18->25......对了,计数从1涨到100,难道我要写100次db吗?很明显,可以内存里merge~~

并行请求

这个用法在网关服务就非常常见啦~当你的服务需要聚合A、B、C这3个系统的数据,而A、B和C之间没有依赖,那么完全可以并行请求。golang里常用 errgroup 去实现。

减少锁以及系统调用

有些情况锁是很难避免的,但是可以通过一些锁粒度拆分优化去减少锁的开销。系统调用对cpu的开销都是挺明显的,具体可以压测查看top,us%的开销在90%以上,说明性能优化还是可以的。

序列化协议,json和pb

这里既包括API的协议,也同时包括缓存对象的序列化协议。缓存的访问常常会几倍于api请求,经常有放大,所以更要重视。

异步处理,使用channel,而不是无限制go func()

比如更新缓存的场景。这点挺容易理解,无限制的goroutine会带来大量的context切换,浪费cpu。当然channel的长度要做限制和监控。消费者goroutine数可以适当配置。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

机器消灭秘密

机器消灭秘密

安迪•格林伯格 (Andy Greenberg) / 王崧、王涛、唐禾 / 重庆出版社 / 2017-8-10 / 49.8

《机器消灭秘密》一书中,格林伯格深入研究并生动再现了那些拥有全能技术的网络安全魔术师,他们将任何企图染指个人隐私的所谓国家机密的保密性打得粉碎。这本精心组织的著作是对此题材感兴趣的读者的必读之书,即便现在你可能不感兴趣,将来也极有可能希望了解这些内容,因为任何人都会不可避免地置身其中。无论你是初涉电脑屏幕之后的虚拟战场的新生,还是经验丰富的维基解密观察家,本书都是不可多得的上乘之作,你总会在其中发......一起来看看 《机器消灭秘密》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试