0

一、需求:

比如我消费1000个队列。我将速度等级分为100个等级。

1倍速,每小时消费800个。
100倍速就是每小时消费 800*100个。

这样就可以计算每个队列的消费间隔,比如1倍速间隔是 4500 毫秒。
100倍速就是 45毫秒。

1倍速要搞这个间隔,没问题。
100倍速,45毫秒,这个就有大问题了。

你想想,分布式系统,如何控制所有服务器间隔45毫秒去消费一个消息?就算可以实现,性能也是大打折扣的。

所以,间隔1秒以下,这种方式就必须淘汰了。

二、解决方案

使用节点的方式。

比如1倍速,使用1个节点去消费,100倍速,使用100个节点去消费。
这就等于1倍速使用1个人帮你干活,100倍速,使用100个人帮你干活。这个貌似是比较符合逻辑的,也比较可行的。

但如何均衡又是一个问题。比如我一台服务器10个nodejs节点去消费。10台就是100个节点去消费。

A任务使用1倍速,B任务使用100倍速,1000个任务,100台服务器呢?怎么去群衡,分配合理的资源去消费?

感觉挺复杂的。

Milu 1.3k
2019-05-29 提问

1 个回答

0

已采纳

我的解决方案:

1、具体思路

根据时间去划分等级估计不行,只能根据资源去划分。如何根据资源划分?那就使用节点的多少。只要能做到100倍速是1倍速的100倍资源就行了。

2、如何实施

使用kubernetes容器技术,将程序分成N个节点去执行任务。比如整个分布式系统划分成1000个节点。那么1倍速,就是N个节点运行任务,100倍速,就是100*N个节点运行任务。

大致思路就是这样。
不过具体的细节估计还有很多东西要解决。
就这样,说干就干。


隔了不久,在某本书上面看到一个东西,叫“限流器”。
啥叫限流器,搜索了一下,就是限制速度的东西。然后搜出一堆论文和文章。原来早有人研究了,我只是不知道这东西叫限流器而已

相关文章:

How to Design a Scalable Rate Limiting Algorithm

API 调用次数限制实现

token bucket


这几天用 lua + redis 实现了一个滑动窗口算法的限流器,代码如下



local hsub_key =  KEYS[1];
local hkey =  KEYS[2];
local max_count =  tonumber(KEYS[3]);

local hval_res = redis.call('hmget', hsub_key, hkey)

local hval = tonumber(hval_res[1]);

local res = true;


if(hval == nil)
then
   hval = 0;
end;

if(hval > max_count or hval == max_count)

then
   res = false;
else
   redis.call('hincrby', hsub_key, hkey, 1)
   res = true;

end


if(hval == 0)
then
   redis.call('expire', hsub_key, 60*5);
end;


return res;

            

因为是分布式,所以必须lua实现才能保证原子操作

推广链接