Author: fhanik
Date: Wed Apr 26 11:59:29 2006
New Revision: 397270

URL: http://svn.apache.org/viewcvs?rev=397270&view=rev
Log:
Started Tribes documentation

Added:
    tomcat/container/tc5.5.x/modules/groupcom/VERSION
    tomcat/container/tc5.5.x/modules/groupcom/doc/
    tomcat/container/tc5.5.x/modules/groupcom/doc/faq.xml
    tomcat/container/tc5.5.x/modules/groupcom/doc/introduction.xml
    tomcat/container/tc5.5.x/modules/groupcom/doc/project.xml
    tomcat/container/tc5.5.x/modules/groupcom/doc/setup.xml
Modified:
    
tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/ChannelException.java
    tomcat/container/tc5.5.x/modules/groupcom/to-do.txt

Added: tomcat/container/tc5.5.x/modules/groupcom/VERSION
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/VERSION?rev=397270&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/VERSION (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/VERSION Wed Apr 26 11:59:29 2006
@@ -0,0 +1 @@
+0.9.1

Added: tomcat/container/tc5.5.x/modules/groupcom/doc/faq.xml
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/doc/faq.xml?rev=397270&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/doc/faq.xml (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/doc/faq.xml Wed Apr 26 11:59:29 
2006
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE document [
+  <!ENTITY project SYSTEM "project.xml">
+]>
+<document url="introduction.html">
+
+    &project;
+
+    <properties>
+        <author email="[EMAIL PROTECTED]">Filip Hanik</author>
+        <title>Apache Tribes - Frequently Asked Questions</title>
+    </properties>
+
+<body>
+
+
+<section name="Frequently Asked Questions">
+</section>
+</body>
+
+</document>

Added: tomcat/container/tc5.5.x/modules/groupcom/doc/introduction.xml
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/doc/introduction.xml?rev=397270&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/doc/introduction.xml (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/doc/introduction.xml Wed Apr 26 
11:59:29 2006
@@ -0,0 +1,321 @@
+<?xml version="1.0"?>
+<!DOCTYPE document [
+  <!ENTITY project SYSTEM "project.xml">
+]>
+<document url="introduction.html">
+
+    &project;
+
+    <properties>
+        <author email="[EMAIL PROTECTED]">Filip Hanik</author>
+        <title>Apache Tribes - Introduction</title>
+    </properties>
+
+<body>
+
+
+<section name="Quick Start">
+
+  <p>Apache Tribes is a group or peer-to-peer communcation framework that 
enables you to easily connect
+     your remote objects to communicate with each other.
+  </p>
+  <ul>
+    <li>Import: <code>org.apache.catalina.tribes.Channel</code></li>
+    <li>Import: <code>org.apache.catalina.tribes.Member</code></li>
+    <li>Import: <code>org.apache.catalina.tribes.MembershipListener</code></li>
+    <li>Import: <code>org.apache.catalina.tribes.ChannelListener</code></li>
+    <li>Import: <code>org.apache.catalina.tribes.group.GroupChannel</code></li>
+    <li>Create a class that implements: 
<code>org.apache.catalina.tribes.ChannelListener</code></li>
+    <li>Create a class that implements: 
<code>org.apache.catalina.tribes.MembershipListener</code></li>
+    <li>Simple class to demonstrate how to send a message:
+      <source>
+        //create a channel
+        Channel myChannel = new GroupChannel();
+        
+        //create my listeners
+        MyMessageListener msgListener = new MyMessageListener();
+        MyMemberListener mbrListener = new MyMemberListener();
+        
+        //attach the listeners to the channel
+        myChannel.addMembershipListener(mbrListener);
+        myChannel.addChannelListener(msgListener);
+        
+        //start the channel
+        myChannel.start(Channel.DEFAULT);
+        
+        //create a message to be sent, message must implement 
java.io.Serializable
+        //for performance reasons you probably want them to implement 
java.io.Externalizable
+        Serializable myMsg = new MyMessage();
+
+        //retrieve my current members
+        Member[] group = myChannel.getMembers();
+        
+        //send the message
+        channel.send(group,myMsg,Channel.SEND_OPTIONS_DEFAULT);
+      </source>
+    </li>
+  </ul>
+  <p>
+      Simple yeah? There is a lot more to Tribes than we have shown, hopefully 
the docs will be able 
+      to explain more to you. Remember, that we are always interested in 
suggestions, improvements, bug fixes 
+      and anything that you think would help this project.
+  </p>
+  <p>
+      Note: Tribes is currently built for JDK1.5, you can run on JDK1.4 by a 
small modifications to locks used from the <code>java.util.concurrent</code> 
package.
+  </p>
+</section>
+
+
+<section name="What is Tribes">
+  <p>
+    Tribes is a messaging framework with group communication abilities. Tribes 
allows you to send and receive
+    messages over a network, it also allows for dynamic discovery of other 
nodes in the network.<br/>
+    And that is the short story, it really is as simple as that. What makes 
Tribes useful and unique will be 
+    described in the section below.<br/>
+  </p>
+  <p>
+    The Tribes module was started early 2006 and a small part of the code base 
comes from the clustering module 
+    that has been existing since 2003 or 2004. 
+    The current cluster implementation has several short comings and many work 
arounds were created due 
+    to the complexity in group communication. Long story short, what should 
have been two modules a long time
+    ago, will be now. Tribes takes out the complexity of messaging from the 
replication module and becomes 
+    a fully independent and highly flexible group communication module.<br/>
+  </p>
+  <p>
+    In Tomcat the old <code>modules/cluster</code> has now become 
<code>modules/groupcom</code>(Tribes) and
+    <code>modules/ha</code> (replication). This will allow development to 
proceed and let the developers 
+    focus on the issues they are actually working on rather than getting 
boggled down in details of a module
+    they are not interested in. The understanding is that both communication 
and replication are complex enough,
+    and when trying to develop them in the same module, well you know, it 
becomes a cluster :)<br/>
+  </p>
+  <p>
+    Tribes allows for guaranteed messaging, and can be customized in many 
ways. Why is this important?<br/>
+    Well, you as a developer want to know that the messages you are sending 
are reaching their destination.
+    More than that, if a message doesn't reach its destination, the 
application on top of Tribes will be notified
+    that the message was never sent, and what node it failed. 
+  </p>
+  
+</section>
+
+<section name="Why another messaging framework">
+  <p>
+    I am a big fan of reusing code and would never dream of developing 
something if someone else has already 
+    done it and it was available to me and the community I try to serve.<br/>
+    When I did my research to improve the clustering module I was constantly 
faced with a few obstacles:<br/>
+    1. The framework wasn't flexible enough<br/>
+    2. The framework was licensed in a way that neither I nor the community 
could use it<br/>
+    3. Several features that I needed were missing<br/>
+    4. Messaging was guaranteed, but no feedback was reported to me<br/>
+    5. The semantics of my message delivery had to be configured runtime<br/>
+    And the list continues...
+  </p>
+  <p>
+    So I came up with Tribes, to address these issues and other issues that 
came along. 
+    When designing Tribes I wanted to make sure I didn't lose any of the 
flexibility and 
+    delivery semantics that the existing frameworks already delivered. The 
goal was to create a framework
+    that could do everything that the others already did, but to provide more 
flexibility for the application
+    developer. In the next section will give you the high level overview of 
what features tribes offers or will offer.
+  </p>
+</section>
+
+<section name="Feature Overview">
+  <p>
+    To give you an idea of the feature set I will list it out here.
+    Some of the features are not yet completed, if that is the case they are 
marked accordingly.
+  </p>
+  <p>
+    <b>Pluggable modules</b><br/>
+    Tribes is built using interfaces. Any of the modules or components that 
are part of Tribes can be swapped out
+    to customize your own Tribes implementation.
+  </p>
+  <p>
+    <b>Guaranteed Messaging</b><br/>
+    In the default implementation of Tribes uses TCP for messaging. TCP 
already has guaranteed message delivery
+    and flow control built in. I believe that the performance of Java TCP, 
will outperform an implementation of
+    Java/UDP/flow-control/message guarantee since the logic happens further 
down the stack.<br/>
+    Tribes supports both non-blocking and blocking IO operations. The 
recommended setting is to use non blocking
+    as it promotes better parallelism when sending and receiving messages. The 
blocking implementation is available
+    for those platforms where NIO is still a trouble child.
+  </p>
+  <p>
+    <b>Different Guarantee Levels</b><br/>
+    There are three different levels of delivery guarantee when a message is 
sent.<br/>
+    <ol>
+      <li>IO Based send guarantee. - fastest, least reliable<br/>
+          This means that Tribes considers the message transfer to be 
successful 
+          if the message was sent to the socket send buffer and accepted.<br/>
+          On blocking IO, this would be 
<code>socket.getOutputStream().write(msg)</code><br/>
+          On non blocking IO, this would be 
<code>socketChannel.write()</code>, and the buffer byte buffer gets emptied
+          followed by a <code>socketChannel.read()</code> to ensure the 
channel still open.
+          The <code>read()</code> has been added since <code>write()</code> 
will succeed if the connection has been &quot;closed&quot;
+          when using NIO.
+      </li>
+      <li>ACK based. - recommended, guaranteed delivery<br/>
+          When the message has been received on a remote node, an ACK is sent 
back to the sender,
+          indicating that the message was received successfully.
+      </li>
+      <li>SYNC_ACK based. - guaranteed delivery, guaranteed processed, 
slowest<br/>
+          When the message has been received on a remote node, the node will 
process
+          the message and if the message was processed successfully, an ACK is 
sent back to the sender
+          indicating that the message was received and processed successfully.
+          If the message was received, but processing it failed, an ACK_FAIL 
will be sent back
+          to the sender. This is a unique feature that adds an incredible 
amount value to the application
+          developer. Most frameworks here will tell you that the message was 
delivered, and the application
+          developer has to build in logic on whether the message was actually 
processed properly by the application
+          on the remote node.
+      </li>
+    </ol>
+    You can of course write even more sophisticated guarantee levels, and some 
of them will be mentioned later on 
+    in the documentation. One mentionable level would be a 2-Phase-Commit, 
where the remote applications don't receive 
+    the message until all nodes have received the message. Sort of like a 
all-or-nothing protocol.
+  </p>
+  <p>
+    <b>Per Message Delivery Attributes</b><br/>
+    Perhaps the feature that makes Tribes stand out from the crowd of group 
communication frameworks.
+    Tribes enables you to send to decide what delivery semantics a message 
transfer should have on a per
+    message basis. Meaning, that your messages are not delivered based on some 
static configuration
+    that remains fixed after the message framework has been started.<br/>
+    To give you an example of how powerful this feature is, I'll try to 
illustrate it with a simple example.
+    Imagine you need to send 10 different messsages, you could send the the 
following way:
+    <source>
+      Message_1 - asynchronous and fast, no guarantee required, fire and forget
+      Message_2 - all-or-nothing, either all receivers get it, or none.
+      Message_3 - encrypted and SYNC_ACK based
+      Message_4 - asynchronous, SYNC_ACK and call back when the message is 
processed on the remote nodes
+      Message_5 - totally ordered, this message should be received in the same 
order on all nodes that have been
+                  send totally ordered
+      Message_6 - asynchronous and totally ordered
+      Message_7 - RPC message, send a message, wait for all remote nodes to 
reply before returning
+      Message_8 - RPC message, wait for the first reply
+      Message_9 - RPC message, asynchronous, don't wait for a reply, collect 
them via a callback
+      Message_10- sent to a member that is not part of this group
+    </source>
+    As you can imagine by now, these are just examples. The number of 
different semantics you can apply on a 
+    per-message-basis is almost limitless. Tribes allows you to set up to 28 
different on a message
+    and then configure Tribes to what flag results in what action on the 
message.<br/>
+    Imagine a shared transactional cache, probably &gt;90% are reads, and the 
dirty reads should be completely
+    unordered and delivered as fast as possible. But transactional writes on 
the other hand, have to 
+    be ordered so that no cache gets corrupted. With tribes you would send the 
write messages totally ordered,
+    while the read messages you simple fire to achieve highest throughput.<br/>
+    There are probably better examples on how this powerful feature can be 
used, so use your imagination and 
+    your experience to think of how this could benefit you in your application.
+  </p>
+  <p>
+    <b>Interceptor based message processing</b><br/>
+    Tribes uses a customizable interceptor stack to process messages that are 
sent and received.<br/>
+    <i>So what, all frameworks have this!</i><br/>
+    Yes, but in Tribes interceptors can react to a message based on the 
per-message-attributes
+    that are sent runtime. Meaning, that if you add a encryption interceptor 
that encrypts message
+    you can decide if this interceptor will encrypt all messages, or only 
certain messages that are decided
+    by the applications running on top of Tribes.<br/>
+    This is how Tribes is able to send some messages totally ordered and 
others fire and forget style
+    like the example above.<br/>
+    The number of interceptors that are available will keep growing, and we 
would appreciate any contributions 
+    that you might have.
+  </p>
+  <p>
+    <b>Threadless Interceptor stack</b>
+    The interceptor don't require any separate threads to perform their 
message manipulation.<br/>
+    Messages are sent will piggy back on the thread that is sending them all 
the way through transmission.
+    The exception is the <code>MessageDispatchInterceptor</code> that will 
queue up the message
+    and send it on a separate thread for asynchronous message delivery.
+    Messages received are controlled by a thread pool in the 
<code>receiver</code> component.<br/>
+    The channel object can send a <code>heartbeat()</code> through the 
interceptor stack to allow 
+    for timeouts, cleanup and other events.
+  </p>
+  <p>
+    <b>Parallel Delivery</b><br/>
+    Tribes support parallel delivery of messages. Meaning that node_A could 
send three messages to node_B in 
+    parallel. This feature becomes useful when sending messages with different 
delivery semantics.
+    Otherwise if Message_1 was sent totally ordered, Message_2 would have to 
wait for that message to complete.<br/>
+    Through NIO, Tribes is also able to send a message to several receivers at 
the same time on the same thread.
+  </p>
+  <p>
+    <b>Silent Member Messaging</b><br/>
+    With Tribes you are able to send messages to members that are not in your 
group. 
+    So by default, you can already send messages over a wide area network, 
even though the dynamic discover
+    module today is limited to local area networks by using multicast for 
dynamic node discovery.
+    Of course, the membership component will be expanded to support WAN 
memberships in the future.
+    But this is very useful, when you want to hide members from the rest of 
the group and only communicate with them
+  </p>
+  
+    
+</section>
+
+<!--
+<section name="Cluster Configuration for ReplicationTransmitter">
+<p>
+List of Attributes<br/>
+<table border="1" cellpadding="5">
+
+  <tr>
+    <th align="center" bgcolor="aqua">Attribute</th>
+    <th align="center" bgcolor="aqua">Description</th>
+    <th align="center" bgcolor="aqua">Default value</th>
+  </tr>
+
+  <tr>
+    <td>replicationMode</td>
+    <td>replication mode (<em>synchronous</em>, <em>pooled</em>, 
<em>asynchronous</em> or <em>fastasyncqueue</em>)
+    </td>
+    <td><code>pooled</code></td>
+  </tr>
+
+  <tr>
+    <td>processSenderFrequency</td>
+    <td>Control the sender keepalive status and drop sender socket connection 
after timeout is reached.
+    Check every processSenderFrequency value engine background ticks.
+    </td>
+    <td><code>2</code></td>
+  </tr>
+
+  <tr>
+    <td>compress</td>
+    <td>compress bytes before sending (consume memory, but reduce network 
traffic - GZIP)</td>
+    <td><code>false</code></td>
+  </tr>
+
+  <tr>
+    <td>ackTimeout</td>
+    <td>acknowledge timeout and only usefull it waitForAck is true</td>
+    <td><code>15000</code></td>
+  </tr>
+  
+  <tr>
+    <td>waitForAck</td>
+    <td>Wait for ack after data send</td>
+    <td><code>false</code></td>
+  </tr>
+
+  <tr>
+    <td>autoConnect</td>
+    <td>is sender disabled, fork a new socket</td>
+    <td><code>false</code></td>
+  </tr>
+
+  <tr>
+    <td>doTransmitterProcessingStats</td>
+    <td>create processing time stats</td>
+    <td><code>false</code></td>
+  </tr>
+</table>
+</p>
+<p>
+Example to get statistic information, wait for ack at every message send and 
transfer at compressed mode<br/>
+<source>
+    &lt;Sender
+      className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
+      replicationMode="fastasyncqueue"
+      compress="true"
+      doTransmitterProcessingStats="true"
+      ackTimeout="15000"
+      waitForAck="true"
+      autoConnect="false"/&gt;
+</source>
+</p>  
+</section>
+     
+-->
+</body>
+
+</document>

Added: tomcat/container/tc5.5.x/modules/groupcom/doc/project.xml
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/doc/project.xml?rev=397270&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/doc/project.xml (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/doc/project.xml Wed Apr 26 
11:59:29 2006
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<project name="Apache Tribes Documentation - Top Level Directory"
+        href="http://tomcat.apache.org/";>
+
+    <title>Apache Tribes - The Tomcat Cluster Module</title>
+
+    <logo href="/images/tomcat.gif">
+      Apache Tomcat
+    </logo>
+
+
+    <body>
+
+    <menu name="Links">
+        <item name="Docs Home"             href="index.html"/>
+        <item name="FAQ"                   href="../faq" />
+    </menu>
+
+    <menu name="User Guide">
+        <item name="1) Introduction"        href="introduction.html"/>
+        <item name="2) Setup"               href="setup.html"/>
+        <item name="3) FAQ"                 href="faq.html"/>
+    </menu>
+
+    <menu name="Reference">
+        <item name="Release Notes"         href="RELEASE-NOTES.txt"/>
+    </menu>
+
+    <menu name="Apache Tribes Development">
+        <item name="Membership"              href="membership.html"/>
+        <item name="Transport"             href="transport.html"/>
+        <item name="Interceptors"             href="interceptors.html"/>
+        <item name="Status"                href="status.html"/>
+        <item name="Developers"            href="developers.html"/>
+    </menu>
+
+    </body>
+
+</project>

Added: tomcat/container/tc5.5.x/modules/groupcom/doc/setup.xml
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/doc/setup.xml?rev=397270&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/doc/setup.xml (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/doc/setup.xml Wed Apr 26 11:59:29 
2006
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE document [
+  <!ENTITY project SYSTEM "project.xml">
+]>
+<document url="introduction.html">
+
+    &project;
+
+    <properties>
+        <author email="[EMAIL PROTECTED]">Filip Hanik</author>
+        <title>Apache Tribes - Configuration</title>
+    </properties>
+
+<body>
+
+
+<section name="Configuration Overview">
+</section>
+</body>
+
+</document>

Modified: 
tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/ChannelException.java
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/ChannelException.java?rev=397270&r1=397269&r2=397270&view=diff
==============================================================================
--- 
tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/ChannelException.java
 (original)
+++ 
tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/ChannelException.java
 Wed Apr 26 11:59:29 2006
@@ -24,8 +24,7 @@
  * @version $Revision: 304032 $, $Date: 2005-07-27 10:11:55 -0500 (Wed, 27 Jul 
2005) $
  */
 
-public class ChannelException
-    extends Exception {
+public class ChannelException extends Exception {
     private ArrayList faultyMembers=null;
     public ChannelException() {
         super();

Modified: tomcat/container/tc5.5.x/modules/groupcom/to-do.txt
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/to-do.txt?rev=397270&r1=397269&r2=397270&view=diff
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/to-do.txt (original)
+++ tomcat/container/tc5.5.x/modules/groupcom/to-do.txt Wed Apr 26 11:59:29 2006
@@ -26,6 +26,11 @@
  7. Its not built with the uniform group model in mind, but it can be 
accomplished using interceptors.
  
  8. Future version will have WAN membership and replication
+ 
+ 9. Silent members, the ability to send messages to a node not in the 
membership
+ 
+10. Sender burst, concurrent messaging between two or more nodes
+
 
 Bugs:
 ===========================================
@@ -33,6 +38,14 @@
  
 Code Tasks:
 ===========================================
+43. Silent member, node discovery.
+    Add in the ability to start up tribes, but don't start the membership 
broadcast
+    component, only the listener
+
+42. When the option SEND_OPTIONS_SYNCHRONIZED_ACK, and an error happens during
+    processing on the remote node, a FAIL_ACK command should be sent 
+    so that the sending node doesn't have to time out
+
 41. Build a tipi that is a soft membership
 
 40. channel.stop() - should broadcast a stop message, to avoid timeout



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to