camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Camel > Load Balancer
Date Tue, 09 Mar 2010 07:19:00 GMT
<html>
<head>
    <base href="http://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/1519/1/1/_/styles/combined.css?spaceKey=CAMEL&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background-color: white" bgcolor="white">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
     <h2><a href="http://cwiki.apache.org/confluence/display/CAMEL/Load+Balancer">Load
Balancer</a></h2>
     <h4>Page <b>edited</b> by             <a href="http://cwiki.apache.org/confluence/display/~davsclaus">Claus
Ibsen</a>
    </h4>
     
          <br/>
     <div class="notificationGreySide">
         <h3><a name="LoadBalancer-LoadBalancer"></a>Load Balancer</h3>

<p>The Load Balancer Pattern allows you to delegate to one of a number of endpoints
using a variety of different load balancing policies.</p>

<h3><a name="LoadBalancer-Buildinloadbalancingpolicies"></a>Build in load
balancing policies</h3>

<p>Camel has out of the box the following policies:</p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Policy </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/loadbalancer/RoundRobinLoadBalancer.html"
rel="nofollow">Round Robin</a> </td>
<td class='confluenceTd'> The exchanges is selected in a round robin fashion. This is
a well known and classic policy. This spreads the load even. </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/loadbalancer/RandomLoadBalancer.html"
rel="nofollow">Random</a> </td>
<td class='confluenceTd'> A random endpoint is selected for each exchange </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/loadbalancer/StickyLoadBalancer.html"
rel="nofollow">Sticky</a> </td>
<td class='confluenceTd'> Sticky load balancing using an Expression to calculate a correlation
key to perform the sticky load balancing; rather like jsessionid in the web or JMSXGroupID
in JMS. </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/loadbalancer/TopicLoadBalancer.html"
rel="nofollow">Topic</a> </td>
<td class='confluenceTd'> Topic which sends to all destinations (rather like JMS Topics)
</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/processor/loadbalancer/FailOverLoadBalancer.html"
rel="nofollow">Failover</a> </td>
<td class='confluenceTd'> <b>Camel 2.0:</b> In case of failures the exchange
is tried on the next endpoint. </td>
</tr>
</tbody></table>

<h3><a name="LoadBalancer-RoundRobin"></a>Round Robin</h3>
<p><b>Using the <a href="/confluence/display/CAMEL/Fluent+Builders" title="Fluent
Builders">Fluent Builders</a></b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">from(<span class="code-quote">"direct:start"</span>).loadBalance().
roundRobin().to(<span class="code-quote">"mock:x"</span>, <span class="code-quote">"mock:y"</span>,
<span class="code-quote">"mock:z"</span>);
</pre>
</div></div>

<p><b>Using the Spring configuration</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
&lt;bean id = <span class="code-quote">"roundRobinRef"</span> class=<span
class="code-quote">"org.apache.camel.processor.loadbalancer.RoundRobinLoadBalancer"</span>
/&gt;
  &lt;camelContext id=<span class="code-quote">"camel"</span> xmlns=<span
class="code-quote">"http:<span class="code-comment">//camel.apache.org/schema/spring"</span>&gt;
</span>    &lt;route&gt;
      &lt;from uri=<span class="code-quote">"direct:start"</span>/&gt;
      &lt;loadBalance ref=<span class="code-quote">"roundRobinRef"</span>&gt;
          &lt;to uri=<span class="code-quote">"mock:x"</span>/&gt;   
    
          &lt;to uri=<span class="code-quote">"mock:y"</span>/&gt;   
   
          &lt;to uri=<span class="code-quote">"mock:z"</span>/&gt;   
      
      &lt;/loadBalance&gt;
    &lt;/route&gt;
  &lt;/camelContext&gt;
</pre>
</div></div>

<p>or</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
&lt;camelContext id=<span class="code-quote">"camel"</span> xmlns=<span
class="code-quote">"http:<span class="code-comment">//camel.apache.org/schema/spring"</span>&gt;
</span>  &lt;route&gt;
    &lt;from uri=<span class="code-quote">"direct:start"</span>/&gt;
    &lt;loadBalance&gt;        
        &lt;roundRobin/&gt;  &lt;!-- This only support <span class="code-keyword">for</span>
Camel 1.5 --&gt;
        &lt;to uri=<span class="code-quote">"mock:x"</span>/&gt;     
  
        &lt;to uri=<span class="code-quote">"mock:y"</span>/&gt;     
 
        &lt;to uri=<span class="code-quote">"mock:z"</span>/&gt;     
           
    &lt;/loadBalance&gt;
  &lt;/route&gt;
&lt;/camelContext&gt;
</pre>
</div></div>

<p>So the above example will load balance requests from <b>direct:start</b>
to one of the available <b>mock endpoint</b> instances, in this case using a round
robbin policy.<br/>
For further examples of this pattern in use you could look at the <a href="http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/LoadBalanceTest.java?view=markup"
rel="nofollow">junit test case</a></p>

