<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.9.2 at 2021-08-01 
 | Rendered using Apache Maven Fluido Skin 1.6
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="Date-Revision-yyyymmdd" content="20210801" />
    <meta http-equiv="Content-Language" content="en" />
    <title>Apache Axis2 &#x2013; Axis2 Clustering Support</title>
    <link rel="stylesheet" href="../css/apache-maven-fluido-1.6.min.css" />
    <link rel="stylesheet" href="../css/site.css" />
    <link rel="stylesheet" href="../css/print.css" media="print" />
      <script type="text/javascript" src="../js/apache-maven-fluido-1.6.min.js"></script>
<meta http-equiv="content-type" content="" />      </head>
    <body class="topBarDisabled">
      <div class="container-fluid">
      <div id="banner">
        <div class="pull-left"><a href="http://www.apache.org/" id="bannerLeft"><img src="http://www.apache.org/images/asf_logo_wide.png"  alt="Apache Axis2"/></a></div>
        <div class="pull-right"><a href=".././" id="bannerRight"><img src="../images/axis.jpg" /></a></div>
        <div class="clear"><hr/></div>
      </div>

      <div id="breadcrumbs">
        <ul class="breadcrumb">
        <li id="publishDate">Last Published: 2021-08-01<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 1.8.0<span class="divider">|</span></li>
        <li class=""><a href="http://www.apache.org" class="externalLink" title="Apache">Apache</a><span class="divider">/</span></li>
      <li class=""><a href="../index.html" title="Axis2/Java">Axis2/Java</a><span class="divider">/</span></li>
    <li class="active ">Axis2 Clustering Support</li>
        </ul>
      </div>
      <div class="row-fluid">
        <div id="leftColumn" class="span2">
          <div class="well sidebar-nav">
