Stefano Mazzocchi wrote:
> [For those of you who didn't study elettronic, MOSFET transistors have
> sources, drains and gates. Sources generate electrons, drains consume
> them and gates control the flow]

MOSFETs, aahh listen to the music...

For those who do not know, FETs (Field Emission Transistor) transistors
behave more like tubes than their PNP or NPN solid state cousins.  As a
result, they tend to have a more pleasing sound when they approach
saturation (they still clip a little hard but you soften the sound
some).  MOSFET (Metal Oxide Semiconductor Field Emission Transistor) is
a type of FET with a small insulator on the gate.

Since I studied music recording, and Studio Electronics, I know exactly
what Stefano is talking about.

BTW: there is a slight correction in the definition of Sources and
Drains in regards to FETs.  The source is where electrons enter
(generated by an external source like a battery or socket) and the
drain is where electrons leave.  The gates control the amount of
resistance that the FET, and consequently the the current flowing
through the FET.

I love FETs. :)

> The original idea of a pipeline was
> 
>  g -> t* -> s
> 
> you all know this very well.
> 
> Then I realized that the same pipelines shared the same properties, so I
> came up with the notion of resource views, which required a way to 'get
> out' of the normal pipeline flow. This was implemented with 'views' and
> 'labels'
> 
>  g -> t* -> s
> 
>  [label] -> t* -> s
> 
> so that we could ask for a specific 'view' and do something like
> 
>  g -> t -> t* -> s [normal view]
>       |
>       + -> t* -> s [another view]
> 
> Then we wanted to merge different pipelines with 'aggregation', so we
> needed a way to do something like
> 
>  g -> t* -> A -> t* -> s
>             ^
>  g -> t* ---+
> 
> this created the notion of 'internal pipelines', those pipelines who
> don't need a serializer because their sax events are aggregated
> directly.

Now, I want to interject that it is easier to understand the usefulness
of Aggregations than Views.  For that reason, we need another way of
viewing the system.



> Now, Vadim proposed the notion of having serializers that write on
> output streams which are not connected to the requesting agent.
> 
> Something like this
> 
>   request -> g -> t* -> MX -> t* -> s -> response
>                          |
>                          t*
>                          |
>                          s
>                          |
>                          v
>                        stream
> 
> this reminded me a lot of transistor 'drains', the place where the
> electrons are consumed.

I understand the requirement.  What we need is the ability to
initiate asynchronous pipelines that consume information from a
request.  I say asynchronous because in this case, we are not
merging the information back into the critical stream.

There has been some talk about making SAX streams concurrent (i.e.
an aggregation of several pipelines all running at the same time
to reduce time to the client).  So the Multiplexer/Demultiplexer
idea does have some merit.

However, let use take the abstraction up from the FET analogy.


Since I come from a recording background I will use the analogy of
a patch bay and console.  The purpose of a patch bay is to route signals 
through what is known as outboard equipment (processors outside the
console), and back into the console.  The Console takes several
signals and combines them into only a few (stereo, 5.1 format, 7.1
format).

In a typical recording session, we will take the input of several
instruments and route them directly to the media.  Because the
musicians all want to hear each other, along with what is already
on tape, the mixer is used to play back what is on tape and provide
a working mix for the musician.  Typically each musician wants to
hear themselves the loudest ;).

During this stage, the console has several output options.  Depending
on the console model, you can have as many as 8 different mixes for
the musicians (more than enough) and still have yet a different one
for the engineer.  There is only a little bit of processing done to
make the artist feel comfortable.

To bring the analogy into the Cocoon world, each "pipeline" represents
a signal.  The signal comes in through the preamp to amplify it, through
the recording media to record it, through EQ and compression to
transform it, and finally through the power amplifier so we can hear it.

In Cocon, the Generator acts as the preamp.  It takes an arbitrary
source and converts it into a usable format (SAX events).  Typically we
skip the "recording" phase for most applications, but I will get back
to this later.  The EQ and compression are analogous to different types
of transformers.  Lastly, the power amp is equivalent to the serializer.

