如何实现分布式限速器?

时间:2015-07-19 09:53:33

标签: guava distributed-computing apache-zookeeper rate-limiting apache-curator

让我们说,我让P进程在N台物理机上运行一些业务逻辑。例如,这些进程调用了一些Web服务S.我想确保所有P个进程合并后每秒对服务S进行多次X调用。

如何实施这样的解决方案?

Google Guava的速率限制器适用于在单机上运行的进程,但不适用于分布式设置。

JAVA有哪些标准的,随时可用的解决方案? [可能基于zookeeper]

谢谢!

3 个答案:

答案 0 :(得分:4)

Bucket4j是" token-bucket"的java实现。速率限制算法。它适用于本地和分布式(在JCache之上)。对于分布式用例,您可以自由选择任何JCache实现,如Hazelcast或Apache Ignite。请参阅群集中使用Bucket4j的this example

答案 1 :(得分:3)

我一直致力于解决这类问题的开源解决方案。

限制是"服务器"限制。限制是使用Token Bucket Algorithm实现的。

基本上,您可以在服务配置中定义限制,如下所示:

buckets:
  "request to service a":
     per_minute: 10
  "request to service b":
     per_minute: 5

该服务作为监听TCP / IP端口的守护程序运行。

然后你的应用程序按照以下方式做了一些事情:

var limitd = new Limitd('limitd://my-limitd-address');

limitd.take('request to service a', 'app1' 1, function (err, result) {
  if (result.conformant) {
    console.log('everything is okay - this should be allowed');
  } else {
    console.error('too many calls to this thing');
  }
});

我们目前正在使用此功能进行速率限制并对一些应用程序事件进行去抖动。

服务器已开启:

https://github.com/auth0/limitd

我们计划开发几个SDK但是现在我们只有node.js并部分实现了go:

https://github.com/limitd

答案 2 :(得分:0)

https://github.com/jdwyah/ratelimit-java提供应该执行此操作的分布式速率限制。您可以将限制配置为S /秒/分钟等,并选择封盖下的漏桶的爆破尺寸/重新填充率。