<ul class="nav nav-list">
          <li class="nav-header">Axis2/Java</li>
    <li><a href="../index.html" title="Home"><span class="none"></span>Home</a>  </li>
    <li><a href="../download.html" title="Downloads"><span class="none"></span>Downloads</a>  </li>
    <li><a href="javascript:void(0)" title="Release Notes"><span class="icon-chevron-down"></span>Release Notes</a>
      <ul class="nav nav-list">
    <li><a href="../release-notes/1.6.1.html" title="1.6.1"><span class="none"></span>1.6.1</a>  </li>
    <li><a href="../release-notes/1.6.2.html" title="1.6.2"><span class="none"></span>1.6.2</a>  </li>
    <li><a href="../release-notes/1.6.3.html" title="1.6.3"><span class="none"></span>1.6.3</a>  </li>
    <li><a href="../release-notes/1.6.4.html" title="1.6.4"><span class="none"></span>1.6.4</a>  </li>
    <li><a href="../release-notes/1.7.0.html" title="1.7.0"><span class="none"></span>1.7.0</a>  </li>
    <li><a href="../release-notes/1.8.0.html" title="1.8.0"><span class="none"></span>1.8.0</a>  </li>
      </ul>
  </li>
    <li><a href="../modules/index.html" title="Modules"><span class="none"></span>Modules</a>  </li>
    <li><a href="../tools/index.html" title="Tools"><span class="none"></span>Tools</a>  </li>
          <li class="nav-header">Documentation</li>
    <li><a href="../docs/toc.html" title="Table of Contents"><span class="none"></span>Table of Contents</a>  </li>
    <li><a href="../docs/installationguide.html" title="Installation Guide"><span class="none"></span>Installation Guide</a>  </li>
    <li><a href="../docs/quickstartguide.html" title="QuickStart Guide"><span class="none"></span>QuickStart Guide</a>  </li>
    <li><a href="../docs/userguide.html" title="User Guide"><span class="none"></span>User Guide</a>  </li>
    <li><a href="../docs/jaxws-guide.html" title="JAXWS Guide"><span class="none"></span>JAXWS Guide</a>  </li>
    <li><a href="../docs/pojoguide.html" title="POJO Guide"><span class="none"></span>POJO Guide</a>  </li>
    <li><a href="../docs/spring.html" title="Spring Guide"><span class="none"></span>Spring Guide</a>  </li>
    <li><a href="../docs/webadminguide.html" title="Web Administrator's Guide"><span class="none"></span>Web Administrator's Guide</a>  </li>
    <li><a href="../docs/migration.html" title="Migration Guide (from Axis1)"><span class="none"></span>Migration Guide (from Axis1)</a>  </li>
          <li class="nav-header">Resources</li>
    <li><a href="../faq.html" title="FAQ"><span class="none"></span>FAQ</a>  </li>
    <li><a href="../articles.html" title="Articles"><span class="none"></span>Articles</a>  </li>
    <li><a href="http://wiki.apache.org/ws/FrontPage/Axis2/" class="externalLink" title="Wiki"><span class="none"></span>Wiki</a>  </li>
    <li><a href="../refLib.html" title="Reference Library"><span class="none"></span>Reference Library</a>  </li>
    <li><a href="../apidocs/index.html" title="Online Java Docs"><span class="none"></span>Online Java Docs</a>  </li>
          <li class="nav-header">Get Involved</li>
    <li><a href="../overview.html" title="Overview"><span class="none"></span>Overview</a>  </li>
    <li><a href="../git.html" title="Checkout the Source"><span class="none"></span>Checkout the Source</a>  </li>
    <li><a href="../mail-lists.html" title="Mailing Lists"><span class="none"></span>Mailing Lists</a>  </li>
    <li><a href="../release-process.html" title="Release Process"><span class="none"></span>Release Process</a>  </li>
    <li><a href="../guidelines.html" title="Developer Guidelines"><span class="none"></span>Developer Guidelines</a>  </li>
    <li><a href="../siteHowTo.html" title="Build the Site"><span class="none"></span>Build the Site</a>  </li>
          <li class="nav-header">Project Information</li>
    <li><a href="../team-list.html" title="Project Team"><span class="none"></span>Project Team</a>  </li>
    <li><a href="../issue-tracking.html" title="Issue Tracking"><span class="none"></span>Issue Tracking</a>  </li>
    <li><a href="https://github.com/apache/axis-axis2-java-core/java/core/trunk/" class="externalLink" title="Source Code"><span class="none"></span>Source Code</a>  </li>
    <li><a href="../thanks.html" title="Acknowledgements"><span class="none"></span>Acknowledgements</a>  </li>
          <li class="nav-header">Apache</li>
    <li><a href="http://www.apache.org/licenses/LICENSE-2.0.html" class="externalLink" title="License"><span class="none"></span>License</a>  </li>
    <li><a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship"><span class="none"></span>Sponsorship</a>  </li>
    <li><a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks"><span class="none"></span>Thanks</a>  </li>
    <li><a href="http://www.apache.org/security/" class="externalLink" title="Security"><span class="none"></span>Security</a>  </li>
  </ul>
          <hr />
          <div id="poweredBy">
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
  <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="../images/logos/maven-feather.png" /></a>
              </div>
          </div>
        </div>
        <div id="bodyColumn"  class="span10" >
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">




<h1>Axis2 Clustering Support</h1>

<p>Are you interested in improving Scalability and High Availability of your Web Services?</p>

<p>Axis2 1.4 provides experimental clustering support to add <b><i>Scalability, Failover and High Availability</i></b> to your Web Services.
This guide will explain the extent of clustering support and it's the current limitations.
It also highlights the recommended approaches using examples.</p>

<p>Axis2 clustering support can be used in several scenarios.
However it is important to understand the current limitations and the risks/impacts associated with each scenario.
</p>


<section>
<h2><a name="Content"></a>Content</h2>

<ul>

<li><a href="#introduction">Introduction</a></li>

<li><a href="#scalability">Scalability</a></li>

<li><a href="#failover">Failover</a></li>

<li><a href="#ha">High Availability</a></li>

<li><a href="#stateless_webservices">Clustering for Stateless Web Services</a></li>

<li><a href="#stateful_Web_Services">Clustering for Stateful Web Services</a></li>

<li><a href="#config">Configuring Axis2 to add Clustering Support</a></li>


<li><a href="#scalability_stateless_example">Example 1: Scalability and HA with Stateless Web Services</a></li>

<li><a href="#failover_stateful_example">Example 2: Failover for Stateful Web Services</a></li>

<li><a href="#scalability_stateful_example">Example 3: Scalability and HA with Stateful Web Services</a></li>

<li><a href="#summary">Summary</a></li>