Stepping back one more abstraction, we have Transducers, Signal Routers,
and Signal Modifiers.  Microphones, Tape Heads, Speakers, A/D/A
converters are all types of transducers.  They convert one form of
energy into another.  Also as you can see by the inclusion of
microphones and speakers in the list of transducers, the concept of a
transducer does not indicate a specific direction of signal flow.  In
fact, microphones can be used as an inefficient speaker and speakers
can be used as an inefficient microphone (I know of one engineer who
uses a 6" speaker to record the bass drum).

In Cocoon land we have three transducers:  Generator, Serializer, and
Reader.  This is ok, because it reflects real life.

The Signal Modifiers are EQs, dynamics processors, digital signal
processors, and other specialty devices.  EQs modify the frequency
content of the signal.  Dynamics processors like compressors and
expanders modify the amplitude content of a signal.  Digital signal
processors typically modify the time domain (phase) of a signal,
although they work equally well for all areas of signal modification.
This is where all the fun happens.

In Cocoon our signal modifier is the Transformer.  There are many
types of transformers that are powerful and easy to use.

Moving on to signal routers, we are talking about the combination of the
patch bay and the console.  The console has limited routing capabilities
because its main function is to combine a large number of signals into
a small number of signals.  It delegates the responsibility of complex
routing to the patch bay.  The patch bay is the real signal router in
the system.  We can use the patch bay to split any signal to two or
three outputs to allow different outboard devices to modify the signal
concurrently.  The inputs and outputs of those devices and all the
channels on the console, and all the tracks on recording media are
connected to the patch bay.  The patch bay is usually soft-wired so that
there is a default flow for the signals that can be easily overridden
by inserting patch cables.

The closest thing we have to a signal router in Cocoon is the Sitemap.
The sitemap does not provide a soft-wiring feature that assists in
creating a solution.  We only have hard-wiring which means that we have
to explicitly state how we handle each invokation of the sitemap.  Many
HTTP servers provide a soft-wiring that matches urls to the file system.
This is an easily understood default that is as fragile as your file
hierarchy.  I don't have any thoughts on how to provide a middle of the
road soft-wiring for the sitemap.

One of the areas that we are facing (as the additions of views and
aggregations attest) is that the sitemap semantics do not provide a
balanced and flexible approach to signal (request/response) routing.
I think that the addition of Actions can attest to that.  Lets take
Cocoon and instead of a web application platform lets place it in the
light of a web services platform (all XML all the time).

Let's say we have a complex system that takes a new item submission from
a manufacturer and puts it in the queue for a retailer to review.
Typically there are a set of canned responses that the Web Service has
to provide.  Those responses would be: "Success", "Internal Error",
"Incorrectly Formatted Request".  In the best of worlds, we would
directly process the incoming XML into the database and shove out a
response from a different source.  An example flow would be:

               "Internal Error"->Response
                       +
Request->Validate->Database
             |         +
             |     "Success"->Response
             +
         "Incorrectly Formatted Request"->Response

As you can see, the incoming request's destination is the database--not
the message response.  In this system we have 3 transducers: Request,
Response, and Database.  To ease development, we would want to make
a direct line from the request to the database because the input request
is formatted as XML.  Also, we want to kick off a canned response as
soon as it is safe to do so.  If there is any validation error, we want
to kick out a response while we are cleaning up resources.  If there
is a database error, we want to kick out a response while we are
cleaning up resources.  Once the request is properly processed we can
safely return the canned "Success" response.

Currently we have a complex way of accomplishing these goals:
We use Actions to perform validation and database entry.  Using clues
from the return values of the actions, we select the response as our
generator and folow it immediately with the XML serializer.

It would be better if we could separate the input and output streams
so that the output stream can be kicked off as soon as we know which
one.  With a separate input stream, we can get rid of the need for
Actions altogether and have a collection of kick-but transformers and
transducers that take the request and directly place it in whatever
storage device we need.

This allows simple things to remain simple (i.e. regular web sites
only need output streams), but allows things to be flexible.  For
instance, let's take the same example and have it kick off a couple
other pipelines.  One is a pipeline that processes payments from the
SOAP header informaiton, one is a pipeline that informs the retailer
that there is a new product in their queue.  Now we have three
separate destinations that no longer need to keep track of each other.

With the new CommandManager and event processing tools in Excalibur
scratchpad, it is easy to kick off an asynchronous pipeline without
worrying about a multiplicity of threads (we can have a controlled
number of threads that handle the truly asynchronous events).

Now, when we bring this infrastructure into a portal, we have to
worry about recombining pipelines.  For instance, one request will
have several inputs, all needing to be combined into one output.
This is a slightly different problem that is not as friendly to
asynchronous processing.  The main reason for this is that SAX events
are inherently ordered.  You will have to cache parts of the other
pipelines until they are needed, a requirement wich adds overhead
in the form of RAM or disk IO.  I doubt we will better our response
times significantly if we allow asynchronous demultiplexing (or
mixing).  I am open to more discussion on the subject though....

Comments?

(Stefano, I know I went a completely different way than you started
out but I think we have something to throw in the mix here that will
get us closer to where we want to be).
-- 

"They that give up essential liberty to obtain a little temporary safety
  deserve neither liberty nor safety."
                 - Benjamin Franklin


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

Reply via email to