Sample 53: Fail-over Routing Among 3 Endpoints

<definitions xmlns="http://ws.apache.org/ns/synapse"> <sequence name="main" onError="errorHandler"> <in> <send> <endpoint> <failover> <endpoint> <address uri="http://localhost:9001/services/LBService1"> <enableAddressing/> <suspendDurationOnFailure>60</suspendDurationOnFailure> </address> </endpoint> <endpoint> <address uri="http://localhost:9002/services/LBService1"> <enableAddressing/> <suspendDurationOnFailure>60</suspendDurationOnFailure> </address> </endpoint> <endpoint> <address uri="http://localhost:9003/services/LBService1"> <enableAddressing/> <suspendDurationOnFailure>60</suspendDurationOnFailure> </address> </endpoint> </failover> </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 the fail-over routing capabilities of Synapse. In fail-over routing messages are sent to a designated primary endpoint. When the primary endpoint fails, Synapse fails over to the one of the backup endpoints.

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 53 (repository/conf/sample/synapse_sample_53.xml)
    Unix/Linux: sh synapse.sh -sample 53
    Windows: synapse.bat -sample 53

Executing the Client

Above configuration sends messages with the fail-over behavior. Initially the server at port 9001 is treated as primary and other two are treated as backups. Messages are always directed only to the primary server. If the primary server fails, next listed server is selected as the primary. Thus, messages are sent successfully as long as there is at least one active server. To test this, run the loadbalancefailover client to send infinite requests as follows:

ant loadbalancefailover

You can see that all requests are processed by MyServer1. Now shutdown MyServer1 and inspect the console output of the client. You will observe that all subsequent requests are processed by MyServer2. (MyServer 1 was shutdown after request 127)

... [java] Request: 125 ==> Response from server: MyServer1 [java] Request: 126 ==> Response from server: MyServer1 [java] Request: 127 ==> Response from server: MyServer1 [java] Request: 128 ==> Response from server: MyServer2 [java] Request: 129 ==> Response from server: MyServer2 [java] Request: 130 ==> Response from server: MyServer2 ...

You can keep on shutting servers down like this. Client will get a response until you shutdown all listed servers. Once all servers are shutdown, the error sequence is triggered and a fault message is sent to the client as follows.

[java] COULDN'T SEND THE MESSAGE TO THE SERVER.

Once a server is detected as failed, it will be added to the active servers list again after 60 seconds (specified in <suspendDurationOnFailure> in the configuration). Therefore, if you have restarted any of the stopped servers, messages will be directed to the newly started server within 60 seconds.

Back to Catalog