Subject: RE: An opes usage question.

From: "Krishna Ramadas" <[email-masked]>
Date: Tue, 9 Mar 2004 11:18:37 -0800

Alex,
	Perhaps, the recommendations that you make about using the
current definitions within OPES are applicable. I understand that you
are recommending the use of the "tracing" facility and the "meta data
transfer" facility. 

OPES "tracing" is defined in the "An architecture for OPES" documents.
In this context the document states that : "Providing the ability for
in-band annotation MAY require header extensions on the application
protocol that is used (e.g HTTP)".

The document "HTTP adaptation for OPES" proceeds to define the use of
tracing in the context of HTTP. Similar structures do not exist for
supporting other applications, at the moment. Utilizing the "tracing"
mechanism for flow discovery can work for HTTP. In fact HTTP 1.1,
already defines a field "X-Forwarded-For" to help with such a discovery.
The problem is with other applications.

Meta Transfer is established as a requirement in the document
"Requirements for OPES callout protocols (3.13)". Are you also implying
that we embed meta-data in the traffic flow, just like trace
information? Often, processing of meta-data is done in a background
thread and not in the main thread for gaining processing efficiency. I
had, therefore, understood that OCP should provide the
meta-data-transfer support. Is this correct? In-flow transfer of
meta-data requires support for application protocol, may be possible
only with HTTP, currently. Transferring meta-data using OCP also becomes
tricky when the callout and proxy roles are mixed within one physical
entity, especially with load balancers separating the proxy stages. I'd
like to get your ideas on meta data transfer, I may not have noticed
some earlier discussions on this, any pointers will be greatly
appreciated.

Thanks
Krishna

BTW, the billing servers may never be in the traffic path like it is
shown in the figures that we have been discussing. Instead, two stages
of adaptation servers may be separated by load balancers. 

-----Original Message-----
From: Alex Rousskov [mailto:[email-masked]] 
Sent: Monday, March 08, 2004 10:08 PM
To: John G. Waclawsky
Cc: OPES Group; Krishna Ramadas
Subject: Re: An opes usage question.

I am afraid the latest discussion/diagrams unnecessary complicated
things. We suddenly started talking about IP addresses of individual
proxies, persistent connections between load balanced proxies, and
other complicated low-level details that should be kept outside of
most OPES protocols. Let's step back a little:

On Wed, 3 Mar 2004, John G. Waclawsky wrote:

> 1)  The opes framework allows services to be distributed (or
pipelined),
> with incremental services being added to each traffic flow at each
> stage. This is an opes proxy to proxy communication model.
> 2) A pool of multiple opes proxies can be provisioned at each stage to
> support a large number of flows
> 3) Installing load balancers between stages to distribute the flows is
> ok in an opes framework (and this is a typical business scenario). If
> all the flow processing can be achieved in-line then there is no need
to
> identify any specific proxy in any pool. In this case we probably
don't
> care which previous stage opes proxy did the prior adaptation step.

Agreed.

> 4) The crux of the problem is how to share information between two
> stages of the flow. This sending of metadata from one stage to a
> previous stage will require knowledge of specific server addresses (a
> more general case might be be to send the metadata in  either
direction).

I hope the last statement is false. IMO, identifying or communicating
directly with individual proxies behind a load balancer makes sane
load balancing impossible. Sane load balancing, by definition,
includes load balancing of identical proxies (identical from external
protocol agents point of view). If all proxies are truly identical
from external agents ping of view, there should be not reason to
identify them individually.

If proxies are not identical for any reason, then we are not load
balancing them; we are managing a pool of different proxies, with some
complex per-protocol selection criteria. The latter model is what
origin server load balancing evolved into and is exactly why HTTP load
balancing requires AI techniques and ugly hacks to work, despite the
fact that pure HTTP is stateless. We should avoid this model (on a
protocol level) if at all possible.

In your specific case, this implies that external proxies must not try
to identify individual proxies behind the load balancer. While we can
build such identification mechanisms, the long-term effect would be
the same as for HTTP: expensive and relatively rigid load balancing
schemes causing headaches for all the parties involved.

