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