由于业务需求,要对总流量进行限速,做了一个C++版本的实现,基本满足业务要求。有需要的同学自行进行优化。
a. 按特定的速率向令牌桶投放令牌
b. 当桶中有足够的令牌则报文可以被继续发送下去,同时令牌桶中的令牌量按报文的长度做相应的减少;
c. 当令牌桶中的令牌不足时,报文将不能被发送,只有等到桶中生成了新的令牌,报文才可以发送。这就可以限制报文的流量只能是小于等于令牌生成的速度,达到限制流量的目的。
生产者按特定的速率向令牌桶投放令牌;
消费者查看令牌桶的令牌,令牌充足消费相应数量的令牌,令牌不足丢弃相应报文或请求。
瞬时流量过高可以用限流处理,流量一直过载的话要考虑扩容。
class ClimitSpeed
{
public:
ClimitSpeed(unsigned int speed)
{
m_bExitFlag = false;
m_bStartFlag = false;
m_time = 1000;
m_totalByte = speed;
m_sumByte = 0;
InitializeCriticalSection(&m_rwlock);
}
~ClimitSpeed()
{
m_bExitFlag = true;
DeleteCriticalSection(&m_rwlock);
}
void Start()
{
if (m_bStartFlag)
{
return;
}
m_bStartFlag = true;
_beginthread(threadFeed, 0, this);
}
bool CanConsume()
{
return (m_sumByte > 0);
}
void Consume(unsigned int len)
{
EnterCriticalSection(&m_rwlock);
if (m_sumByte > len)
{
m_sumByte -= len;
}
else
{
m_sumByte = 0;
}
LeaveCriticalSection(&m_rwlock);
}
private:
static void threadFeed(void* arg);
void Feed()
{
EnterCriticalSection(&m_rwlock);
m_sumByte += m_totalByte;
LeaveCriticalSection(&m_rwlock);
}
bool IsStart()
{
return m_bSt