golang
文章平均质量分 68
hzzyu
熟悉php,go,python爬虫,热爱编程,尊重程序
展开
-
GMP中为什么要有P?
上图是Go 1.2前的调度器实现。GM 调度模型的问题:单一全局互斥锁(Sched.Lock)和集中状态存储 导致所有 goroutine 相关操作,比如:创建、结束、重新调度等都要上锁。 Goroutine 传递问题 M 经常在 M 之间传递”可运行”的 goroutine,这导致调度延迟增大以及额外的性能损耗(刚创建的 G 放到了全局队列,而不是本地 M 执行,不必要的开销和延迟)。 Per-M 持有内存缓存 (M.mcache) 每个 M 持有 mcache...原创 2021-08-03 10:46:05 · 1050 阅读 · 0 评论 -
golang defer中err的坑
func main() { err := outerFunc(1) if err != nil { fmt.Println("print err in main:", err) } fmt.Println("Done")}func outerFunc(param int) (err error) { defer func(err *error) { fmt.Println("test 1 print err in defer func:", (*err).Error()) }(&.原创 2021-05-18 15:45:09 · 769 阅读 · 0 评论 -
golang copy-on-write思想应用
copy-on-write 是计算机领域相当经典的优化思想,当然你如果问一个Java 开发者 copy-on-write 有什么作用?他们往往第一反应就是:优雅地解决读多写少场景下的并发问题。确实,众所周知,多线程环境下会出现 data race 的问题,我们以 Java 中的 ArrayList 为例,ArrayList 本身是不保证线程安全的,通常情况,要保证多线程环境下不出问题,就要给 ArrayList 加上读写锁,读要读锁,写要写锁,读与读之间不互斥,读与写之间要互斥,写与写之间也要互斥。原创 2021-04-26 23:33:52 · 1901 阅读 · 0 评论 -
Go json使用进阶技巧
数字转字符串因为前端 js 对 int64 的处理可能会因为溢出导致无法准确处理,因此我们期望可以返回字符串类型。package maintype A struct { B int `json:",string"`}定制Marshaler/Unmarshal在很多 case 中,我们需要对结构体进行一些定制,比如枚举类型和 string 的转换,比如一些属性的预处理,这个时候我们就需要实现自己的Marshal/Unmarshal方法了。 举一个很常见的例子,在 w...原创 2021-04-26 22:27:36 · 994 阅读 · 1 评论 -
i/o timeout ?希望你不要踩到这个http包的坑
问题我们来看一段日常代码。package mainimport ( "bytes" "encoding/json" "fmt" "io/ioutil" "net" "net/http" "time")var tr *http.Transportfunc init() { tr = &http.Transport{ MaxIdleConns: 100, Dial: func(netw, addr string) (net.Conn, error) {原创 2021-04-26 21:50:03 · 5000 阅读 · 0 评论 -
http/net源码阅读,goroutine泄漏个数分析
问题package mainimport ( "fmt" "io/ioutil" "net/http" "runtime")func main() { num := 6 for index := 0; index < num; index++ { resp, _ := http.Get("https://www.baidu.com") _, _ = ioutil.ReadAll(resp.Body) } fmt.Printf("此时goroutine个数= %d原创 2021-04-26 21:47:41 · 360 阅读 · 1 评论 -
【随记】golang 设置 http response 响应头与坑
今天在二开B站kartos框架时,发现怎么设置http的response Header都无法生效。故发现了设置 http response 响应头与坑。1、 设置WriteHeader的顺序问题w.WriteHeader(201)w.Header().Set("Name", "my name is smallsoup")用 golang 写 http server 时,可以很方便可通过 w.Header.Set(k, v) 来设置 http response 中 header 的内容。但是需原创 2021-04-26 21:17:48 · 639 阅读 · 0 评论 -
一台Linux服务器最多能支撑多少个TCP连接?
困惑很多人的并发问题在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题。很多同学看到这个问题的第一反应是65535。原因是:“听说端口号最多有65535个,那长连接就最多保持65535个了”。是这样的吗?还有的人说:“应该受TCP连接里四元组的空间大小限制,算起来是200多万亿个!”如果你对这个问题也是理解的不够彻底,那么今天讲个故事讲给你听!一次关于服务器端并发的聊天".原创 2021-04-24 20:24:50 · 3909 阅读 · 0 评论 -
redis连接池运转流程
redis连接池运转流程本文主要介绍redis-pool的PoolSize与MinIdleConns的参数配置对pool中连接数conns以及空闲连接数idleConns的影响PoolSize默认为 10 * runtime.NumCPU()连接池对象: p := &ConnPool{ conns: make([]*Conn, 0, opt.PoolSize), idleConns: make([]*Conn, 0, opt.PoolSize), }在一开始NewPoo原创 2021-04-16 16:41:37 · 976 阅读 · 0 评论 -
grpc实现流量染色
什么是流量染色流量染色是指根据流量协议设置对应的流量染色规则,对指定的流量进行染色标记,并在整个调用链中携带该标记。通过染色流量可以对特定的流量进行跟踪和路由,所以流量染色功能常被用于灰度发布的场景。在业务系统迭代过程中会不断有新版本发布,在正式发布前,可以使用流量染色控制先进行小规模验证,通过收集使用体验的数据,对应用新版本的功能、性能、稳定性等指标进行评判,然后再全量升级。即使某个新版本出现问题,也只会影响已染色流量,不会将问题蔓延至整个系统,保证整个系统的正常运行。同理,流量染色功能还可以用于原创 2021-04-08 16:09:12 · 5066 阅读 · 0 评论 -
使用go build 进行条件编译
当我们编写的go代码依赖特定平台或者cpu架构的时候,我们需要给出不同的实现C语言有预处理器,可以通过宏或者#define包含特定平台指定的代码进行编译但是Go没有预处理器,他是通过 go/build包 里定义的tags和命名约定来让Go的包可以管理不同平台的代码这篇文章将讲述Go的条件编译系统是如何实现的,并且通过实例来说明如何使用1. 预备知识:go list命令的使用在讲条件编译之前需要了解go list的简单用法go list访问源文件里那些能够影响编...原创 2020-10-22 15:41:19 · 2641 阅读 · 0 评论 -
B站的fail fast原则
首先,超时控制是全链路的超时控制,如果上游刚开始设置5s的context,经过一系列的业务后,如消耗了2s,再到另一个服务,那么此服务的context就只剩3s。其次是fail fast 原则,如果上游已经失败,那么下游需要迅速结束,避免资源的浪费。mysql,tidb等的fail fast做法是每次执行相应操作时,判断当前context是否done,如果已经done,那么不再处理。func ctxDriverExec(ctx context.Context, execerCtx dri原创 2020-10-16 17:24:09 · 262 阅读 · 1 评论 -
B站价值60亿跨年晚会背后的微服务治理
B站价值60亿跨年晚会背后的微服务治理 大家都知道微服务有两个痛点,一个是如何拆分微服务,微服务的边界怎么划分制定;二是微服务上了规模之后如何管理,因为只要上了规模,任何小小的问题都可能会被放大,最后导致雪崩效应。 一、微服务化带来的挑战 上图是我们 B 站全链路追踪的一个截图,这只是其中一个拓扑图的调用链路,就已经非常复杂了。可以想象一下,如果是整个公司所有的调用链路,会有多么复杂。 这就带来了微服务治理的复杂性问题:如何保证注册和发...原创 2020-10-16 10:09:19 · 243 阅读 · 1 评论 -
bilibili技术总监毛剑:B站高可用架构实践
https://zhuanlan.zhihu.com/p/139258985转载 2020-10-16 10:03:57 · 1564 阅读 · 0 评论 -
go-zero的全链路追踪与超时
目前分布式链路追踪系统基本都是根据谷歌的《Dapper大规模分布式系统的跟踪系统》这篇论文发展而来,主流的有zipkin,pinpoint,skywalking,cat,jaeger等。论文链接:https://storage.googleapis.com/pub-tools-public-publication-data/pdf/36356.pdfgo-zero框架全链路追踪思路一.httpServer实现TracingHandlerfunc TracingHandler(next ht原创 2020-10-10 13:24:03 · 4039 阅读 · 0 评论 -
深入理解Golang之context
前言这篇文章将介绍Golang并发编程中常用到一种编程模式:context。本文将从为什么需要context出发,深入了解context的实现原理,以及了解如何使用context。为什么需要context在并发程序中,由于超时、取消操作或者一些异常情况,往往需要进行抢占操作或者中断后续操作。熟悉channel的朋友应该都见过使用done channel来处理此类问题。比如以下这个例子:func main() { messages := make(chan int, 10)原创 2020-10-06 15:18:13 · 414 阅读 · 0 评论 -
Golang 性能优化实战
项目背景网关服务作为统一接入服务,是大部分服务的统一入口。为了避免成功瓶颈,需要对其进行尽可能地优化。因此,特别总结一下 golang 后台服务性能优化的方式,并对网关服务进行优化。技术背景: 基于 tarsgo 框架的 http 接入服务,下游服务使用 tarsgo 协议进行交互 性能指标网关服务本身没有业务逻辑处理,仅作为统一入口进行请求转发,因此我们主要关注下列指标...原创 2020-05-07 21:08:54 · 1104 阅读 · 0 评论 -
[典藏版]Golang三色标记、混合写屏障GC模式图文全分析
https://mp.weixin.qq.com/s/G7id1bNt9QpAvLe7tmRAGw原创 2020-04-28 22:36:22 · 597 阅读 · 0 评论 -
Go 语言为什么需要泛型?
Go:为何带来泛型介绍[这是在Gophercon 2019上发表的演讲版本。视频链接可供使用。]这篇文章是关于向Go添加泛型的意义,以及为什么我认为我们应该这样做。我还将介绍为Go添加泛型的设计可能的改变。Go于2009年11月10日发布。不到24小时后,我们看到了关于泛型的第一条评论。(该评论还提到了我们在2010年初以panic和recover的形式添加到语言中的情况。)在...原创 2020-04-28 22:28:31 · 894 阅读 · 0 评论 -
Go 为什么这么“快”
本文主要介绍了 Go 程序为了实现极高的并发性能,其内部调度器的实现架构(G-P-M 模型),以及为了最大限度利用计算资源,Go 调度器是如何处理线程阻塞的场景。怎么让我们的系统更快随着信息技术的迅速发展,单台服务器处理能力越来越强,迫使编程模式由从前的串行模式升级到并发模型。并发模型包含 IO 多路复用、多进程以及多线程,这几种模型都各有优劣,现代复杂的高并发架构大多是几种模型协同使...原创 2020-04-28 22:26:33 · 250 阅读 · 0 评论 -
Go语言参数传递是传值还是传引用
对于了解一门语言来说,会关心我们在函数调用的时候,参数到底是传的值,还是引用?其实对于传值和传引用,是一个比较古老的话题,做研发的都有这个概念,但是可能不是非常清楚。对于我们做Go语言开发的来说,也想知道到底是什么传递。那么我们先来看看什么是值传递,什么是引用传递。什么是传值(值传递)传值的意思是:函数传递的总是原来这个东西的一个副本,一副拷贝。比如我们传递一个int类型的参数,传...原创 2020-01-21 15:55:12 · 581 阅读 · 0 评论 -
想系统学习GO语言(Golang),能推荐几本靠谱的书吗?
学习任何一门语言,都要学习好基础,把基础打牢,那些框架对你来说都是工具,你自己的基础好,懂得了他们的原理,自己就可以创造更优秀的框架。基础推荐官方文档,没有什么比这个更清晰了。官方文档可以看这个中文的,比较快一些 https://go-zh.org/doc/其次参考这个Go指南,练习一遍 https://tour.go-zh.org/welcome/1现在对Go语言应该有了一个全面的认识,然后你再...原创 2020-01-21 11:07:21 · 951 阅读 · 1 评论 -
Go 1.13设置代理
在Go 1.13中,我们可以通过GOPROXY来控制代理,以及通过GOPRIVATE控制私有库不走代理。设置GOPROXY代理:go env -w GOPROXY=https://goproxy.cn,direct设置GOPRIVATE来跳过私有库,比如常用的Gitlab或Gitee,中间使用逗号分隔:go env -w GOPRIVATE=*.gitlab.com,*.gi...原创 2019-11-30 18:49:27 · 397 阅读 · 0 评论 -
Context 使用原则 Go语言实战笔记(二十)| Go Context
控制并发有两种经典的方式,一种是WaitGroup,另外一种就是Context,今天我就谈谈Context。什么是WaitGroupWaitGroup以前我们在并发的时候介绍过,它是一种控制并发的方式,它的这种方式是控制多个goroutine同时完成。func main() { var wg sync.WaitGroup wg.Add(2) go func() { tim...原创 2019-11-25 16:28:15 · 360 阅读 · 0 评论 -
Go语言实战笔记(五)| Go 切片
《Go语言实战》读书笔记,未完待续,欢迎扫码关注公众号flysnow_org,第一时间看后续笔记。切片也是一种数据结构,它和数组非常相似,因为他是围绕动态数组的概念设计的,可以按需自动改变大小,使用这种结构,可以更方便的管理和使用数据集合。内部实现切片是基于数组实现的,它的底层是数组,它自己本身非常小,可以理解为对底层数组的抽象。因为机遇数组实现,所以它的底层的内存是连续非配的,效...原创 2019-11-25 15:51:08 · 205 阅读 · 0 评论 -
Golang学习 - sync 包
临时对象池 Pool 用于存储临时对象,它将使用完毕的对象存入对象池中,在需要的时候取出来重复使用,目的是为了避免重复创建相同的对象造成 GC 负担过重。其中存放的临时对象随时可能被 GC 回收掉(如果该对象不再被其它变量引用)。 从 Pool 中取出对象时,如果 Pool 中没有对象,将返回 nil,但是如果给 Pool.New 字段指定了一个函数的话,Pool 将使用该函数创建一...原创 2019-11-12 14:20:04 · 119 阅读 · 0 评论 -
GRPC中设置client的超时时间(golang)
超时建立连接主要就2函数Dail和DialContext。// Dial creates a client connection to the given target.func Dial(target string, opts ...DialOption) (*ClientConn, error) { return DialContext(context.Backgrou...原创 2019-08-16 10:23:32 · 10650 阅读 · 1 评论 -
使用 Gomock 进行单元测试
前言在实际项目中,需要进行单元测试的时候。却往往发现有一大堆依赖项。这时候就是 Gomock 大显身手的时候了Gomock 是 Go 语言的一个 mock 框架,官方的那种原创 2019-08-09 09:08:06 · 574 阅读 · 0 评论 -
golang中gRpc的安装及使用
1、(1)Protocol Buffers(简称protobuf)用于结构化数据和字节码之间互相转换(即实现从结构体转换为字节流以及从字节流转换为结构体),一旦你定义了自己的报文格式(message),你就可以运行ProtocolBuffer编译器,将你的.proto文件编译成特定语言的类。(2)proto里的message,pb.go里的结构体(带方法)proto里的service,pb....原创 2019-08-13 13:32:39 · 1445 阅读 · 0 评论 -
Swoole4 协程与 Go 协程有哪些区别
Swoole4与Go协程在设计上是完全一致的,均是stackful的,每个协程拥有独立的运行栈。协程调度器使用汇编代码,切换协程上下文。Swoole4与Go协程在实现细节上存在一些差异。主要是以下几方面:多线程Swoole4的协程调度器是单线程的,因此不存在数据同步问题,同一时间只会有一个协程在运行 Go协程调度器是多线程的,同一时间可能会有多个协程同时执行因此在Swoole4协程...原创 2019-06-04 18:25:41 · 973 阅读 · 0 评论 -
Golang适合高并发场景的原因分析
典型的两个现实案例:我们先看两个用Go做消息推送的案例实际处理能力。360消息推送的数据:16台机器,标配:24个硬件线程,64GB内存 Linux Kernel 2.6.32 x86_64 ...转载 2018-09-11 18:19:30 · 322 阅读 · 0 评论