Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Note, org.apache.cxf.clustering.RetryStrategy can be used to retry the same, last address for a limited number of times, before switching to the next address. Use RetryStrategy 'maxNumberOfRetries' property. RetryStrategy currently uses a sequential algorithm for selecting the addresses.

Circuit Breakers Failover

The recent addition to CXF failover features is the implementation based on circuit breakers, more precisely Apache Zest (https://zest.apache.org/) library. The configuration is very similar to the regular failover strategy, the only difference is usage of clustering:circuit-breaker-failover element.

Code Block
xml
xml
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:clustering="http://cxf.apache.org/clustering"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
    
    <util:list id="addressList">
        <value>http://localhost:${testutil.ports.Server.1}/services1</value>
        <value>http://localhost:${testutil.ports.Server.2}/services2</value>
        <value>http://localhost:${testutil.ports.Server.3}/services3</value>
    </util:list>

    <bean id="SequentialAddresses" class="org.apache.cxf.clustering.SequentialStrategy">
        <property name="alternateAddresses">
            <ref bean="addressList"/>
        </property>
        <!-- delay a retry for 1/10 of a second -->
        <property name="delayBetweenRetries" value="100"/>
    </bean>

    <bean id="RandomAddresses" class="org.apache.cxf.clustering.RandomStrategy">
        <property name="alternateAddresses">
            <ref bean="addressList"/>
        </property>
    </bean>

    <!-- other jaxws:client attributes and elements are omitted for brewity -->
    
    <jaxws:client id="clientWithSeqFailoverSupport" address="http://localhost:8080/services">
       <jaxws:features>
           <clustering:failover>
                <clustering:circuit-breaker-failover threshold="1" timeout="60000">
                    <ref bean="SequentialAddresses"/>
                </clustering:strategy>
            </clustering:circuit-breaker-failover>
       </jaxws:features>
    </jaxws:client>

    <!-- other jaxws:client attributes and elements are omitted for brewity -->

    <jaxws:client id="clientWithRandomFailoverSupport" address="http://localhost:8080/initialAddress">
       <jaxws:features>
           <clustering:circuit-breaker-failover threshold="1" timeout="60000">
                <clustering:strategy>
                    <ref bean="RandomAddresses"/>
                </clustering:strategy>
            </clustering:circuit-breaker-failover>
       </jaxws:features>
    </jaxws:client>

</beans>

Circuit breakers have recommended themselves as a proven strategy to handle and monitor the failures related to external service calls, giving the external systems a time to recover by preventing endless retries or time-outing.

Load Distribution

Load Distributor Feature is a Failover feature which can allow the clients to iterate over alternative addresses on every new call, irrespectively of whether the last call has reached its target or not. It can help with the controlling the traffic originating from CXF clients at individual servers.

...