<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!DOCTYPE document [
  <!ENTITY project SYSTEM "project.xml">
]>
<document url="introduction.html">

    &project;

    <properties>
        <author email="fhanik@apache.org">Filip Hanik</author>
        <title>Apache Tribes - Introduction</title>
    </properties>

<body>

<section name="Table of Contents">
<toc/>
</section>

<section name="Quick Start">

  <p>Apache Tribes is a group or peer-to-peer communication 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><![CDATA[//create a channel
Channel myChannel = new GroupChannel();

//create my listeners
ChannelListener msgListener = new MyMessageListener();
MembershipListener 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
myChannel.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 workarounds 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 before 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 or UDP 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. UDP messaging has been added in for
    sending messages over UDP instead of TCP when desired. The same guarantee scenarios as described below are still available
    over UDP, however, when a UDP message is lost, it's considered failed.<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.
  </p>
    <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. If configured, Tribes will throw an exception when it receives an ACK_FAIL
          and associate that exception with the member that didn't process the message.
      </li>
    </ol>
  <p>
    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 messages, you could send them the following way:
  </p>
    <source><![CDATA[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>
  <p>
    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 that 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.<br/>
    The <code>MessageDispatchInterceptor</code> is the only interceptor that is configured by default.
  </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="Where can I get Tribes">
  <p>
    Tribes ships as a module with Tomcat, and is released as part of the Apache Tomcat release.
  </p>


</section>

</body>

</document>
