使用 Sync Pool 提升程序性能
使用 Sync Pool 提升程序性能
程序性能优化往往是一个程序提升的瓶颈,这不但需要你有意识的积累知识,而且还需工作上有场景的支持,对我来说工作上可能并没有太多的场景来支持我去提升,但不断的积累还是必要的,每块支持都能建立自己的体系的前提是你积累的足够多,这篇文章就是在看并发相关的博文时发现的一个提升性能的好东西:sync.pool
你有没有遇到过,当多个 goroutine 都需要创建同⼀个对象的时候,如果 goroutine 数过多,导致对象的创建数⽬剧增,进⽽导致 GC 压⼒增大。形成 “并发⼤-占⽤内存⼤-GC 缓慢-处理并发能⼒降低-并发更⼤”这样的恶性循环。当多个可以重复使用的数据都需要进行数据反序列化或是形成一个buffer。
在这个时候,就需要有⼀个对象池,每个 goroutine 不再⾃⼰单独创建对象,⽽是从对象池中获取出⼀个对象(如果池中已经有的话)。
go 语言的并发原语其实已经有了该功能:sync.pool:
sync.Pool 数据类型用来保存一组可独立访问的临时对象。请注意这里加粗的“临时”这两个字,它说明了 sync.Pool 这个数据类型的特点,也 ...
如何使用 benchmark 进行性能分析
如何使用 benchmark 进行性能分析
代码的性能是区分代码好坏的重要因素,你是否经常遇到你觉得这样写性能好,但当别人质疑你的时候你有没法给出好的证据?用go语言内置的基准测试工具becnmark给出证据吧!
稳定的测试环境当我们尝试去优化代码的性能时,首先得知道当前的性能怎么样。Go 语言标准库内置的 testing 测试框架提供了基准测试(benchmark)的能力,能让我们很容易地对某一段代码进行性能测试。
性能测试受环境的影响很大,为了保证测试的可重复性,在进行性能测试时,尽可能地保持测试环境的稳定。
机器处于闲置状态,测试时不要执行其他任务,也不要和其他人共享硬件资源。
机器是否关闭了节能模式,一般笔记本会默认打开这个模式,测试时关闭。
避免使用虚拟机和云主机进行测试,一般情况下,为了尽可能地提高资源的利用率,虚拟机和云主机 CPU 和内存一般会超分配,超分机器的性能表现会非常地不稳定。
超分配是针对硬件资源来说的,商业上对应的就是云主机的超卖。虚拟化技术带来的最大直接收益是服务器整合,通过 CPU、内存、存储、网络的超分配(Overcommitment)技术, ...
go并发模型(超时取消模型)
go 并发模型整理(一)
go 语言的并发是整个语言的精髓所在,在语言层面灵活的处理协程,可以有效提高程序性能。但是go并发虽然简单,处理不当依然会造成很大的问题,比如内存溢出,比如死锁等等头疼的问题,写模型整理这个模块主要就是想要把一些好的并发模式收集起来积累经验,同时也对容易出问题的地方深入了解。
超时取消模型网上看到的很好的流程图这是我在看别人博客时看到的一张流程图,但是他的内容并没有完整的代码实现,我感觉这个流程做的很棒,所以自己用代码去实现了一下,希望可以抛砖引玉。代码点击这里看
这个流程图之所以我觉好,是因为 :
考虑的十分细节,每个过程产生的并发的生命周期控制都有涉及,可以做到即使出现问题也可以通过超时的设置优雅退出所有并发。
流程图并不是简单的去实现一个超时退出,而是设计了一些比较通用的业务逻辑。请看下图:
代码实现先把整个流程拆分一下:发送者 —> 接收者(并发接收) —> 最终结果处理者
其中发送者再次拆分:工人1;工人2;工人3 —> 数据整合者 —> 整合后的最终可以发送的数据
整个流程涉及10个协程,其中三个工人的并发,三个接收 ...
聊聊代码耦合
代码耦合性说到代码的耦合性,我想大多数人应该都没有好好的了解过什么是耦合,大多数是在自己开发时遇到了一些问题,或是听主管说起就大概的有一个了解。
我也是这样,我从没有去了解代码耦合,我只是一个大概的认知,大概就是一个方法不要重复的出现在多个模块,模块之间不要有太多的相互依赖。
在这之后我遇到了一个声明某函数类型,但在另外一个文件里实现的使用方式,一个小哥告诉我这是为了减少代码耦合,我就觉得奇怪,你既然在这个包声明了该函数,就算你在另一个包实现那也是一样要调用该包的,如何解耦?后面我觉的是大家根本就不理解耦合,都是胡乱猜想的,我的代码重复的逻辑提出来了,或是清晰了那就是解耦。对于什么是“耦合”、什么是“乱”,他们并不知道有什么客观标准可以度量。
我就上网查了一下资料,有一个解释甚合我意,文章把代码耦合划分成三个可以度量的标准:
依赖依赖和耦合的最大区别在于,当我们说“A和B耦合”时,在字面含义中,A和B二者平等。然而,正确的模块关系根本不应该平等,而应该是单向依赖才对。所以我们应该说“A依赖B”,这样含义要清楚得多。A依赖B意味着,A模块可以调用B模块暴露的API,但B模块绝不允许调用A ...
Redis 分布式锁,你的使用正确吗
Redis 分布式锁,你的使用正确吗
Redis 在项目中使用的最多的就是分布式锁,但你的使用是否正确,会不会因为这个所给你的项目挖下深坑?
为什么要用分布式锁我们日常经常会遇到一些高并发的场景,例如电商 App 上经常出现的秒杀活动、限量优惠券抢购,还有我们去哪儿网的火车票抢票系统等,这些场景有一个共同特点就是访问量激增,虽然在系统设计时会通过限流、异步、排队等方式优化,但整体的并发还是平时的数倍以上,为了避免并发问题,防止库存超卖,给用户提供一个良好的购物体验,这些系统中都会用到锁的机制。
对于单进程的并发场景,可以使用编程语言及相应的类库提供的锁,避免并发问题。go 中常用的就是 sync 包的 Mutex,当然你也可以使用 atomic value 通过值的原子性来自制一把锁。
如果在分布式场景中,实现不同客户端的线程对代码和资源的同步访问,保证在多线程下处理共享数据的安全性,就需要用到分布式锁技术。
Redis 分布式锁使用 Redis 作为分布式锁,本质上要实现的目标就是一个进程在 Redis 里面占据了仅有的一个“茅坑”,当别的进程也想来占坑时,发现已经有人蹲在那里了, ...
如何使用 dlv 结合 Goland 进行程序 debug 调试
如何使用 dlv 结合 Goland 进行程序 debug 调试相信很多 Golang 的初级玩家不会进行程序的 Debug 定位问题单纯的靠脑子,或者效率很低的不断的添加日志打印,别问我为什么知道的因为我就是这样的,最好最快捷的问题定位方式一定是使用 Debug 打断点调试,这时就引出了本文的主角dlv。
实际上,delve 才是全称,dlv 只是启动命令,如果 VScode,Goland,默认使用的调试器就是基于 delve 的。
安装 dlv参考官方的安装方法,把 dlv 命令安装在 gopath 的 bin 目录下(需要你把go的bin目录添加到$PATH)
123git clone https://github.com/go-delve/delvecd delvego install github.com/go-delve/delve/cmd/dlv
成功安装执行
1dlv version
得到:
123Delve DebuggerVersion: 1.7.1Build: $Id: 3bde2354aafb5a4043fd59838842c4cd4a8b6f0b $
进 ...
Casbin 多租户模型(RABC-dom)正确打开方式
Casbin 多租户模型(RABC-dom)正确打开方式
本文使用多租户模型即 RABC-dom 做了一个项目,旨在为你提供好的多租户模型打开方式,抛砖引玉,共同进步。
这里只是介绍多租户模型(casbin 官网叫域内RABC) 的使用方式,对于不了解casbin 的同志们可以先去官网了解一下,之后我会出几个详解casbin 的文章,最近实在是抽不出时间。写这个文章是因为没看到有相关的使用多租户模型的案例,自己做了一个自测有效的正确的打开方式,欢迎大家来讨论。
为什要使用Casbin不知道大家的项目权限管理都是如何做的,反正我们公司是你写你的我写我的全都耦合在各自的代码里,你一个写法我一个写法,各种表之间的JOIN,看着累,写着累,最重要的是严重影响代码的性能。
我去网上查了一下这个 Casbin 这个权限管理工具,发现很不错,他的思路就是根据你的权限逻辑进行一个规定,再把我们要去限定权限的所有资源都拿出来根据你做的规定排列组合形成一个资源权限组, 在你进行资源访问时,根据你的资源权限组进行匹配,匹配规则也是可以定义的,匹配成功就为权限通过。
可以说是摘出了所有代码中的权限,让权限不 ...
聊聊 SSL/TLS (二)
聊一下 SSL/TLS (二)SSL 如何工作SSL是如何工作的呢:
首先DNS对你的域名进行解析,解析出对应的网址IP这样浏览器就可以根据你的IP访问到资源页面。
访问过程中有一个中间步骤我们叫做SSL握手,这一过程成功后网址信息就被核实,交互信息就被加密。
这也就是TLS两个最重要的目的:交互信息机密(confidentiality),网址身份认证(authentication)
此时有必要提一下SNI
SNI (Server Name Indication)说握手之前提一下 SNI(Server Name Indication)
在客户端和服务端建立 HTTPS 的过程中要先进行 TLS 握手,握手后会将 HTTP 报文使用协商好的密钥加密传输。
在 TLS 握手信息中并没有携带客户端要访问的目标地址。这样会导致一个问题,如果一台服务器有多个虚拟主机,且每个主机的域名不一样,使用了不一样的证书,该和哪台虚拟主机进行通信?
由于技术限制,SSL初期的设计顺应经典的公钥基础设施 PKI(Public Key Infrastructure)设计,PKI 认为一个服务器只为一个域名提供服 ...
聊聊 SSL/TLS (一)
聊一下 SSL/TLS (一)因为自己是目前是做证书这块业务,而且证书这个东东大多数互联网人都要用到,所以觉得有必要把这块东西进行一个总结。
目标是透彻了解 SSL/TLS 的全貌,了解SSL本身的一些漏洞及身份认证中的风险,并且对SSL从颁发到部署整个生命周期管理的最佳实践进行延展。争取看下来能让你对证书有一个全方位的了解
本文为第一篇将介绍 SSL/TLS 的基础知识,原理,以及证书的格式,分类及如何签发等基础概念进行讲解。
SSL/TLS 综述概述SSL(Secure Sockets Layer)安全套接层协议 现在叫TLS(Transport Layer Security)安全传输层协议,是设计来使客户端服务端的交流不被窃听和篡改,用于网络身份认证及通信加密。其实就是使用加密算法使得通信系统双方的通信数据无法被阅读及篡改,同时还能确认身份。
最突出的应用:把它加载在我们的通信协议HTTP上就形成了HTTPS。
我们平时使用的邮件传输通信协议STMP也使用了TLS(RFC 3207)公钥证书来认证通信双方的身份。
历史:SSL:
v1.0 未发布
v2.0(NetScape-19 ...
战俘营经济学
战俘营经济学
每天学点经济学,从不同的角度看世界
经济学其实无处不在,并不需要用完善的市场经济体系作为研究对象。
战俘营里的市场经济 有一个战俘营的故事叫做《战俘营里的经济组织》他就描述了战俘营中的经济现象,作者说战俘营中市场行为是一般都是迅速发展起来的,一开始到的人只是相互关心爱护支持以此得到相互之间需求的东西,但是很快大家就发现仅仅这样是不够的,只有发展起市场才可以公平的获取想要的东东。
作者的原话是,事实上一个战俘物质的享受水平的显著提升,不是依靠自身获取生活必须品的能力,而是通过商品和服务交换得以实现的。这句话中蕴含的道理就是物质的总量哪怕不发生变化,只要人与人之间可以进行交易,幸福就可以无中生有的产生。
战俘营中的市场经济不仅交易平台,公开透明的交易价格,还出现了劳动服务市场,有人开始提供各种个样的服务比如洗衣服,熨衣服,甚至是画像。
今天中国很多不发达地区,贫困地区,我们归咎于政策,物资。其实不是的,战俘营中什么都没有繁荣的市场经济也发展了起来。归根结底还是制度和自由度没有给到。
战俘营里的价格和价格波动 有了市场就有了价格, ...