You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/09/28 13:34:02 UTC
[3/3] camel git commit: Add clustering doc
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 <lb...@gmail.com>
Authored: Thu Sep 28 14:34:10 2017 +0200
Committer: lburgazzoli <lb...@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) ...");
+ }
+ };
+}
+----
+