<h3><a name="LoadBalancer-Failover"></a>Failover</h3>
<p><b>Available as of Camel 2.0</b><br/>
The <tt>failover</tt> load balancer is capable of trying the next processor in
case an <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a>
failed with an <tt>exception</tt> during processing.<br/>
You can configure the <tt>failover</tt> with a list of specific exception to only
failover. If you do not specify any exceptions it will failover over any exceptions. It uses
the same strategy for matching exceptions as the <a href="/confluence/display/CAMEL/Exception+Clause"
title="Exception Clause">Exception Clause</a> does for the <b>onException</b>.</p>

<p>The current implement of failover load balancer is a simple logic which <b>always</b>
tries the first endpoint, and in case of an exception being thrown it tries the next in the
list, and so forth. It has no state, and the next message will thus <b>always</b>
start with the first endpoint.</p>

<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td
valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16"
align="absmiddle" alt="" border="0"></td><td><b>Redelivery must be enabled</b><br
/><p>The failover load balancer requires you have enabled Camel <a href="/confluence/display/CAMEL/Error+Handler"
title="Error Handler">Error Handler</a> to use redelivery. By default Camel does
<b>not</b> do this.</p></td></tr></table></div>

<p>Here is a sample to failover only if a <tt>IOException</tt> related exception
was thrown:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">from(<span class="code-quote">"direct:start"</span>)
    <span class="code-comment">// here we will load balance <span class="code-keyword">if</span>
IOException was thrown
</span>    <span class="code-comment">// any other kind of exception will result
in the Exchange as failed
</span>    <span class="code-comment">// to failover over any kind of exception
we can just omit the exception
</span>    <span class="code-comment">// in the failOver DSL
</span>    .loadBalance().failover(IOException.class)
        .to(<span class="code-quote">"direct:x"</span>, <span class="code-quote">"direct:y"</span>,
<span class="code-quote">"direct:z"</span>);
</pre>
</div></div> 

<p>You can specify multiple exceptions to failover as the option is varargs, for instance:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
<span class="code-comment">// enable redelivery so failover can react
</span>errorHandler(defaultErrorHandler().maximumRedeliveries(5));

from(<span class="code-quote">"direct:foo"</span>).
    loadBalance().failover(IOException.class, MyOtherException.class)
        .to(<span class="code-quote">"direct:a"</span>, <span class="code-quote">"direct:b"</span>);
</pre>
</div></div>

<h4><a name="LoadBalancer-UsingfailoverinSpringDSL"></a>Using failover in
Spring DSL</h4>
<p>Failover can also be used from Spring DSL and you configure it as:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
   <span class="code-tag">&lt;route errorHandlerRef=<span class="code-quote">"myErrorHandler"</span>&gt;</span>
      <span class="code-tag">&lt;from uri=<span class="code-quote">"direct:foo"</span>/&gt;</span>
      <span class="code-tag">&lt;loadBalance&gt;</span>
          <span class="code-tag">&lt;failover&gt;</span>
              <span class="code-tag">&lt;exception&gt;</span>java.io.IOException<span
class="code-tag">&lt;/exception&gt;</span>
              <span class="code-tag">&lt;exception&gt;</span>com.mycompany.MyOtherException<span
class="code-tag">&lt;/exception&gt;</span>
          <span class="code-tag">&lt;/failover&gt;</span>
          <span class="code-tag">&lt;to uri=<span class="code-quote">"direct:a"</span>/&gt;</span>
          <span class="code-tag">&lt;to uri=<span class="code-quote">"direct:b"</span>/&gt;</span>
      <span class="code-tag">&lt;/loadBalance&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
</pre>
</div></div>

<h4><a name="LoadBalancer-UsingThisPattern"></a>Using This Pattern</h4>

<p>If you would like to use this EIP Pattern then please read the <a href="/confluence/display/CAMEL/Getting+Started"
title="Getting Started">Getting Started</a>, you may also find the <a href="/confluence/display/CAMEL/Architecture"
title="Architecture">Architecture</a> useful particularly the description of <a
href="/confluence/display/CAMEL/Endpoint" title="Endpoint">Endpoint</a> and <a
href="/confluence/display/CAMEL/URIs" title="URIs">URIs</a>. Then you could try out
some of the <a href="/confluence/display/CAMEL/Examples" title="Examples">Examples</a>
first before trying this pattern out.</p>
     </div>
     <div id="commentsSection" class="wiki-content pageSection">
       <div style="float: right;">
            <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action"
class="grey">Change Notification Preferences</a>
       </div>

       <a href="http://cwiki.apache.org/confluence/display/CAMEL/Load+Balancer">View
Online</a>
       |
       <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=81397&revisedVersion=17&originalVersion=16">View
Change</a>
              |
       <a href="http://cwiki.apache.org/confluence/display/CAMEL/Load+Balancer?showComments=true&amp;showCommentArea=true#addcomment">Add
Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message