The title of this page can be quite misleading. It does not show the design of the system, as each
subsystem explains its own design on its own, as well as the interactions with any other subsystem.
What it does is to shown the very general features affecting the design and the implementation of Sensei.
Sensei supports (or is built on top of) the virtual synchrony model developed by Ken Birman in the '80s.
All the reliable group communication systems existing currently (that we are aware of) use this model.
The access to Sensei and its subsystems is exclusively done through the IDL interfaces (for CORBA, in
case of JavaRMI, through the remote interfaces). The interface is therefore object oriented.
Sensei supports CORBA and JavaRMI, through two different interfaces. These interfaces are different
because they are specified in different languages, but they're intended to support the same functionality.
In fact, the implementation is the same for both cases.
To understand how is possible to share the same implementation, using different interfaces, we'll make use
of an example. The type Message is defined in SenseiGMS, and has the following specification in IDL:
module sensei
{
module middleware
{
module gms
{
valuetype Message {};
};
};
};
That is, when the IDL compiler processes this file, it will generate the classes related to the Message
type under the package sensei.middleware.gms .
The same type is defined in JavaRMI as:
package sensei.middleware.gms;
public class Message implements java.io.Serializable {}
Therefore, both, the CORBA and the JavaRMI specification, share the same package, although they are
placed in different directories.
In fact, the source distribution of Sensei defines the following directory structure:
sensei
|-------corba
| |-------sensei
| |-------middleware
| |-------gms(1)
|-------rmi
| |-------sensei
| |-------middleware
| |-------gms(2)
|-------gms (3)
- The directory (1) contains the bytecode compiled from the IDL specification.
- The directory (2) contains the bytecode compiled from the JavaRMI interfaces, as well as the
RMI stubs and skeletons.
- The directory (3) contains the shared implementation. It depends on sensei.middleware.gms, and it
depends on the correct CLASSPATH to choose the middleware.
For example, to use CORBA, the classpath must point out to sensei/corba (it is needed to recompile
sensei/gms, it is not possible to compiler it using a classpath and try to execute it with a different one).
Directories (1) and (2) must share as well some
common definitions. For example, the package
sensei.middleware.gms defines an interface called GroupMember.
Using CORBA, the implementation for this interface must inherit (although other possibilities are
also possible) from a class called GroupMemberPOA. Using JavaRMI, the
implementation must inherit from java.rmi.server.UnicastRemoteObject
and implement the interface GroupMember. To avoid this inconsistency, a class is defined in the
package sensei.middleware.gms, called GroupMemberImpl,
hiding the middleware dependencies, and the real implementation in the package sensei.gms just inherit
from this last class.
|