ESB上的负载平衡

时间:2014-04-05 08:59:31

标签: mule load-balancing biztalk soa esb

我有一个任务,我应该测试所选ESB的负载平衡功能。建议使用MS BizTalk,但我更喜欢跨平台的东西,比如MuleESB。

我面临以下问题:我有4个服务(让我们称之为S1,S2,S3,S4)和3个主机(H1,H2,H3)。我想在这样的主机上运行服务:

H1: S1, S2
H2: S2, S3
H3: S3, S4

并将它们连接到ESB。

我想做的是拥有ESB提供的一些公开的虚拟服务S2,它可以平衡H1和H2上的负载,以及H2和H3上S3的类似内容。

判断THIS ESB并不完全以其强大的负载平衡功能而着称,而且应该使用外部NLB解决方案,硬件或软件。 ESB(无论是BizTalk还是开放源代码)能否在这种情况下处理负载均衡?如果是,我将如何继续创建该特定案例?

3 个答案:

答案 0 :(得分:2)

当然,BizTalk可以处理这种情况,负载均衡发生在可以发挥有意义作用的两点。

为清楚起见,'服务'在这里确实有两个含义。

  1. 服务接口(如网络端点,无论是真正的Web服务,HTTP侦听器,自定义API等等都无关紧要。)
  2. 对传入数据进行实际处理的服务(如转换,验证,业务逻辑等)。
  3. 1由各种Windows组件处理,如NLB(网络负载平衡),其中传入请求分布在多个IP上。

    通过在不同的计算机上创建多个BizTalk实例,使用BizTalk处理

    2。然后,这些实例会自动在它们之间共享工作。

答案 1 :(得分:1)

我认为你总结一下这里的帮助“ESB并不完全以其强大的负载平衡能力而着称”。 NLB具有强大的负载分配算法(包括实例健康检查)。

Mule没有这样的功能OOTB所以你最终必须编写自己的代码,如果你想建立一个完整的平衡器,这可能是乏味的。如果你减少功能(没有健康检查,随机负载分配),那么,当然,你可以使用一个非常简单的HTTP桥。

答案 2 :(得分:1)

我同意David,负载均衡的全功能企业解决方案http / https服务将使用硬件(即cisco ace或f5)平衡器或更便宜的软件解决方案,如apache httpd和mod_proxy_balancer。

使用Mule ESB,您可以像这样进行循环负载平衡的简单实现(没有粘性会话等):

<flow name="22878770_load-balancing-on-esbFlow1" doc:name="22878770_load-balancing-on-esbFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" method="GET"/>
<scripting:component doc:name="Script">
    <scripting:script engine="Groovy">
        def rand = new java.util.Random()
        int max = 10
        return rand.nextInt(max+1)
    </scripting:script>
</scripting:component>
<choice doc:name="Choice">
    <when expression="#[payload&lt;=3]">
        <http:outbound-endpoint exchange-pattern="request-response" host="yandex.com" port="80" method="GET" followRedirects="true" doc:name="HTTP1"/>
    </when>
    <when expression="#[payload&lt;=6]">
        <http:outbound-endpoint exchange-pattern="request-response" host="google.com" port="80" method="GET" followRedirects="true" doc:name="HTTP2"/>
    </when>
    <otherwise>
        <http:outbound-endpoint exchange-pattern="request-response" host="baidu.com" port="80" method="GET"  followRedirects="true" doc:name="HTTP3"/>
    </otherwise>
</choice>
</flow>