Kubernetes 调度器队列 - 设计与实现
Kubernetes 调度器 - 核心流程
Kubernetes Networking Model & CNI
Kubernetes 控制器管理总结
Kubernetes CronJob 设计与实现
Kubernetes Job 设计与实现
Kubernetes HPA 设计与实现
Kubernetes Deployment 滚动更新实现原理
Kubernetes GC 设计与实现
Kubernetes Pod 驱逐 - 设计与实现
Kubernetes Daemonset 设计与实现
Kubernetes ReplicaSet 设计与实现
Kubernetes EndPoint 设计与实现
Kubernetes Informer 设计与实现
降本增效之应用优化 (三) 日志存储与检索
Kubernetes Pod 设计与实现 - 创建流程
Kubernetes 探针设计与实现
Unix 编程艺术名句摘录
Kubernetes - CRI 概述
Golang 编译速度为什么这么快?
Kubernetes Pod 设计与实现 - Pause 容器
Kubernetes - kube-proxy 代理模式工程优化
Kubernetes 应用最佳实践 - 优雅关闭长连接
Kubernetes Service 类型和会话亲和性
Kubernetes 为什么需要 Ingress
Kubernetes 架构 - 控制平面和数据平面
降本增效之应用优化 (二) 大报表
Go 语言如何获取 CPU 利用率
降本增效之应用优化 (一) Redis
业务规则引擎演变过程简述
微服务中的熔断算法
熔断机制是微服务调用链路中的的自我保护机制,当链路中某个服务响应时间过长甚至不可用时,会进行服务熔断,快速返回错误响应,停止级联故障,避免雪崩效应。
漏桶算法和令牌桶算法
漏桶算法和令牌桶算法是接口限流设计中常用的两种算法,本文通过 Go 语言中两个常用的开源组件,研究下两种算法的区别和具体代码实现。
jsonparser 为什么比标准库的 encoding/json 快 10 倍 ?
zap 高性能设计与实现
zap 是 Uber 开源的 Go 高性能日志库,性能远超于标准库和其他开源日志库。zap 使用简单,支持多种格式结构化日志、可以设置不同的日志级别,并且能够记录堆栈信息和 …
HTTP Router 算法演进
布谷鸟过滤器
布谷鸟过滤器是一种节省内存空间的概率数据结构,基于布谷鸟哈希算法实现的过滤器,和布隆过滤器一样,用于检测指定元素是否存在于某个集合中,返回结果语义是“元素一定不存在”或“有较大可能存在”。
fastcache 高性能设计与实现
Web 常见的三个安全问题
ants Code Reading
ants 是一个高性能且低损耗的 goroutine 池,组件内部会创建一个固定容量的 goroutine 池,并且管理和回收池中的 goroutine,主要应用场景是允许开发者限制并发程序中的 goroutine 数量,更多的特性 …
布谷鸟过滤器
布谷鸟过滤器是一种节省内存空间的概率数据结构,基于布谷鸟哈希算法实现的过滤器,和布隆过滤器一样,用于检测指定元素是否存在于某个集合中,返回 “元素一定不存在” 或 “有较大可能存在” 两种语义之一。
Go 线程安全 map 方案选型
Go 语言标准库中的 map 数据类型并不是线程安全的,多个 goroutine 可以并发读取同一个 map, 但是不能并发写入同一个 map, 否则会引发 panic, 为了解决这个问题 …
布隆过滤器
布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的,是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
死锁、活锁、饥饿、自旋锁
sync.Pool Code Reading
sync.Pool 是 Go 语言标准库中的一个并发安全的对象池,可以用来缓存那些需要重复创建和销毁的对象,从而避免频繁地进行内存分配和回收,降低内存和 GC 压力。本文通过底层源代码来分析 sync.Pool 高性能背后的设计与实现…
Go 内存管理概述
Go 语言的底层内存分配实现方案参考了 TCMalloc, 通过多级缓存机制、 内存对象大小分类来完成不同的分配策略以提升性能。
Go netpoll Code Reading
goroutine 泄漏与检测
Go 语言内置 GC,因此一般不会内存泄漏,但是 goroutine 可能会发生泄漏,泄漏的 goroutine 引用的内存同样无法被 GC 正常回收 …
time/Timer Code Reading
Go 语言中的计时器常用于定期执行某个操作或者在指定时间内执行某个操作,例如实现超时、周期性执行任务等场景,主要通过标准库的 time 包中的相关方法来实现,如 time.After(), time.Tick() 等。
GMP Scheduler Code Reading
Go 语言中的 GMP 是指用于管理 goroutine 的调度器,其内部使用了一种称为 M:N 的调度模型,其中 M 个用户级 goroutine 被分配到 N 个内核级线程上执行。调度器负责将 goroutine 分配给处理器 P, 并在需要时将 goroutine 从一个处理器 P 转移到另一个处理器 P …
Go channel 的 15 条规则和底层实现
Go 语言中 channel 发送、接收、关闭规则都有哪些?底层又是如何实现的呢?
为什么 Linux “一切皆文件”
在 Linux 中,包括硬件设备、目录、文本文件、二进制文件、输入输出流、套接字、管道、TTY 终端等各种资源都被抽象成文件,并且它们之间没有太大的区别。每个文件都有一个唯一的路径进行标识,因此可以通过文件系统中的路径来访问和管理这些资源 …
context.Context Code Reading
context.Context 类型表示上下文信息,作用是在 API 通信、进程通信、函数调用之间传递超时时间、取消信号和其他数据值。
runtime/HACKING.md
最近阅读标准库源代码时,偶然间发现 runtime 包下面的一个 markdown 文件,大致读了一下,感觉对理解 GMP 调度的基础概念和标准库中的各类注解指令非常有帮助,决定翻译出来,正好提高一下自己的英文水平。
Goland 最佳实践
互联网开发与金庸武学
为什么 Redis 6.0 引入多线程模型?
Kubernetes 应用最佳实践 - 金丝雀发布
容器中如何正确配置 GOMAXPROCS ?
singleflight Code Reading
singleflight 是将 多个请求的返回结果相同 + 计算过程次数限制 这一过程抽象出来,将所有细节隐藏在内部实现中,只提供 GET 和 DELETE 两种类型 API, 简化了调用方法。一个比较常见的场景是使用 singleflight 来限制同一个缓存 key 的重复请求,避免发生 缓存击穿 时,避免请求全部落到数据库,减少性能影响和宕机风险。
sync.Map Code Reading
从内部底层实现来说,sync.Map 通过 entry 类型将 map 的变化和元素的变化进行隔离的同时, 还保证了底层数据的复用 (read map 和 dirty map 指向同一个 entry), read, dirty 2 个字段加原子操作的紧密配合,非常简洁优雅地实现了 sync.Map 根据读写比例动态变化和转换内部字段数据结构, 尤其是 read 和 dirty 两个字段保持…
sync.Cond Code Reading
sync.Cond 不是一个常用的同步机制,在条件变量长时间无法满足时,sync.Cond 能够让出处理器的使用权,和单纯使用 for {} 进行无限等待相比,可以提高 CPU 的利用率。
sync.WaitGroup Code Reading
sync.RWMutex Code Reading
如果一个 goroutine 持有了读锁进行操作,此时其他的 goroutine 可能尝试获取写锁 (参与竞争),那么在读锁被释放之前,不会有其他 goroutine 获取到读锁 (避免竞争写锁的 goroutine 被饿死), 一个 goroutine 在阻塞获取写锁的过程中,会阻止其他 goroutine 获得读锁。
sync.Mutex Code Reading
互斥锁可以在两种模式下操作:正常模式和饥饿模式,正常模式的性能要好很多,因为 goroutine 可以连续多次获得互斥锁,即使存在阻塞的 goroutine, 与此同时,饥饿模式是防止尾部的 goroutine 被饿死的重要机制 (高尾延时)。
sync.Once Code Reading
sync.Once 可以保证某段程序在运行期间的只执行一次,典型的使用场景有初始化配置, 数据库连接等,那么它的内部是如何实现的呢?
Go 无锁编程
锁是一种常见的同步机制,用来解决多个线程同时访问共享资源导致的数据竞争问题。在高并发场景下,锁的使用可能会成为性能瓶颈,因为线程需要频繁地加锁和释放锁,这会增加上下文切换开销并降低程序的吞吐量。
sync/atomic Code Reading
sync/atomic 包提供了原子同步操作原语,整个操作过程无需加锁,也不会产生 goroutine 上下文切换。
goroutine 交替打印奇偶数
使用两个 goroutine 交替并且顺序地打印数字 1…10, 要求其中一个 goroutine 打印奇数,另一个 goroutine 打印偶数。
GODEBUG
GODEBUG 环境变量可以控制程序运行时的调度信息输出,方便开发者了解程序运行内部细节。
Go 并发模式
Go 语言常用的并发模式代码模板,已更新。
Go 汇编
为什么要学习汇编语言?更加接近硬件底层,性能极致优化,可以降维打击所有高级编程语言。
UUID 通用技术选型
分布式唯一 ID 是指在分布式系统中生成的全局唯一标识符。在分布式系统中,由于多个节点同时操作数据可能会导致数据冲突或者重复,因此需要为每个数据对象赋予一个唯一的标识符,以便在系统范围内进行区分。
Kubernetes 应用最佳实践 - 水平自动伸缩
Go 高性能 Tips
阅读 Go 标准库和开源框架代码时,经常会发现这些 Tips 的踪迹。
fasthttp 为什么比标准库 net/http 快 10 倍 ?
技术文章配图指南
为什么技术文章需要配图?一图胜千言。
ChatGPT 初体验
概述 ChatGPT 从 2 月份热度一直持续到现在,并且在接下来的一段时间内,热度还会持续下去。笔者从 3 月初开始慢慢接触,从最初的在 搜索引擎 和 ChatGPT 之间来回切换并验证, 到目前的简单搜索场景 80% 的时间都是直接用 ChatGPT 的,本文总结下这一个月的时间,笔者用到的最多的 4 个功能。
Docker 网络原理概览
Docker 原生网络是基于 Linux 的 网络命名空间(net namespace) 和 虚拟网络设备(veth pair)实现的。当 Docker 进程启动时,会在宿主机上创建一个名称为 docker0 的 虚拟网桥,在该宿主机上启动的 Docker 容器会连接到这个虚拟网桥上 …
iptables 的五表五链
iptables 是一个配置 Linux 内核防火墙的命令行工具,它基于内核的包过滤框架(packet filtering framework) netfilter, 主要用于管理数据包过滤和 NAT 规则。
Kubernetes 应用最佳实践 - 亲和性和污点容忍度
Go 的反射与三大定律
1.反射可以通过 interface{} 得到反射对象; 2.反射可以通过反射对象得到 interface{}; 3.修改反射对象的前提是值必须可以被修改; 反射三大定律背后的实现原理是什么?
Docker 官方提供的最佳实践
Go 语言内置的设计模式
和传统的 GOF, Java, C# 教科书式的设计模式不同,Go 语言设计从一开始就力求简洁,已经有其他编程语言基础的读者在学习和使用 Go 语言时,万万不可按图索骥、生搬硬套,简单的事情复杂化。
HTTP1 到 HTTP3 的工程优化
Kubernetes 应用最佳实践 - Sidecar 模式
Kubernetes 应用最佳实践 - init 容器和钩子函数
为什么 recover 必须在 defer 中调用?
为什么 defer 的执行顺序和注册顺序不同?
Go map 设计与实现
本文从源代码的角度分析 Go map 数据结构使用中的常见问题,例如: 为什么 map 未初始化写入时报错 ? map 是线程安全的吗 ? 为什么遍历 map 是无序的 ? …
Go 切片扩容底层实现
Go 语言中的零拷贝
Go Delve
Delve 用来调试 Go 语言开发的程序,该工具的目标是为 Go 语言提供一个简单、功能齐全的调试工具。
云原生和边缘计算简介
Kubernetes Pod 服务质量等级
Kubernetes 应用最佳实践 - 探针
Kubernetes 应用最佳实践 - 资源请求和限制
CDN 原理
CDN 的基本原理为反向代理,反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器, 并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个节点服务器 …
Kubernetes 应用最佳实践 - 开篇
缓存策略和模式
Go 内存模型
为什么要学习 Go 内存模型? 因为这是理解和掌握 Go 并发编程的基础,也是学习 Go 标准库底层源码实现的前提。
Kubernetes 核心概念
软件版本语义化
字节序概述
DNS 原理
Go pprof 从入门到精通
如何设计一个无状态应用
Go 1.20 发布了
前言 这几天所有的热度都集中到了 ChatGPT,不过我对这件事情没有什么兴趣,原本计划换换脑,看一下 Docker 基础相关技术,恰巧这时 兔兔大佬 发来了灵魂拷问 …
Docker 基础支撑技术概览
Go 逃逸分析
Go 语言的编译器使用逃逸分析决定哪些变量分配在栈上,哪些变量分配在堆上。
Go 数据竞态
数据竞态是并发系统编程中最常见和最难调试的错误类型之一。当两个 goroutine 同时访问同一个变量并且至少有一个是写入操作时,就会发生数据竞态。
异或运算的妙用
Go 如何实现 implements 功能
Go 语言中检测一个类型是否实现了某个接口,通常分为两类机制: 编译期间和运行期间。
Go 的面向对象编程
Go 语言如何实现封装、继承、多态等面向对象的特性?