Author: stefanegli
Date: Wed May 22 11:39:14 2013
New Revision: 1485160
URL: http://svn.apache.org/r1485160
Log:
SLING-2827 : added discovery.api and .impl[s] documentation
Added:
sling/site/trunk/content/documentation/bundles/discovery-api-and-impl.mdtext
Modified:
sling/site/trunk/content/documentation/bundles.mdtext
Modified: sling/site/trunk/content/documentation/bundles.mdtext
URL:
http://svn.apache.org/viewvc/sling/site/trunk/content/documentation/bundles.mdtext?rev=1485160&r1=1485159&r2=1485160&view=diff
==============================================================================
--- sling/site/trunk/content/documentation/bundles.mdtext (original)
+++ sling/site/trunk/content/documentation/bundles.mdtext Wed May 22 11:39:14
2013
@@ -30,3 +30,4 @@ Title: Bundles
* [Sling Health Check Tool]({{ refs.sling-health-check-tool.path }})
* [Scheduler Service (commons scheduler)]({{
refs.scheduler-service-commons-scheduler.path }})
* [Web Console Extensions (org.apache.sling.extensions.webconsolebranding,
org.apache.sling.extensions.webconsolesecurityprovider)]({{
refs.web-console-extensions.path }})
+* [Discovery API and Resource Based Implementation (discovery.api,
discovery.impl)]({{ refs.discovery-api-and-impl.path }})
Added:
sling/site/trunk/content/documentation/bundles/discovery-api-and-impl.mdtext
URL:
http://svn.apache.org/viewvc/sling/site/trunk/content/documentation/bundles/discovery-api-and-impl.mdtext?rev=1485160&view=auto
==============================================================================
---
sling/site/trunk/content/documentation/bundles/discovery-api-and-impl.mdtext
(added)
+++
sling/site/trunk/content/documentation/bundles/discovery-api-and-impl.mdtext
Wed May 22 11:39:14 2013
@@ -0,0 +1,152 @@
+Title: Discovery API and its Implementations
+
+In many situations a particular Sling-based deployment consists of more than
one Sling-instances:
+typically a number of instances would form a `cluster` that share a common
repository -
+in other situations, or additionally, instances might be loosely-coupled, each
with their own repository.
+
+The `discovery-api` bundle introduces an abstraction for such scenarios called
`topology`. It provides
+access to the current topology, allows to be informed of any changes in the
topology (such as joining or leaving
+instances) and contains a simple property exchange mechanism, e.g. to allow
building communication services on top of it.
+
+## Topology
+
+The topology - or more precisely the `TopologyView` - represents a snapshot
(`view`) of a number of loosely-coupled Sling instances (`InstanceDescription`)
+and clusters (`ClusterView`) of a particular deployment. A cluster can consist
of one or more instances. Each instance
+is always automatically part to a cluster (even if the cluster only consists
of one instance).
+Each instance and cluster has an identifier.
+Other than this cluster-instance relation there is no further
+assumption made on the structure of a topology. Therefore if the actual
structure is of a different shape (such as a tree)
+this would have to be managed separately.
+
+## Cluster Leader and Instance Ordering
+
+The discovery API introduces support for a `cluster leader`: within each
cluster, the API guarantees that one and only one
+instance is leader at any time. That leader is guaranteed to be `stable`, ie
as long as it stays alive and is visible
+by other instances of the same cluster, it will stay leader. As soon as it
leaves the cluster (or the corresponding
+implementation bundle is deactivated), another instance in that cluster is
elected leader. The leader can be used to
+deal with work that must be guaranteed to only execute on one (but any)
instance in the cluster.
+
+Additionally each cluster (`ClusterView`) orders its instances in a stable
list: each newly joined instances is added
+at the end of the list and retains its order in the list as long as it doesn't
leave the cluster. This can be used
+to distribute "singleton" work amongst the cluster to more than just the
leader.
+
+## Topology Changes
+
+The `DiscoveryService` provides access to the currently valid `TopologyView`.
Additionally applications can
+register a `TopologyEventListener` and thus be informed about any changes in
the topology. Whenever the discovery
+service detects that an instance is no longer reponding or has newly joined,
or a new leader has been elected,
+it sends a `TOPOLOGY_CHANGING` event, starts
+settling the change within the topology (ie making sure everybody else in the
topology agrees on the change) and finally
+sends a `TOPOLOGY_CHANGED` event with the new topology.
+Additionally, when "only" properties have changed, a `PROPERTIES_CHANGED`
event is sent.
+
+Note that the detection of topology (or properties) changes will incur a delay
which is implementation dependent.
+
+The following is an example of a listener - note that the binding is done
automatically by OSGi:
+
+ import org.apache.felix.scr.annotations.Component;
+ import org.apache.felix.scr.annotations.Service;
+ import org.apache.sling.discovery.TopologyEvent;
+ import org.apache.sling.discovery.TopologyEventListener;
+
+ @Component(immediate = true)
+ @Service(value = { TopologyEventListener.class })
+ public class MyTopologyEventListener implements TopologyEventListener {
+
+ public void handleTopologyEvent(final TopologyEvent event) {
+ // your code here
+ }
+
+ }
+
+
+## Properties
+
+The discovery API not only lists all clusters and instances that are part of a
topology but also provides a simple
+mechanism for announcing properties of each instance to the topology. This can
be achieved via the `PropertyProvider`.
+Typical use cases for this are announcements of endpoint-URLs or ports such
that applications can communicate to other
+instances in the topology.
+
+Note that the properties mechanism is by no means to be used as a messaging
tool: both from an API point of view and
+the implementation of it are not optimized for frequent changes and its use
for messaging is discouraged. Instead
+it should be used to announce configuration information for accessing proper
messaging services.
+
+The following is an example of a PropertyProvider, providing `sample.value1`
and `sample.value2` properties:
+
+ import org.apache.felix.scr.annotations.Component;
+ import org.apache.felix.scr.annotations.Service;
+ import org.apache.sling.discovery.PropertyProvider;
+
+ @Service(value = { PropertyProvider.class })
+ @Properties({ @Property(name = PropertyProvider.PROPERTY_PROPERTIES,
value = {
+ "sample.value1", "sample.value2" }) })
+ public class SamplePropertyProvider implements PropertyProvider {
+
+ public String getProperty(final String name) {
+ if ("sample.value1".equals(name)) {
+ return "foo";
+ } else if ("sample.value2".equals(name)) {
+ return "bar";
+ } else {
+ return null;
+ }
+ }
+ }
+
+## Deployment, Configuration
+
+The discovery API makes no assumptions as to how the instances and clusters
discovery each other. This is entirely
+up to the implementations. Some might choose to automatic discovery within a
local LAN using IP multicast, some
+might choose to explicit configuration with a central service etc.
+
+## discovery.impl: Resource-based, OOTB Implementation
+
+The `discovery.impl` is a resource-based, out of the box implementation using
standard Sling. The discovery within
+a cluster is done by writing heartbeat information into the (common)
repository. The establishment of a clusterview
+is done by analyzing these heartbeats, initiating a voting within the cluster
(such that each instance can agree
+that it sees the same number of instances) and by concluding the voting by
promoting it as the new "established" view.
+
+### Location in Repository
+
+Administrative note: All the information about the topology is stored at the
following location in the repository:
+
+ /var/discovery/impl
+
+### Connectors
+
+The announcement "cross-cluster" is done via HTTP(s) heartbeats between
(arbitrary) cluster instances. These HTTP-heartbeats
+(internally termed `connectors`) must be configured [here][1].
+
+### WebConsole
+
+There is a Felix-based WebConsole that provides a (read-only) overview of the
topology.
+It can be found here: [http://localhost:4502/system/console/topology][2].
+
+### Configuration
+
+The following properties can be configured ([here][1]):
+
+ * heartbeatInterval: the time in seconds between two heartbeats (both
cluster-internal and for HTTP-connectors). Default
+ value is 15 seconds.
+
+ * heartbeatTimeout: the time in seconds after which an instance is considered
dead if no heartbeat was sent since. Default
+ value is 20 seconds.
+
+ * topologyConnectorUrls: a list of connector URLs to which this instance
should connect to. The list can contain multiple
+ instances of the same cluster (for fallback configurations). If the list is
empty, no connector will be created.
+ The default relative URL is /libs/sling/topology/connector. Note that this
URL is accessible without authentication -
+ to avoid having to configure administrative username/passwords in all
instances. Instead, a whitelist approach is used
+ (see next item).
+
+ * topologyConnectorWhitelist: As mentioned above, the path
/libs/sling/topology/connector does not require authentication.
+ To assure that only trusted instances can connect to the topology, its
hostname or IP address must be in a whitelist.
+ By default this whitelist only contains localhost and 127.0.0.1.
+
+ * minEventDelay: To reduce the number of events sent during changes, there is
a delay (in seconds) before the event is sent.
+ If additional changes happen during this delay, the change will be combined
in one event.
+
+ * leaderElectionRepositoryDescriptor: this is an advanced parameter. It
denotes a repository descriptor that is evaluated
+ and taken into account for leader Election: the corresponding value of the
descriptor is sorted by first.
+
+ [1]:
http://localhost:4502/system/console/configMgr/org.apache.sling.discovery.impl.Config
+ [2]: http://localhost:4502/system/console/topology
\ No newline at end of file