深度思维者

永远年轻,永远热泪盈眶

摘要: 1. 前言 Go 语言中两个经常成对出现的两个关键字 — panic 和 recover。这两个关键字与上一节提到的 defer 有紧密的联系,它们都是 Go 语言中的内置函数,也提供了互补的功能。 需要说明两点 panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码 阅读全文
posted @ 2021-12-19 23:06 failymao 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 defer 会在当前函数返回前执行传入的函数,它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。 理解这句话主要在三个方面: 当前函数 返回前执行,当然函数可能没有返回值 传入的函数,即 defer 关键值后面跟的是一个函数,包括普通函数如(fmt.Println), 也可以是匿 阅读全文
posted @ 2021-12-19 22:13 failymao 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 一.序 这一篇算是并发编程的一个补充,起因是当前有个项目,大概の 需求是,根据kafka的分区(partition)数,创建同等数量的 消费者( goroutine)从不同的分区中消费者消费数据,但是总有某种原因导致,某一个分区消费者创建失败,但是其他分区消费者创建失败。 最初的逻辑是,忽略分区失败 阅读全文
posted @ 2021-12-12 00:02 failymao 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 1. 引言 关于闭包的说明,曾在很多篇幅中都有过一些说明,包括Go基础--函数2, go 函数进阶,异常与错误 都有所提到, 但是会发现,好像原理(理论)都懂,但是就是不知道如何使用,或者在看到一些源码时,依然一头雾水。 刚好今天看到了一篇优质的博客,并结合以前几篇关于类似闭包的介绍,再次对 闭包进 阅读全文
posted @ 2021-12-08 00:25 failymao 阅读(265) 评论(2) 推荐(0) 编辑
摘要: 1. 什么是边界检查? 边界检查,英文名 Bounds Check Elimination,简称为 BCE。它是 Go 语言中防止数组、切片越界而导致内存不安全的检查手段。如果检查下标已经越界了,就会产生 Panic。 边界检查使得我们的代码能够安全地运行,但是另一方面,也使得我们的代码运行效率略微 阅读全文
posted @ 2021-12-05 23:12 failymao 阅读(361) 评论(2) 推荐(0) 编辑
摘要: 一.前言 1.1 为什么需要Singleflight? 很多程序员可能还是第一次听说,本人第一次听说这个的时候以为翻译过来就是程序设计中被称为的是 "单例模式"。 google之后二者天壤之别。 一般情况下我们在写一写对外的服务的时候都会有一层 cache 作为缓存,用来减少底层数据库的压力,但是在 阅读全文
posted @ 2021-11-27 22:39 failymao 阅读(382) 评论(1) 推荐(2) 编辑
摘要: 一.设计原理 Go 语言中最常见的、也是经常被人提及的设计模式就是: "不要通过共享内存来通信,我们应该使用通信来共享内存" 通过共享内存来通信是直接读取内存的数据,而通过通信来共享内存,是通过发送消息的方式来进行同步。 而通过发送消息来同步的这种方式常见的就是 Go 采用的通信顺序进程 CSP(C 阅读全文
posted @ 2021-11-23 00:30 failymao 阅读(1003) 评论(0) 推荐(0) 编辑
摘要: 一. 序言 1.1 场景一 现在有一个 Server 服务在执行,当请求来的时候我们启动一个 goroutine 去处理,然后在这个 goroutine 当中有对下游服务的 rpc 调用,也会去请求数据库获取一些数据,这时候如果下游依赖的服务比较慢,但是又没挂,只是很慢,可能一次调用要 1min 才 阅读全文
posted @ 2021-11-17 01:03 failymao 阅读(373) 评论(0) 推荐(1) 编辑
摘要: 一. 前言 了解 sync.WaitGroup的用法都知道 一个 goroutine 需要等待多个 goroutine 完成和多个 goroutine 等待一个 goroutine 干活时都可以解决问题 WaitGroup 的确是一个很强大的工具,但是使用它相对来说还是有一点小麻烦, 一方面我们需要 阅读全文
posted @ 2021-11-07 23:46 failymao 阅读(563) 评论(0) 推荐(0) 编辑
摘要: 一.序 单从库名大概就能猜出其作用。sync.Once使用起来很简单, 下面是一个简单的使用案例 package main import ( "fmt" "sync" ) func main() { var ( once sync.Once wg sync.WaitGroup ) for i := 阅读全文
posted @ 2021-11-02 23:28 failymao 阅读(282) 评论(2) 推荐(0) 编辑
摘要: 一. 序言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术。 WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束。比如某个goroutine需要等待其他几个goroutine全部完成,那么使用WaitGroup可以轻松实现。 阅读全文
posted @ 2021-11-01 23:46 failymao 阅读(372) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在学习 mutex后。 在读源码的时候发现里面使用了很多atomaic 包的方法来保证原子。在并发编程中,常常提到的并发安全,具体数据就是 对数据的修改读取是否是原子操作 所以也常说,并发是否能保证了原子操作。在Golang语言中,实现原子操作是在标准库实现的,即 sync/atomic 阅读全文
posted @ 2021-11-01 09:56 failymao 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 一.前言 我们反复提到了goroutine的创建时简单的。 但是仍然要小心, 习惯总是会导致我们可能写出一些bug.对于语言规范没有定义的内容不要做任何的假设。 需要通过同步语义来控制代码的执行顺序 这一点很重要。 这些包提供了一些基础的同步语义,但是在实际的并发编程当中,我们应该使用 channe 阅读全文
posted @ 2021-10-31 22:23 failymao 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 1. 场景 使用windows, wsl2 进行日常开发测试工作。 但是wsl2经常会遇到网络问题。比如今天在测试一个项目,核心功能是将postgres 的数据使用开源组件synch 同步到clickhouse 这个工作。 测试所需组件 postgres kafka zookeeper redis 阅读全文
posted @ 2021-10-20 23:58 failymao 阅读(1280) 评论(2) 推荐(1) 编辑
摘要: 1. 前言 GMP调度应该是被面试的时候问的频率最高的问题! 我们知道,一切的软件都是跑在操作系统上,真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是 “单进程时代” 一切的程序只能串行发生。 1.1 Goroutine 调度器的 阅读全文
posted @ 2021-09-22 08:10 failymao 阅读(456) 评论(0) 推荐(1) 编辑
摘要: 1. 忽略某个字段 格式 // 使用json tag指定json序列化与反序列化时的行为 type Person struct { Name string `json:"name"` // 指定json序列化/反序列化时使用小写name Age int64 Weight float64 `json: 阅读全文
posted @ 2021-09-16 09:51 failymao 阅读(809) 评论(0) 推荐(1) 编辑
摘要: 1. 对创建的gorouting负责 1.1 不要创建一个你不知道何时退出的 goroutine 下面的代码有什么问题? 是不是在我们的程序种经常写类似的代码? // Week03/blog/01/01.go package main import ( "log" "net/http" _ "net 阅读全文
posted @ 2021-09-14 23:41 failymao 阅读(2484) 评论(4) 推荐(5) 编辑
摘要: 1. 限流对比 类型 实现 优点 缺点 单机限流 令牌桶 1. 稳定可靠,实现简单,性能高2. 支持突发流量应对 1. 流量不均匀会导致误限制2. 阈值设置较为困难,需要提前压测 漏桶 1. 稳定可靠,实现简单,性能高 1. 流量不均匀会导致误限制2. 阈值设置较为困难,需要提前压测3.不支持突发流 阅读全文
posted @ 2021-09-10 07:58 failymao 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 无论是令牌桶, 漏桶 还是 自适应限流的方法,总的来说都是服务端的单机限流方式。虽然服务端限流虽然可以帮助我们抗住一定的压力,但是拒绝请求毕竟还是有成本的。如果我们的本来流量可以支撑 1w rps,加了限流可以支撑在 10w rps 的情况下仍然可以提供 1w rps 的有效请求,但是流 阅读全文
posted @ 2021-09-09 00:10 failymao 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 令牌桶与 漏桶 两种算法最大的一个问题就是他们都属于需要提前设置阈值的算法,基于 QPS 进行限流的时候最麻烦的就是这个阈值应该怎么设定。一般来说我们可以通过压测来决定这个阈值。但是也会存在问题 如果每个系统上线前都要经过很严格的压测,那么成本相对来说会比较大 很多时候压测都会在测试环境 阅读全文
posted @ 2021-09-06 07:56 failymao 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 Go 语言中两个经常成对出现的两个关键字 — panic 和 recover。这两个关键字与上一节提到的 defer 有紧密的联系,它们都是 Go 语言中的内置函数,也提供了互补的功能。 需要说明两点 panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码 阅读全文
posted @ 2021-12-19 23:06 failymao 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 defer 会在当前函数返回前执行传入的函数,它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。 理解这句话主要在三个方面: 当前函数 返回前执行,当然函数可能没有返回值 传入的函数,即 defer 关键值后面跟的是一个函数,包括普通函数如(fmt.Println), 也可以是匿 阅读全文
posted @ 2021-12-19 22:13 failymao 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 一.序 这一篇算是并发编程的一个补充,起因是当前有个项目,大概の 需求是,根据kafka的分区(partition)数,创建同等数量的 消费者( goroutine)从不同的分区中消费者消费数据,但是总有某种原因导致,某一个分区消费者创建失败,但是其他分区消费者创建失败。 最初的逻辑是,忽略分区失败 阅读全文
posted @ 2021-12-12 00:02 failymao 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 1. 引言 关于闭包的说明,曾在很多篇幅中都有过一些说明,包括Go基础--函数2, go 函数进阶,异常与错误 都有所提到, 但是会发现,好像原理(理论)都懂,但是就是不知道如何使用,或者在看到一些源码时,依然一头雾水。 刚好今天看到了一篇优质的博客,并结合以前几篇关于类似闭包的介绍,再次对 闭包进 阅读全文
posted @ 2021-12-08 00:25 failymao 阅读(265) 评论(2) 推荐(0) 编辑
摘要: 1. 什么是边界检查? 边界检查,英文名 Bounds Check Elimination,简称为 BCE。它是 Go 语言中防止数组、切片越界而导致内存不安全的检查手段。如果检查下标已经越界了,就会产生 Panic。 边界检查使得我们的代码能够安全地运行,但是另一方面,也使得我们的代码运行效率略微 阅读全文
posted @ 2021-12-05 23:12 failymao 阅读(361) 评论(2) 推荐(0) 编辑
摘要: 一.前言 1.1 为什么需要Singleflight? 很多程序员可能还是第一次听说,本人第一次听说这个的时候以为翻译过来就是程序设计中被称为的是 "单例模式"。 google之后二者天壤之别。 一般情况下我们在写一写对外的服务的时候都会有一层 cache 作为缓存,用来减少底层数据库的压力,但是在 阅读全文
posted @ 2021-11-27 22:39 failymao 阅读(382) 评论(1) 推荐(2) 编辑
摘要: 一.设计原理 Go 语言中最常见的、也是经常被人提及的设计模式就是: "不要通过共享内存来通信,我们应该使用通信来共享内存" 通过共享内存来通信是直接读取内存的数据,而通过通信来共享内存,是通过发送消息的方式来进行同步。 而通过发送消息来同步的这种方式常见的就是 Go 采用的通信顺序进程 CSP(C 阅读全文
posted @ 2021-11-23 00:30 failymao 阅读(1003) 评论(0) 推荐(0) 编辑
摘要: 一. 序言 1.1 场景一 现在有一个 Server 服务在执行,当请求来的时候我们启动一个 goroutine 去处理,然后在这个 goroutine 当中有对下游服务的 rpc 调用,也会去请求数据库获取一些数据,这时候如果下游依赖的服务比较慢,但是又没挂,只是很慢,可能一次调用要 1min 才 阅读全文
posted @ 2021-11-17 01:03 failymao 阅读(373) 评论(0) 推荐(1) 编辑
摘要: 一. 前言 了解 sync.WaitGroup的用法都知道 一个 goroutine 需要等待多个 goroutine 完成和多个 goroutine 等待一个 goroutine 干活时都可以解决问题 WaitGroup 的确是一个很强大的工具,但是使用它相对来说还是有一点小麻烦, 一方面我们需要 阅读全文
posted @ 2021-11-07 23:46 failymao 阅读(563) 评论(0) 推荐(0) 编辑
摘要: 一.序 单从库名大概就能猜出其作用。sync.Once使用起来很简单, 下面是一个简单的使用案例 package main import ( "fmt" "sync" ) func main() { var ( once sync.Once wg sync.WaitGroup ) for i := 阅读全文
posted @ 2021-11-02 23:28 failymao 阅读(282) 评论(2) 推荐(0) 编辑
Fork me on GitHub