[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
|
[news.eclipse.technology.ecomm] Re: An abstract conferencing model
|
Hi John,
Here are my comments about your high-level description. In general, I
think what you describe and what I've implemented in the composent work
are very similar.
John F. Patterson wrote:
<stuff deleted>
OK, here goes. I define four main interfaces:
1) ConferenceService -- This is a machine-based container for all
Conferences managed by the machine. It primarily serves as a place to
create a new Conference, be invited to join a Conference, and query
about joined Conferences. In some cases, it might also act as a way to
find out about ongoing Conferences even if they have not been joined.
Factories for constructing new conference types and new conference tool
types may be plugged into the ConferenceService.
Within my own work, this ConferenceService has been referred to as a
'container factory'. Essentially this is a class within a plugin (the
org.composent.api.StageContainerFactory class in the org.composent.api
plugin) that provides a service for creating conferences/containers
within a given Eclipse platform instance.
An interesting question is whether there is one ConferenceService (a
singleton) for all underlying implementations or multiple
ConferenceServices, one for each underlying implementation. In the
past, I have tended to assume a new ConferenceService per
implementation, but the loss of a unified list of ongoing conferences
(assuming you are running against mutliple implementations) might be
regrettable. On the other hand, managing invites and querying for
ongoing conferences can be fairly implementation-specific. I am
uncertain on whether to have one ConferenceService per implementation.
I have taken the approach of providing a single distributed container
factory, but having that factory be able to construct a variety of types
of containers. That is, the factory creates instances that implement an
abstract 'container' interface and the static 'make' methods are general
enough to create instances whos types are not known at compile time.
This also makes for a natural Eclipse extension point...as other plugins
can substitute their own new implementations of various types of
containers at Eclipse initialization time, and have their type of
container be created when a request for new container comes through the
factory.
2) Conference -- This is contained by the ConferenceService. It's
primary job is to manage the multi-point relationship of the
Conference. It is not the place to actually communicate. If you are
familiar with telephony, this is similar to the notion of signalling as
distinct from data transport. In any case, the Conference is where one
learns about ConferencePresence objects as they join and leave the
Conference. This is where one can leave the conference or query the
current list of ConferencePresences.
Right. In the model I've worked on so far, your notion of a Conference
has been generalized to be a 'distributed container'. As you point out
in another post, there are a lot of names for such a thing...e.g.
conference, session, space, group, pipe, etc. Essentially such
containers are 1) constructed/managed by the above-described service;
and 2) are responsible for a) join/leave (aka connect/disconnect)
operations...including authentication; b) creating/managing/destroying
individual 'components' and c) maintaining group membership (uniquely
identified set of participants within the conference) so that each
participant can reliably respond to group membership changes (e.g.
remote process failures, etc).
The Conference also manages the ConferenceTool objects. ConferenceTools
may be created or destroyed and queried for the current list. The
Conference will signal an event when a ConferenceTool is created or
destroyed by some other ConferencePresence.
Your use of ConferenceTool basically corresponds to my use of 'component'.
3) ConferencePresence -- This identifies a communication endpoint in
the multi-point relationship managed by the Conference. These objects
are contained by the Conference. They primarily provide attribute
information regarding the identified presence. They are not directly
used to send information to the presence, i.e., there is no send
method. Communication is done via the Conference Tools.
The ConferencePresence object raises three interesting design questions:
a) Should my presence be noted by the same object as other people's
presence? Generally, I can act on my presence, but I cannot act on
other people's presence, so I have come to think of these as distinct
object types.
In my own work, I've implemented it both ways. IMHO it's slightly more
natural (for me) to have a distinct component corresponding to each
participant's presence info.
b) Should changes to my attributes be signalled through to others in
the conference or should my attributes be final? I like the idea of
changable attributes, but it is more complicated. (It is like bringing
a deeper notion of presence/awareness into the conference.)
For my previous work, I've introduced the notion of allowing
peers/clients to create a *primary* copy of an arbitrary object into the
container, while other peers/clients have a non-primary copy. For such
objects (e.g. presence state and behavior), *the creating peer* is
authoritative WRT the state of the object and wrt communication of state
updates (how much info, and how frequently). That is, for my presence
object (for example), I am the owner/creator of that object, and for the
other copies of that presence information the state is considered
transient and non-authoritative. So, for example, if I leave the
session, the presence information about me being displayed on other
people's screens is assumed to be stale, and non-authoritative.
This allows peers to introduce components into a distributed container,
replicate (to some degree) the code and state of the component to other
participants, and a) keep all the replicated state consistent as various
participants access and possibly modify the state of that object; b)
remain locally authoritative about who is allowed access to changing
that state.
c) Should one learn about leaving the Conference via the
ConferencePresence? I used to prefer this and I have come around to
believing that one should listen for leaving in the same place one
listens for joining, i.e., on the Conference.
In my current formulation, ConferencePresence are just additional
instances of 'components' (conference tools...see below). Such presence
components, however, are somewhat special in that they depend heavily
upon the group membership notifications that are provided by the
distributed container...in order to show in the user interface the
'arrival' and 'departure' of a given participant (uniquely identified
upon join/authentication within the container).
4) ConferenceTools -- This is where the communication takes place.
ConferenceTools are contained by the Conference. There will be
different tools for different types of communication, e.g., chat, voip,
app-sharing, etc. Each tool will have a different interface depending
on the capabilities one wants to support. They are all sub interfaces
of ConferenceTool. Without diving into the details of any particular
tool it is hard to say much about the methods that will be available.
Presumably, all tools will have some identifying information, such as a
name or properties.
Yes. My name for these are 'components' (referred to as 'stages' in the
org.composent.api source code). Components/stages have an
identity/name, arbitrary properties, arbitrary state, arbitrary
method/code, and potentially have their state information distributed or
replicated within the current scope of the container (on all the
processes that have joined the container). Also provided to the
component is a simple messaging api to send/receive arbitrary messages
to/from remote replicas...and to receive notifications about group
membership changes...e.g. to implement presence changes caused by group
arrivals/departures.
ConferenceTools raise two interesting design questions:
a) Should ConferenceTools be able to contain their own
ConferenceTools? I am inclined to say yes. One might imagine, for
example, a ConferenceTool that simply provides an unformatted
communication channel among the ConferencePresences.
Yes. In my previous models, components have the ability to contain
and/or construct new components at runtime. Allowing for runtime
manipulation of the available capabilities/functions within the scope of
the container.
Then a tool that
needed two of these could create them and contain them to do whatever it
needs to do. Similarly, we might have a chat tool and an app-sharing
tool and decide later that we want a tool that always has both chat and
app-sharing together. This would just be a new tool containing the
original tools.
Yes. This is exactly how my current set of plugins function. If an app
share is started, for example, the appropriate component is simply
introduced into distributed container (with multiple participants). The
person that's doing the application sharing is authoritative WRT the
state updates being made (changes to the display of the shared application).
b) How are ConferenceTools different from Conferences? This is an
interesting and subtle question. As presented above, I have assumed
that the ConferenceTools "inherit" their multi-point relationship from
the Conference. In other words, if you are in the Conference you are in
all its tools. This is a simple policy, but it is not clear it is the
best way to do things. Just because someone is not able to participate
in some tool (for example, I might not have voip installed) does that
mean others should be precluded from using the tool.
No...and separating components from containers allows this distinction
to be made at runtime...that is, I may be able to participate with you
in a given conference/container, but there are somethings that we all
can do, somethings that only some of us can do, and some things that
none of us can do within the scope of this container. Whether by
individual or group policy, or by availability of code, or by
limitations on local clients (like not having voip installed, or not
having a microphone, etc) a separation between the container and
components within such a container allows heterogeneous clients to
coexist rather easily.
So, for example, within my own composent work, I've created an
applet-based client that interoperates just fine with the eclipse-based
client. See 'join web collaboration' link for the ecomm project on
following page, for example:
http://www.composent.com/eclipse/applet/table.html
Generally, the
answer is that not everyone will be involved in every tool. This means
that we will need to provide indications of presence on the tools so
that we can know who's in and who's out for that tool. So, if
ConferenceTools will also have lists of participants and lists of their
own tools (as in a) above), how are they different from Conferences?
They can use the container as a common resource to provide consistent
access to these lists of participants and lists of components. That way
they don't have to reproduce them. So, in addition to basic messaging
primitives provided to the components by the container, the container
can also provide access to these lists WRT membership information and
the existence (or not) of other uniquely identified components. Note
that this is where identity being associated with components is
critical...as components need to have access to a globally unique
identifier for each component.
While there is something deeply similar about Conferences and
ConferenceTools, I still see three fundamental differences that make me
inclined to represent the root of the tool hierarchy different from the
other nodes.
i) While the ConferenceTools must somehow "track" the comings and
goings of membership in the Conference, the Conference has no such
requirement.
I would argue that the container is required to track the
membership...so that reliable group membership information can be
communicated among peers as members drop/fail, etc...so that other
entities can keep a consistent view of the group membership. So if the
container does it reliably, and the components have an api to access the
this information if they need it...then the 'tracking' doesn't have to
be duplicated.
ii) I do not think it is wise to allow the membership in the
ConferenceTools to exceed the membership of the Conference. I would
consider it surprising to discover that there is someone in the chat who
is not even a member of the containing conference.
Right. This would be a very confusing state, and also a security risk
(as you don't want participants or components able to participate in any
way in the context of the container if they are not explicitly
authenticated).
iii) I do not think
that ConferenceTools will have a URI. The Conference will be
identifiable from outside the Conference, but its tools will only be
identifiable in the context of the Conference. This has a number of
implications, but one of the most interesting is that one does not think
of moving a ConferenceTool from one Conference to another.
Although to me there is nothing 'wrong' with having the identity of a
component be scoped to be only unique within a container (it has to at
least be that, however), it definitely means that a given component
can't move from one container to another. This means some kinds of
component portability would be impossible, so I would expect that for
some kinds of containers the component identifiers would be guaranteed
to be globally unique.
I suppose these last two constraints are an imposition of policy, but
they are policies that I am fairly comfortable with. I might be
persuaded to adopt a looser, more general approach, provided I could
impose these policies when desirable. I haven't really thought this
through yet.
Right. I think of this as a policy that's appropriately applied on a
container instance-by-container-instance level...that is, a given
container instance (a given session for communicating among a given set
of processes) might apply this policy, while other containers might
allow this constraint loosened.
*******
I guess that's enough for now. That should help you understand where I
am coming from. I hope you can help me understand the ways in which
your proposal is similar or different from the approach outlined above.
I actually think we're very much on the same wavelength. The composent
plugins do implement many of the concepts discussed below...e.g.
factories to create conferences/containers which hold
components/conference tools, with such components coming/going at
runtime and updating remote and local state via the communication
primitives provided by the container.
Thanks for the thoughts. Please keep them coming. Hopefully this was
helpful for you. I've got some docs on my previous work (which ideally
will inform but certainly not determine the ecomm work)...so please let
me know if you would like to see them.
Scott