golang的http限流实战
1. golang限流实现
1.1 实现方案
uber 开源库中基于漏桶算法实现了一个限流器。
https://github.com/uber-go/ratelimit滴滴开源实现了一个对http请求的限流器中间件。可以基于以下模式限流。
基于IP,路径,方法,header,授权用户等限流
通过自定义方法限流
还支持基于 http header 设置限流数据
实现方式是基于
github/go/time实现的,不同类别的数据都存储在一个带超时时间的数据池中。代码地址
https://github.com/didip/tollbooth
golang 网络包中还有基于信号量实现的限流器。
https://github.com/golang/net/blob/master/netutil/listen.go也值得我们去学习下。
常见限流算法和golang的令牌桶算法
限流就是通过对并发访问 / 请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。
例如秒杀网站,限制 22 点 5 分 – 22 点 10 分 秒杀 999 份产品, 限制放行 5w 个请求,若在该段时间内,请求在第 5w 以后的请求,直接拒之门外, 也就是我们在进入网站的时候显示,系统繁忙。
时序数据库简介
gitlab提交MR通知飞书的golang代码实现
公司团队是使用gitlab来管理源代码的,一直以来当提交了一个MR后,需要手动在内部IM群里贴出PR链接和摘要,然后@目标同事来帮忙review代码,其实大部分流程是可以自动化的。
golang内存和goroutine泄露的场景
1. 内存泄露
假设
a是一个大slice,而b只引用了一小部分,这就造成了底层数组其他未被引用的部分内存泄漏。1
2
3
4
5func sliceLeak() {
data := make([]byte, 1000000)
slice := data[:10] // 这个切片依然引用整个数组
_ = slice
}因为协程被永久阻塞而造成的永久性内存泄露。
未正确释放文件、数据库连接等资源,导致内存无法释放。
延迟调用函数导致的临时性内存泄露。
全局变量或长生命周期的对象持有大量数据,无法被垃圾回收。
在一些复杂的数据结构中,可能会出现循环引用,导致垃圾回收器无法回收。
使用time.Timer或time.Ticker时,未及时调用Stop方法。
抖音视频无水印下载之telegram robot
分布式ID的snowflake算法
rclone同步各大网盘
使用 Rclone 可以轻松实现备份同步文件到各大网盘,简化了备份方案,也可以用来迁移 2 个不同的网盘程序文件,甚至可以直接挂载网盘到本地用来扩充磁盘食用。
