【问题标题】:rate control in javajava中的速率控制
【发布时间】:2011-09-08 14:46:42
【问题描述】:

我正在寻找一个好的解决方案,或者可能是一个 API 来解决以下问题:

  • 我的应用程序循环执行一项任务,例如它发送电子邮件等。我需要将平均消息速率限制为例如每秒 100 条消息或每最后一分钟 1000 条消息...

不,我正在寻找能够完成这项任务的算法或 API。

【问题讨论】:

  • 这是为了避免在 SpamBots 中引发警报吗?

标签: java performance rate


【解决方案1】:

您可以使用ScheduledExecutorService 来安排给定时间段内的任务。

例如,要每秒安排 100 个任务,您可以这样说:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(nThreads);
scheduler.scheduleAtFixedRate(mailSender, 0, 10, TimeUnit.MILLISECONDS);

显然,您需要跟踪执行了多少任务并在作业完成后关闭调度程序。

【讨论】:

  • 或者在无事可做的情况下让计划任务不做任何事情。这样可以避免重复取消和添加。
【解决方案2】:

Token bucket algorithm 非常容易实现和使用,但功能非常强大。您可以在运行时控制吞吐量并将一些请求排队以处理 peek。

【讨论】:

    【解决方案3】:

    我能想到的最简单的方法是延迟发送每封电子邮件的时间,具体取决于等待的邮件数量。

    final ScheduledThreadPoolExecutor service = new ScheduledThreadPoolExecutor(1);
    int ratePerSecond = ...
    
    public static void execute(Runnable run) {
       int delay = 1000 * service.getQueue().size() / ratePerSecond;
       service.schedule(run, delay, TimeUnit.MILLISECONDS);
    }
    

    这将确保任务仅在速率允许的情况下尽可能靠近地执行。

    【讨论】:

    • 我认为足够简单以便您可以轻松理解其工作原理很重要。有更复杂的解决方案,但您可能不需要它们。
    • 不错——简洁优雅!
    【解决方案4】:

    Guava 有一个 RateLimiter 类可以做到这一点。

    【讨论】:

    • 修复死链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多