concurrency packge的代码不多,暂时只有一个 limiter.go。
limiter.go的源码学习
Dapr concurrency package中的 limiter.go 文件的源码学习,rating limiter的代码实现和使用场景。
重点:充分利用 golang chan 的特性
代码实现
Limiter 结构体定义
字段说明:
- limit:最大并发数的限制,这是一个配置项,默认100,初始化后不再修改。
- tickets:用 go 的 chan 来保存和分发 tickets
- numInProgress:当前正在执行中的数量,这是一个实时状态
构建Limiter
Limiter的实现
wait方法
wait方法会阻塞并等待所有的已经通过 execute() 方法拿到票据的 go routine 执行完毕。
使用场景
并行执行批量操作时限速
在 pkg/grpc/api.go
和 pkg/http/api.go
的 GetBulkState()方法中,通过 limiter 来限制批量操作的并发数量:
在 actor 中也有类似的代码: