8.10. Load Balancer
概述 复制链接链接已复制到粘贴板!
通过 负载均衡器 模式,您可以使用各种不同的负载平衡策略将消息处理委派给多个端点之一。
Java DSL 示例 复制链接链接已复制到粘贴板!
以下路由使用 round robin 负载均衡策略在目标端点 mock:x
、Mock:y
,mock:z
间分发传入的消息:
from("direct:start").loadBalance().roundRobin().to("mock:x", "mock:y", "mock:z");
from("direct:start").loadBalance().roundRobin().to("mock:x", "mock:y", "mock:z");
XML 配置示例 复制链接链接已复制到粘贴板!
以下示例演示了如何在 XML 中配置相同的路由:
负载均衡策略 复制链接链接已复制到粘贴板!
Apache Camel 负载均衡器支持以下负载平衡策略:
round robin 复制链接链接已复制到粘贴板!
轮循负载平衡策略周期通过所有目标端点进行循环,将每个传入的消息发送到周期中的下一个端点。例如,如果目标端点列表是 mock:x
,mock:y
,mock:z
,mock:z
,则传入的消息会发送到以下端点序列: mock:x
, mock:z ,mock:x
,
,mock:y
mock:z
, 等。
您可以在 Java DSL 中指定循环负载平衡策略,如下所示:
from("direct:start").loadBalance().roundRobin().to("mock:x", "mock:y", "mock:z");
from("direct:start").loadBalance().roundRobin().to("mock:x", "mock:y", "mock:z");
另外,您可以在 XML 中配置相同的路由,如下所示:
随机 复制链接链接已复制到粘贴板!
随机负载平衡策略从指定的列表中选择目标端点。
您可以在 Java DSL 中指定随机负载平衡策略,如下所示:
from("direct:start").loadBalance().random().to("mock:x", "mock:y", "mock:z");
from("direct:start").loadBalance().random().to("mock:x", "mock:y", "mock:z");
另外,您可以在 XML 中配置相同的路由,如下所示:
Sticky 复制链接链接已复制到粘贴板!
粘性负载平衡策略将 In 消息定向到通过计算指定表达式的哈希值来选择的端点。此负载平衡策略的优点在于,相同值的表达式始终发送到同一服务器。例如,通过从包含用户名的标头计算哈希值,您可以确保来自特定用户的消息始终发送到同一目标端点。另一种有用的方法是指定一个表达式,从传入消息中提取会话 ID。这样可确保属于同一会话的所有消息都发送到同一目标端点。
您可以在 Java DSL 中指定粘性负载平衡策略,如下所示:
from("direct:start").loadBalance().sticky(header("username")).to("mock:x", "mock:y", "mock:z");
from("direct:start").loadBalance().sticky(header("username")).to("mock:x", "mock:y", "mock:z");
另外,您可以在 XML 中配置相同的路由,如下所示:
当您将 sticky 选项添加到故障转移负载均衡器时,负载均衡器会从最后一个已知的良好端点开始。
Topic 复制链接链接已复制到粘贴板!
主题负载平衡策略将每个消息的副本发送到所有列出的目标端点(有效将消息广播到所有目的地,如 JMS 主题)。
您可以使用 Java DSL 指定主题负载平衡策略,如下所示:
from("direct:start").loadBalance().topic().to("mock:x", "mock:y", "mock:z");
from("direct:start").loadBalance().topic().to("mock:x", "mock:y", "mock:z");
另外,您可以在 XML 中配置相同的路由,如下所示:
故障切换 复制链接链接已复制到粘贴板!
从 Apache Camel 2.0 开始,当 Exchange 在处理过程中 异常
时,故障转移
负载均衡器能够尝试下一个处理器。您可以使用触发 故障转移
的特定异常列表配置故障切换。如果没有指定任何例外,则由任何例外触发故障转移。故障转移负载均衡器使用与 onException
例外匹配相同的策略。
如果使用 streaming,您应该在使用故障转移负载均衡器时启用 流缓存。这是必要的,因此当故障转移时可以重新读取流。
故障转移
负载均衡器支持以下选项:
选项 | 类型 | 默认值 | 描述 |
|
|
|
Camel 2.3: 指定是否使用路由中配置的
例如, |
|
|
|
Camel 2.3: 指定到新端点的最大尝试次数。值 |
|
|
|
Camel 2.3: 指定 |
以下示例配置为故障转移,只有在抛出 IOException
异常时:
您可以选择指定多个例外来故障切换,如下所示:
您可以在 XML 中配置相同的路由,如下所示:
以下示例演示了如何以 round robin 模式进行故障转移:
您可以在 XML 中配置相同的路由,如下所示:
如果要尽快切换到下一个端点,您可以通过配置
来禁用 inheritErrorHandler。通过禁用 Error Handler,您可以确保它不会干预。这允许故障转移负载均衡器尽快处理故障转移。如果您也启用了 inheritErrorHandler
=falseroundRobin
模式,则它会重试,直到成功为止。然后,您可以将 maximumFailoverAttempts
选项配置为高的值,使其最终耗尽并失败。
加权循环和随机加权 复制链接链接已复制到粘贴板!
在许多企业环境中,因为无法处理能力的服务器节点是托管服务的,通常最好根据单个服务器处理容量分发负载。加权循环 算法或 加权随机 算法可用于解决这个问题。
加权负载平衡策略允许您为与其它服务器相关的 每台服务器指定处理负载均衡比率。您可以将这个值指定为每个服务器的正处理权重。较大的数字表示服务器可以处理更大的负载。处理权重用于确定与他人相关的每个处理端点的有效负载分布比率。
下表中描述了可以使用的参数:
选项 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
|
|
round-robin 的默认值为 |
|
|
|
|
以下 Java DSL 示例演示了如何定义加权循环路由和加权的随机路由:
您可以在 XML 中配置循环路由,如下所示:
自定义 Load Balancer 复制链接链接已复制到粘贴板!
您还可以使用自定义负载均衡器(如您自己的实现)。
使用 Java DSL 的示例:
from("direct:start") // using our custom load balancer .loadBalance(new MyLoadBalancer()) .to("mock:x", "mock:y", "mock:z");
from("direct:start")
// using our custom load balancer
.loadBalance(new MyLoadBalancer())
.to("mock:x", "mock:y", "mock:z");
使用 XML DSL 的同一示例:
请注意,在上面的 XML DSL 中,我们使用 <custom>,它仅在 Camel 2.8 以后提供。在旧版本中,您必须按如下方式进行:
要实现自定义负载均衡器,您可以扩展一些支持类,如 LoadBalancerSupport
和 SimpleLoadBalancerSupport
。前者支持异步路由引擎,后者则不支持。下面是一个示例:
断路器 复制链接链接已复制到粘贴板!
Circuit Breaker 负载均衡器是一个有状态模式,用于监控某些例外的所有调用。最初,Circuit Breaker 处于 closed 状态,并传递所有消息。如果失败且达到阈值,它会进入 open 状态,并拒绝所有调用,直到达到 半OpenAfter
超时为止。超时后,如果存在新的调用,则 Circuit Breaker 会传递所有消息。如果结果成功,Circuit Breaker 会进入关闭状态(如果不是),它会重新变为打开状态。
Java DSL 示例:
from("direct:start").loadBalance() .circuitBreaker(2, 1000L, MyCustomException.class) .to("mock:result");
from("direct:start").loadBalance()
.circuitBreaker(2, 1000L, MyCustomException.class)
.to("mock:result");
Spring XML 示例: