Sample 54: Session Affinity Load Balancing Between 3 Endpoints
<definitions xmlns="http://ws.apache.org/ns/synapse">
<sequence name="main" onError="errorHandler">
<in>
<send>
<endpoint>
<!-- specify the session as the simple client session provided by Synapse for
testing purpose -->
<session type="simpleClientSession"/>
<loadbalance>
<endpoint>
<address uri="http://localhost:9001/services/LBService1">
<enableAddressing/>
</address>
</endpoint>
<endpoint>
<address uri="http://localhost:9002/services/LBService1">
<enableAddressing/>
</address>
</endpoint>
<endpoint>
<address uri="http://localhost:9003/services/LBService1">
<enableAddressing/>
</address>
</endpoint>
</loadbalance>
</endpoint>
</send>
<drop/>
</in>
<out>
<!-- Send the messages where they have been sent (i.e. implicit To EPR) -->
<send/>
</out>
</sequence>
<sequence name="errorHandler">
<makefault response="true">
<code xmlns:tns="http://www.w3.org/2003/05/soap-envelope" value="tns:Receiver"/>
<reason value="COULDN'T SEND THE MESSAGE TO THE SERVER."/>
</makefault>
<send/>
</sequence>
</definitions>
Objective
Showcase the ability of Synapse to act as a session aware load balancer with
simple client sessions
Pre-requisites
-
Deploy the LoadbalanceFailoverService in the sample Axis2 server (go to
samples/axis2Server/src/LoadbalanceFailoverService and run 'ant')
-
Start 3 instances of the Axis2 server on different ports as follows
./axis2server.sh -http 9001 -https 9005 -name MyServer1
./axis2server.sh -http 9002 -https 9006 -name MyServer2
./axis2server.sh -http 9003 -https 9007 -name MyServer3
-
Start Synapse using the configuration numbered 54 (repository/conf/sample/synapse_sample_54.xml)
Unix/Linux: sh synapse.sh -sample 54
Windows: synapse.bat -sample 54
Executing the Client
Above configuration is same as the load balancing configuration in
sample 52, except that the session type is specified
as 'simpleClientSession'. This is a client initiated session, which means that
the client generates the session identifier and sends it with each request. In
this sample, client adds a SOAP header named ClientID containing the identifier
of the client. Synapse binds this ID with a server on the first request and sends
all successive requests containing that ID to the same server. Now switch to
samples/axis2Client directory and run the client using the following command to
check this in action.
ant loadbalancefailover -Dmode=session
In the session mode, client continuously sends requests with three different
client (session) IDs. One ID is selected among these three IDs for each request
randomly. Then client prints the session ID with the responded server for each
request. Client output for the first 10 requests are shown below.
[java] Request: 1 Session number: 1 Response from server: MyServer3
[java] Request: 2 Session number: 2 Response from server: MyServer2
[java] Request: 3 Session number: 0 Response from server: MyServer1
[java] Request: 4 Session number: 2 Response from server: MyServer2
[java] Request: 5 Session number: 1 Response from server: MyServer3
[java] Request: 6 Session number: 2 Response from server: MyServer2
[java] Request: 7 Session number: 2 Response from server: MyServer2
[java] Request: 8 Session number: 1 Response from server: MyServer3
[java] Request: 9 Session number: 0 Response from server: MyServer1
[java] Request: 10 Session number: 0 Response from server: MyServer1
...
You can see that session ID 0 is always directed to the server named MyServer1.
That means session ID 0 is bound to MyServer1. Similarly session 1 and 2 are bound
to MyServer3 and MyServer2 respectively.
Back to Catalog