如何构建一个推荐的线程安全频率限制器?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2912个文字,预计阅读时间需要12分钟。
很久以前,在学习使用Python的deque容器时,我撰写了一篇名为《Python3 deque双端队列创建与使用方法分析》的文章。近期,需要测试线上服务的性能,但又不愿意总是在QA那边排队,于是决定自己写一个性能测试脚本。
很早以前,在学习使用 Python 的deque容器时,我写了一篇文章python3 deque 双向队列创建与使用方法分析。最近需要压测线上服务的性能,又不愿意总是在 QA 那边排队,于是需要自己写一个压测用的客户端。其中一个核心需求就是要实现 QPS 限制。
于是,终究逃不开要在 C++ 中实现一个线程安全的频率限制器。
设计思路
所谓频率限制,就是要在一个时间段(inteval)中,限制操作的次数(limit)。这又可以引出两种强弱不同的表述:
- 强表述:在任意一个长度等于设定的时间段(interval)的滑动窗口中,频率限制器放行的操作次数(count)都不高于限制次数(limit)。
- 弱表述:在一组长度等于设定的时间段(interval)且紧密相连的固定窗口中,每一个窗口里频率限制器放行的操作次数(count)都不高于限制次数(limit)。
不难发现,强表述通过「滑动窗口」的方式,不仅限制了频率,还要求了操作在时间上的均匀性。前作的频率限制器,实际上对应了这里的强表述。但实际工程中,我们通常只需要实现弱表述的频率限制器就足够使用了。
对于弱表述,实现起来主要思路如下:
当操作计数(count)小于限制(limit)时直接放行;
单线程实现
在不考虑线程安全时,不难给出这样的实现。
本文共计2912个文字,预计阅读时间需要12分钟。
很久以前,在学习使用Python的deque容器时,我撰写了一篇名为《Python3 deque双端队列创建与使用方法分析》的文章。近期,需要测试线上服务的性能,但又不愿意总是在QA那边排队,于是决定自己写一个性能测试脚本。
很早以前,在学习使用 Python 的deque容器时,我写了一篇文章python3 deque 双向队列创建与使用方法分析。最近需要压测线上服务的性能,又不愿意总是在 QA 那边排队,于是需要自己写一个压测用的客户端。其中一个核心需求就是要实现 QPS 限制。
于是,终究逃不开要在 C++ 中实现一个线程安全的频率限制器。
设计思路
所谓频率限制,就是要在一个时间段(inteval)中,限制操作的次数(limit)。这又可以引出两种强弱不同的表述:
- 强表述:在任意一个长度等于设定的时间段(interval)的滑动窗口中,频率限制器放行的操作次数(count)都不高于限制次数(limit)。
- 弱表述:在一组长度等于设定的时间段(interval)且紧密相连的固定窗口中,每一个窗口里频率限制器放行的操作次数(count)都不高于限制次数(limit)。
不难发现,强表述通过「滑动窗口」的方式,不仅限制了频率,还要求了操作在时间上的均匀性。前作的频率限制器,实际上对应了这里的强表述。但实际工程中,我们通常只需要实现弱表述的频率限制器就足够使用了。
对于弱表述,实现起来主要思路如下:
当操作计数(count)小于限制(limit)时直接放行;
单线程实现
在不考虑线程安全时,不难给出这样的实现。