<li><a href="#furtherstudy">For Further Study</a></li>
</ul>


<a name="introduction" id="introduction"></a>
<section>
<h2><a name="Introduction"></a>Introduction</h2>

<p>In the context of Axis2 clustering, a node is defined as a separate process with a unique port number where it listens for requests on a given transport . A physical machine can contain more than one node.</p>


<a name="scalability" id="scalability"></a>
<section>
<h2><a name="Scalability"></a>Scalability</h2>

<p>In order to maintain the same level of serviceability (QoS) during an increase in load you need the ability to scale.
Axis2 provides replication support to scale horizontally. That is, you can deploy the same service in more than one node to share the work load, thereby increasing or maintaining the same level of serviceability (throughput etc).</p>


<a name="failover" id="failover"></a>
<section>
<h2><a name="Failover"></a>Failover</h2>

<p>Axis2 provides excellent support for Failover by replicating to backup node(s). 
If you deploy your Stateful Web Services in this mode, you can designate 1-2 backups and replicate state. 
In the event the primary node fails, the clients can switch to one of the backups. 
If you use Synapse with the Failover mediator you can provide transparent Failover.</p>


<a name="ha" id="ha"></a>
<section>
<h2><a name="High_Availability"></a>High Availability</h2>

<p>You can improve the availability of your Web Service by using the following Axis2 functionality. 
</p>
<ul>

<li><b>Failover</b> support will ensure that a client will continued be served, without any interruption due to a node failure.</li>

<li><b>Scalability</b> support will ensure that your services can maintain the same level of serviceability/availability (QoS) in increased load conditions.</li>

<li><b>Hot Deploy</b> feature ensures that you could deploy new services without shutting down your existing services.</li>
</ul>



<a name="stateless_webservices" id="stateless_webservices"></a>
<section>
<h2><a name="Clustering_for_Stateless_Web_Services"></a>Clustering for Stateless Web Services</h2>

<p>This is the simplest use case. 
If your Web Service does not store any state in the context hierarchy then you could deploy your service in &quot;n&quot; number of nodes. To ensure identical configuration for your services, you can load from a central repository using the URLBasedAxisConfigurator. This is not a must, but it makes management of the cluster easy and less error prone.</p>


<p>Since it is stateless no explicit replication is needed. If a node fails any other node in the cluster can take over. You can use a load balancer to direct requests based on a particular algorithm (Ex: Round Robin, Weight based, Affinity based). You can increase the no of nodes to handle scalability (to scale vertically) without worrying about the overhead of replication as the services are stateless</p>


<a name="stateful_webservices" id="stateful_webservices"></a>
<section>
<h2><a name="Clustering_for_Stateful_Web_Services"></a>Clustering for Stateful Web Services</h2>

<p>This is a more complicated use case where your Web Service needs to store state in the context hierarchy. Each Web Service instance (deployed in separate nodes) will need to share state among themselves. Axis2 provides replication to support sharing of state among services.</p>


<p>However, if more than one node tries to update the same state in the context hierarchy, conflicts will arise and the integrity of your data will be compromised. Now your cluster will have inconsistent state. This can be avoided using a locking mechanism. However Axis2 currently does not support it yet.</p>


<p>If this shared state is read more frequently and updated rarely the probability of conflicts decrease. You may use Axis2 in the above use case for Stateful Web Services based on your discretion. However it's important to remember that there can be conflicts.<i><b>If you have frequent writes it is not advisable to use Axis2 until we introduce locking support</b></i></p>


<p>Please note this warning is only applicable to the following use cases.
</p>
<ul>

<li>Your Service is deployed in Application Scope</li>

<li>You store information in the ServiceGroupContext (irrespective of your scope)</li>
</ul>



<p>You may safely use services in &quot;soapsession&quot; scope provided you <i><b>don't modify (or modify at all) state in ServiceGroupContext frequently</b></i>. In soap-session the service context is exclusive to the client who owns the session. Therefore only that client can modify state. A conflict might arise if the same client tries to access the same service in two different nodes simultaneously which happens to modify the same state. However this is rare, but might arise due to an error in the load balancer or the client. If you use Sticky sessions, it will ensure that state will be changed in one node only by directing all requests by the same client to the same node. This is the safest way to use Axis2 clustering support for Stateful Web Services to acheive scalability.
</p>