The task of such identification should be assigned to load balancers.
If the protocol is designed correctly, a load balancer should be able
to reliably identify the proxy/server it should talk to when the
external proxy sends a follow-up message to the load balancer. We
tried hard to make this possible with the OPES tracing approach. It
should be possible in reverse direction as well.

Instead of using this diagram:

  ContentServer     ContentServer     ContentServer
        |               |                |
        \               |               /
         \              |              /
          ----------------------------
          |      Load Balancer       |
          ----------------------------
            |           |         |
            |           |         |
            |           |         |
  BillingServer  BillingServer   BillingServer
        |               |                |
        \               |               /
         \              |              /
          ----------------------------
          |      Load Balancer       |
          ----------------------------
            |           |         |
            |           |         |
            |           |         |
       AdaptServer  AdaptServer  AdaptServer

let's use the following diagram when designing your billing adjustment
algorithm/protocol:

                  ContentServer
                        |
                 BillingServer
                        |
                   AdaptServer

and require that if any load balancing is introduced, it does not
change the algorithm/protocol in any way. This implies that if IP
addresses are used to identify proxies, then load balancers should put
their own IP addresses instead of the addresses of the proxies being
balanced (and embed known-to-balancer-only meta information to map
flow ID to individual proxy address). OPES tracing allows for such
substitutions and meta information, for example. The notification
algorithms working in the opposite direction should allow them as well
and can reuse the techniques discussed when OPES tracing was
developed.

In other words, instead of allowing a load balancer as a separate
protocol
entity that everybody has to worry about, you require that protocols are
designed so that a group of load balanced agents is visible as a single
agent,
and nobody has to worry about the presence or specifics of load
balancing
(except for the load balancer itself).

Can you think of any real world problem that cannot be solved using the
above
simplified framework? Can you think of a reason why load balancers will
not be
able to hide the presence of multiple proxies from the outside agents?
In
other words, is there a point in drawing load balancers and multiple
proxies
when discussing the protocols you need?

Thanks,

Alex.

---

From: Alex Rousskov <[email-masked]>
Date: Tue, 9 Mar 2004 23:09:13 -0700 (MST)

On Tue, 9 Mar 2004, Krishna Ramadas wrote:

> current definitions within OPES are applicable. I understand that
> you are recommending the use of the "tracing" facility and the "meta
> data transfer" facility.

Kind of, but not exactly. Sorry for not being clear. I used the
tracing facility as an example. The primary purpose of my response was
to remove load balancers from any high-level architecture discussion
on this thread as an irrelevant detail.

In other words, I was trying to argue that any diagram that shows a
load balancer is too low-level for the current discussion; and that
load balancing, when done right, should not affect the protocols being
discussed (including tracing and notification protocols).

> Utilizing the "tracing" mechanism for flow discovery can work for
> HTTP. [...] The problem is with other applications.

Yes, each application protocol needs its own tracing profile and some
application protocols will not be able to support embedded tracing at
all.

> "Requirements for OPES callout protocols (3.13)". Are you also
> implying that we embed meta-data in the traffic flow, just like
> trace information?

Not really. The best solution would depend on environment/application
specifics that we do not know yet. Transferring small amounts of
metadata embedded in HTTP messages is usually OK, but probably not
always the best approach, and we may not be dealing with HTTP here.

> Often, processing of meta-data is done in a background
> meta-data-transfer support. Is this correct?

OCP provides support for metadata exchanges. However, my understanding
is that the question of whether OCP should be used among described
proxies is still open.

> Transferring meta-data using OCP also becomes tricky when the
> callout and proxy roles are mixed within one physical entity,
> especially with load balancers separating the proxy stages.

I am not sure what complications or tricks you are referring to. Since
OCP establishes roles on per-OCP-connection basis, I am not sure why
mixed proxy roles would cause a problem. Said that, we do not have an
OCP profile for proxy-to-proxy exchange, so it is difficult to
speculate about the benefits and limitations of such approach. In
theory, OCP can marshal any mix of data and metadata, but it may not
be the best protocol to use among proxies, depending on the specifics
of the environment.

> shown in the figures that we have been discussing. Instead, two
> stages of adaptation servers may be separated by load balancers.

True. However, if proxy-to-proxy exchanges are not tied to persistent
connections/pipeline, then it probably does not matter, as far as
proxy/flow identification is concerned? Am I missing something?

Alex.