## Apache Synapse

## Sample 55: Session Affinity Load Balancing Between Fail-over 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> <failover> <endpoint> <address uri="http://localhost:9001/services/LBService1"> <enableAddressing/> </address> </endpoint> <endpoint> <address uri="http://localhost:9002/services/LBService1"> <enableAddressing/> </address> </endpoint> </failover> </endpoint> <endpoint> <failover> <endpoint> <address uri="http://localhost:9003/services/LBService1"> <enableAddressing/> </address> </endpoint> <endpoint> <address uri="http://localhost:9004/services/LBService1"> <enableAddressing/> </address> </endpoint> </failover> </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

Demonstrate session aware load balancing in conjunction with fail-over routing.

### Pre-requisites

- Deploy the LoadbalanceFailoverService in the sample Axis2 server (go to samples/axis2Server/src/LoadbalanceFailoverService and run 'ant')
- Start 4 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
  ./axis2server.sh -http 9004 -https 9008 -name MyServer4
- Start Synapse using the configuration numbered 55 (repository/conf/sample/synapse_sample_55.xml)
  Unix/Linux: sh synapse.sh -sample 55
  Windows: synapse.bat -sample 55

### Executing the Client

This configuration also uses 'simpleClientSession' to bind session ID values to servers as in sample 54. But fail-over endpoints are specified as the child endpoints of the load balance endpoint. Therefore sessions are bound to the fail-over endpoints. Session information has to be replicated among the servers listed under each failover endpoint using some clustering mechanism. Therefore, if one endpoint bound to a session failed, successive requets for that session will be directed to the next endpoint in that failover group. Run the client using the following command to observe this behaviour.

ant loadbalancefailover -Dmode=session

You can see a client output as shown below.

... [java] Request: 222 Session number: 0 Response from server: MyServer1 [java] Request: 223 Session number: 0 Response from server: MyServer1 [java] Request: 224 Session number: 1 Response from server: MyServer1 [java] Request: 225 Session number: 2 Response from server: MyServer3 [java] Request: 226 Session number: 0 Response from server: MyServer1 [java] Request: 227 Session number: 1 Response from server: MyServer1 [java] Request: 228 Session number: 2 Response from server: MyServer3 [java] Request: 229 Session number: 1 Response from server: MyServer1 [java] Request: 230 Session number: 1 Response from server: MyServer1 [java] Request: 231 Session number: 2 Response from server: MyServer3 ...

Note that session 0 is always directed to MyServer1 and session 2 is directed to MyServer3. No requests are directed to MyServer2 and MyServer4 as they are kept as backups by fail-over endpoints. Now shutdown the server named MyServer1 while running the sample. You will observe that all successive requests for session 0 is now directed to MyServer2, which is the backup server for MyServer1's group. This is shown below, where MyServer1 was shutdown after the request 534.

... [java] Request: 529 Session number: 2 Response from server: MyServer3 [java] Request: 530 Session number: 1 Response from server: MyServer1 [java] Request: 531 Session number: 0 Response from server: MyServer1 [java] Request: 532 Session number: 1 Response from server: MyServer1 [java] Request: 533 Session number: 1 Response from server: MyServer1 [java] Request: 534 Session number: 1 Response from server: MyServer1 [java] Request: 535 Session number: 0 Response from server: MyServer2 [java] Request: 536 Session number: 0 Response from server: MyServer2 [java] Request: 537 Session number: 0 Response from server: MyServer2 [java] Request: 538 Session number: 2 Response from server: MyServer3 [java] Request: 539 Session number: 0 Response from server: MyServer2 ...

Back to Catalog