<a name="config" id="config"></a>
<section>
<h2><a name="Configuring_Axis2_to_add_Clustering_Support"></a>Configuring Axis2 to add Clustering Support</h2>

<p>You need to add the following snippet to your axis2.xml</p>

<div>
<pre>
   &lt;cluster class=&quot;org.apache.axis2.clustering.tribes.TribesClusterManager&quot;&gt;
     &lt;contextManager class=&quot;org.apache.axis2.clustering.context.DefaultContextManager&quot;&gt;
        &lt;listener class=&quot;org.apache.axis2.clustering.context.DefaultContextManagerListener&quot;/&gt;
        &lt;replication&gt;
            &lt;defaults&gt;
                &lt;exclude name=&quot;local_*&quot;/&gt;
                &lt;exclude name=&quot;LOCAL_*&quot;/&gt;
            &lt;/defaults&gt;
            &lt;context class=&quot;org.apache.axis2.context.ConfigurationContext&quot;&gt;
                &lt;exclude name=&quot;SequencePropertyBeanMap&quot;/&gt;
                &lt;exclude name=&quot;NextMsgBeanMap&quot;/&gt;
                &lt;exclude name=&quot;RetransmitterBeanMap&quot;/&gt;
                &lt;exclude name=&quot;StorageMapBeanMap&quot;/&gt;
                &lt;exclude name=&quot;CreateSequenceBeanMap&quot;/&gt;
                &lt;exclude name=&quot;ConfigContextTimeoutInterval&quot;/&gt;
                &lt;exclude name=&quot;ContainerManaged&quot;/&gt;
            &lt;/context&gt;
            &lt;context class=&quot;org.apache.axis2.context.ServiceGroupContext&quot;&gt;
                &lt;exclude name=&quot;my.sandesha.*&quot;/&gt;
            &lt;/context&gt;
            &lt;context class=&quot;org.apache.axis2.context.ServiceContext&quot;&gt;
                &lt;exclude name=&quot;my.sandesha.*&quot;/&gt;
            &lt;/context&gt;
        &lt;/replication&gt;
     &lt;/contextManager&gt;
   &lt;/cluster&gt;
</pre></div>

<p>The exclude tag tells the system to avoid replicating that particular property. This is a useful
feature as you would need to have properties that is node specific only. 
The default config in axis2 will have all properties the axis2 system doesn't want to replicate. Web Service developers can also use this to filter out properties that should be local only.
</p>


<a name="scalability_stateless_example" id="scalability_stateless_example"></a>
<section>
<h2><a name="Example_1:_Scalability_and_HA_with_Stateless_Web_Services"></a>Example 1: Scalability and HA with Stateless Web Services</h2>

<p>The following is a good example for deploying a Stateless Web Service for Scalability and High Availability.
The following service can be deployed in &quot;application&quot; scope in &quot;n&quot; nodes using a central repository. 
Once state is loaded by a particular node it will be shared by other nodes as the config context will replicate the data.
Even if two nodes load the data at the same time, there want be any conflicts as it is the same set of data.
(All nodes should synchronize their clocks using a time server to avoid loading different sets of data)</p>


<p>For the sake of this example we assume replication is cheaper than querying the database.
So once queried it will be replicated to the cluster</p>

<div>
<pre>
/**
 * This Service is responsible for providing the top 5
 * stocks for the day, week or quarter
 */
public class Top5StockService
{
	public String[] getTop5StocksForToday()
	{
		// If cache is null or invalid fetch it from data base
		ConfigurationContext configContext =
            MessageContext.getCurrentMessageContext().getConfigurationContext();
		
		String[]  symbols = (String[])configContext.getProperty(TOP5_TODAY);
		if (!checkValidity(configContext.getProperty(TOP5_TODAY_LOAD_TIME)))
                {
		    symbols = loadFromDatabase(TOP5_TODAY);
                    configContext.setProperty(TOP5_TODAY,symbols);
		    configContext.setProperty(TOP5_TODAY_LOAD_TIME,new java.util.Date()); 	 
                } 
		
		return symbols;
	}
	
	public String[] getTop5StocksForTheWeek()
	{
		 // If cache is null or invalid fetch it from data base
		.............
	}
	
	public String[] getTop5StocksForTheQuarter()
	{
		// If cache is null or invalid fetch it from data base
                ............
	}
}
</pre></div>


