Add clustering doc

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7f82f94b
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7f82f94b
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7f82f94b

Branch: refs/heads/master
Commit: 7f82f94b6186ff8aaf6067b0a96eefef520ce742
Parents: e5e18f3
Author: lburgazzoli <lburgazz...@gmail.com>
Authored: Thu Sep 28 14:34:10 2017 +0200
Committer: lburgazzoli <lburgazz...@gmail.com>
Committed: Thu Sep 28 15:33:19 2017 +0200

----------------------------------------------------------------------
 camel-core/src/main/docs/clustering.adoc | 201 ++++++++++++++++++++++++++
 1 file changed, 201 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/7f82f94b/camel-core/src/main/docs/clustering.adoc
----------------------------------------------------------------------
diff --git a/camel-core/src/main/docs/clustering.adoc 
b/camel-core/src/main/docs/clustering.adoc
new file mode 100644
index 0000000..327ca38
--- /dev/null
+++ b/camel-core/src/main/docs/clustering.adoc
@@ -0,0 +1,201 @@
+[[Clustering-Clustering]]
+== Clustering
+
+*Available as of Camel 2.20*
+
+[WARNING]
+====
+*Experimental feature*
+====
+
+In Camel 2.20 we have introduced the following cluster related SPI:
+
+- *Cluster Service*
++
+A regular Camel service that manages cluster resources such as _views_ (see 
below)
+
+- *Cluster View*
++
+Represent a view of the cluster with its own set of isolated resources. As 
today views provide supports for:
++
+    * Leader Election
+    * Topology events like members joining/leaving the clutser)
+
+
+- *Cluster Member*
++
+Represent a member of the clutser.
+
+
+=== Cluster SPI Set-Up
+
+A _Cluster Service_ is just like any other camel service so set it up you only 
need to register your implementations to the camel context:
+
+[source,java]
+----
+
+MyClusterServiceImpl service = new MyClusterServiceImpl();
+
+context.addService(service);
+----
+
+The configuration of the _Cluster Service_ depends on the implementation you 
have choosed.
+Out of the box camel provides the following implementations:
+
+[cols="1,1,2", options="header"]
+|====
+|Type       |Module           | Class
+|atomix     |camel-atomix     | 
org.apache.camel.component.atomix.ha.AtomixClusterService
+|consul     |camel-consul     | 
org.apache.camel.component.consul.ha.ConsulClusterService
+|file       |camel-core       | 
org.apache.camel.component.file.ha.FileLockClusterService
+|kubernetes |camel-kubernetes | 
org.apache.camel.component.kubernetes.ha.KubernetesClusterService
+|zookeeper  |camel-zookeeper  | 
org.apache.camel.component.zookeeper.ha.ZooKeeperClusterService
+|====
+
+On Spring/Bluepring all the _Cluster Service_ instances are automatically 
added to the camel context.
+
+Configuration examples:
+
+- *Spring Boot*
++
+[source,properties]
+----
+camel.component.file.cluster.service.enabled = true
+camel.component.file.cluster.service.id = ${random.uuid}
+camel.component.file.cluster.service.root = ${java.io.tmpdir}
+----
+
+
+- *Spring XML*
++
+[source,xml]
+----
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans";
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="
+         http://www.springframework.org/schema/beans
+         http://www.springframework.org/schema/beans/spring-beans.xsd
+         http://camel.apache.org/schema/spring
+         http://camel.apache.org/schema/spring/camel-spring.xsd";>
+
+
+  <bean id="zx" 
class="org.apache.camel.component.zookeeper.ha.ZooKeeperClusterService">
+    <property name="id" value="node-1"/>
+    <property name="basePath" value="/camel/ha"/>
+    <property name="nodes" value="localhost:2181"/>
+  </bean>
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring"; 
autoStartup="false">
+    ...
+  </camelContext>
+
+</beans>
+----
+
+=== Cluster SPI Usage
+
+The _Cluster SPI_ is leveraged by the folowing new implementations:
+
+- *ClusteredRoutePolicy*
++
+This is an implementation of a RoutePolicy that starts the routes it is 
associated to when the Cluster View it uses takes the leadership
++
+[source,java]
+----
+context.addRoutes(new RouteBuilder {
+    @Override
+    public void configure() throws Exception {
+        // Create the route policy
+        RoutePolicy policy = ClusteredRoutePolicy.forNamespace("my-ns");
+
+        // bind the policy to one or more routes
+        from("timer:clustered?delay=1s&period=1s")
+            .routePolicy(policy)
+            .log("Route ${routeId} is running ...");
+    }
+});
+----
++
+To apply the same policy to all the rooutes a dedicated  _RoutePolicyFactory_ 
can be used:
++
+[source,java]
+----
+// add the clustered route policy factory to context
+context.addRoutePolicyFactory(ClusteredRoutePolicyFactory.forNamespace("my-ns"));
+
+context.addRoutes(new RouteBuilder {
+    @Override
+    public void configure() throws Exception {
+        // bind the policy to one or more routes
+        from("timer:clustered?delay=1s&period=1s")
+            .log("Route ${routeId} is running ...");
+    }
+});
+----
+
+- *ClusteredRouteController*
++
+This is an implementation of the _RouteController SPI_ that lets the camel 
context start then starts/stops the routes when the leadership is taken/lost. 
This is well integrated with spring-boot apps so assuming you have tour routes 
set-up like:
++
+[source,java]
+----
+@Bean
+public RouteBuilder routeBuilder() {
+    return new RouteBuilder() {
+        @Override
+        public void configure() throws Exception {
+            from("timer:heartbeat?period=10s")
+                .routeId("heartbeat")
+                .log("HeartBeat route (timer) ...");
+            from("timer:clustered?period=5s")
+                .routeId("clustered")
+                .log("Clustered route (timer) ...");
+        }
+    };
+}
+----
++
+You can then leverage spring-boot configuration to make them clustered:
++
+[source,properties]
+----
+# enable the route controller
+camel.clustered.controller.enabled = true
+
+# define the default namespace for routes
+camel.clustered.controller.namespace = my-ns
+
+# exlude the route with id 'heartbeat' from the clustered ones
+camel.clustered.controller.routes[heartbeat].clustered = false
+----
+
+- *Master Component*
++
+The master component is similar to a _ClusteredRoutePolicy_ but it works on 
consumer level so it ensure the only a single endpoint in a cluster is 
consuming resources at any point in time. Set it up is very easy and all you 
need is to prefix singleton endpoints according to the master component syntax:
++
+[source]
+----
+master:namespace:delegateUri
+----
++
+A concrete example:
++
+[source,java]
+----
+@Bean
+public RouteBuilder routeBuilder() {
+    return new RouteBuilder() {
+        @Override
+        public void configure() throws Exception {
+            from("timer:heartbeat?period=10s")
+                .routeId("heartbeat")
+                .log("HeartBeat route (timer) ...");
+            from("master:my-ns:timer:clustered?period=5s")
+                .routeId("clustered")
+                .log("Clustered route (timer) ...");
+        }
+    };
+}
+----
+

Reply via email to