8.8. Throttler
概述
throttler 是一个处理器,用于限制传入消息的流率。您可以使用此模式来保护目标端点无法获取过载。在 Apache Camel 中,您可以使用 throttle ()
Java DSL 命令实施 throttler 模式。
Java DSL 示例
要将流率限制为每秒 100 个消息,请按如下所示定义一个路由:
from("seda:a").throttle(100).to("seda:b");
如果需要,您可以使用 timePeriodMillis ()
DSL 命令自定义管理流率的时间段。例如,要将每 30000 毫秒的流率限制为 30000 条信息,请按如下所示定义一个路由:
from("seda:a").throttle(3).timePeriodMillis(30000).to("mock:result");
XML 配置示例
以下示例演示了如何在 XML 中配置上述路由:
<camelContext id="throttleRoute" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="seda:a"/> <!-- throttle 3 messages per 30 sec --> <throttle timePeriodMillis="30000"> <constant>3</constant> <to uri="mock:result"/> </throttle> </route> </camelContext>
在每个时间段内动态更改最大请求
可用的 Camel 2.8 Since 我们使用 Expression,您可以在运行时调整这个值,例如,您可以提供一个带有值的标头。运行时 Camel 评估表达式并将结果转换为 java.lang.Long
类型。在以下示例中,我们使用消息中的标头来确定每个周期的最大请求。如果缺少标头,则 第 8.8 节 “Throttler” 将使用旧值。因此,您只能在值被更改时提供标头:
<camelContext id="throttleRoute" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:expressionHeader"/> <throttle timePeriodMillis="500"> <!-- use a header to determine how many messages to throttle per 0.5 sec --> <header>throttleValue</header> <to uri="mock:result"/> </throttle> </route> </camelContext>
异步延迟
throttler 可以启用 非阻塞异步延迟,这意味着 Apache Camel 计划将来要执行的任务。该任务负责处理路由的后一部分(在节流后)。这允许调用器线程取消阻塞和服务进一步传入的消息。例如:
from("seda:a").throttle(100).asyncDelayed().to("seda:b");
从 Camel 2.17 中,Throttler 将对时间使用滚动窗口,以提供更好的消息流。但是,它将提高节流器的性能。
选项
throttle
DSL 命令支持以下选项:
Name | 默认值 | 描述 |
| 每个节流的最大请求数。必须提供这个选项,并提供一个正数。注意在 XML DSL 中,从 Camel 2.8 开始,使用表达式而不是属性来配置。 | |
|
|
millis 的时间段,throttler 将最多允许消息的 max |
|
| Camel 2.4: 如果启用,则任何消息都会被异步利用调度的线程池进行延迟。 |
|
Camel 2.4: 如果启用了 | |
|
|
Camel 2.4: 如果启用 |