<a name="failover_stateful_example" id="failover_stateful_example"></a>
<section>
<h2><a name="Example_2:_Failover_for_Stateful_Web_Services"></a>Example 2: Failover for Stateful Web Services</h2>

<p>The following example demonstrates Failover support by replicating state in a service deployed in &quot;soapsession&quot; scope.
You can deploy the service in 2 nodes. Then point a client to the first node and add a few items to the shopping cart.
Assuming the primary node has crashed, point the client to the backup node. You should be able to checkout the cart with the items you added in the first node.</p>


<div>
<pre>
public class ShoppingCart
{	
	public final static String SHOPPING_CART = &quot;SHOPPING_CART&quot;;
	public final static String DISCOUNT = &quot;DISCOUNT&quot;;
	
	public void createSession()
	{
		List&lt;Item&gt; cart = new ArrayList&lt;Item&gt;();
		ServiceContext serviceContext =
            MessageContext.getCurrentMessageContext().getServiceContext();
		serviceContext.setProperty(SHOPPING_CART, cart);
	}
	
	public void addItem(Item item)
	{
		ServiceContext serviceContext =
            MessageContext.getCurrentMessageContext().getServiceContext();
		List&lt;Item&gt; cart = (List&lt;Item&gt;)serviceContext.getProperty(SHOPPING_CART);
		cart.add(item);
	}
	
	public void removeItem(Item item)
	{
		ServiceContext serviceContext =
            MessageContext.getCurrentMessageContext().getServiceContext();
		List&lt;Item&gt; cart = (List&lt;Item&gt;)serviceContext.getProperty(SHOPPING_CART);
		cart.remove(item);
	}
	
	public double checkout()
	{
		ServiceContext serviceContext =
            MessageContext.getCurrentMessageContext().getServiceContext();
		List&lt;Item&gt; cart = (List&lt;Item&gt;)serviceContext.getProperty(SHOPPING_CART);
		
		double discount = (Double)serviceContext.getServiceGroupContext().getProperty(DISCOUNT);
		
		double total = 0;
		for (Item i : cart)
		{
			total = total + i.getPrice();
		}
		
		total = total - total * (discount/100);
		
		return total;
	}	
}
</pre></div>


<a name="scalability_stateful_example" id="scalability_stateful_example"></a>
<section>
<h2><a name="Example3:_Scalability_and_HA_with_Stateful_Web_Services"></a>Example3: Scalability and HA with Stateful Web Services</h2>

<p>You can deploy the the above Shopping Cart service in several active nodes (with a backup(s) for each node). 
You only replicate to your backup nodes for Failover. The load balancer should ensure sticky sessions. 
 The strategy is to partition your load between the active nodes to achieve scalability and replication to the backups to achieve Failover. These in turn will increase the high availability of your services. Since the above example doesn't use Service Group Context to write any state there want be any conflicts.</p>


<p>For the sake of this example we assume that all read only properties for the Service Group Context is loaded at initialization
 <b><i>Please note this is the recommended approach for Stateful Web Services due to the current limitations</i></b>
</p>


<a name="summary" id="summary"></a>
<section>
<h2><a name="Summary"></a>Summary</h2>

<p>Apache Axis2 provides experimental support for clustering to improve the following properties of your Web Services.
</p>
<ul>

<li>Scalability</li>

<li>Failover</li>

<li>High Availability</li>
</ul>
It is important to understand the current limitations when leveraging clustering support.



<a name="furtherstudy" id="furtherstudy"></a>
<section>
<h2><a name="For_Further_Study"></a>For Further Study</h2>

<p><a href="../index.html">Apache Axis2</a></p>

<p><a href="Axis2ArchitectureGuide.html">Axis2 Architecture</a></p>

<p>Introduction to Apache Axis2-<a class="externalLink" href="http://www.redhat.com/magazine/021jul06/features/apache_axis2/">http://www.redhat.com/magazine/021jul06/features/apache_axis2/</a></p>

</html>
        </div>
      </div>
    </div>
    <hr/>
    <footer>
      <div class="container-fluid">
        <div class="row-fluid">
            <p>Copyright &copy;2004&#x2013;2021
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.</p>
        </div>
        </div>
    </footer>
    </body>
</html>
