如何实现分布式限速器?

Dhr*_*aya 14 distributed-computing rate-limiting guava apache-zookeeper apache-curator

比方说,我让P进程在N台物理机上运行一些业务逻辑.例如,这些进程调用了一些Web服务S. 我想确保所有P进程组合的每秒服务S的调用不超过10次.

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

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

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

谢谢!

小智 7

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


Jos*_*llo 3

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

Limitd 是限制的“服务器”。这些限制是使用令牌桶算法实现的。

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

buckets:
  "request to service a":
     per_minute: 10
  "request to service b":
     per_minute: 5
Run Code Online (Sandbox Code Playgroud)

该服务作为监听 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');
  }
});
Run Code Online (Sandbox Code Playgroud)

我们目前正在使用它来限制速率并消除某些应用程序事件的抖动。

服务器已开启:

https://github.com/auth0/limitd

我们计划开发多个 SDK,但目前我们只有 node.js 和部分实现的 go:

https://github.com/limitd