[omniORB] Addressing/reference problem

Kevin Bailey ke-omniorb@retriever.dyndns.org
Tue, 21 Aug 2001 09:14:11 -0700


We're trying to find a solution to an addressing problem we have
and were wondering if anyone could help. We have a cluster of
computers of which only one member is visible to the outside IP
world. (The cluster uses a 192 subnet.) Nevertheless, there are
objects on all the computers in the cluster which must be
reached from the outside world. The requirements are that
internal traffic be screaming fast while external traffic can be
slow as a dog.

We've come up with a couple solutions which we don't like. One
is to have proxy objects on the visible cluster member for each
object on an internal member. We don't like this idea because it
sets up an extra dependency between cluster members. Another
idea is to set up a static NAT system on the visible member who
routes all external CORBA calls to the appropriate internal
member.

Either way, this requires each object to have 2 object
references - an internal one and an external one. The problem
is that an object never knows which reference to give out. It
prefers giving out the internal one because that reference
doesn't require going through the visible cluster member and
might even take advantage of colocation optimizations. Yet it
can never be sure that a reference it gives out won't make its
way outside the cluster and be useless. Therefore it must always
err on the conservative side, give out only external references
and have terribly poor performance.

I've thought of having 2 name spaces in the name service. One
would give out internal references; the other, external. This
would cover all the cases except for all the factories who don't
know who they're talking to and don't know what kind of
reference to give out. I suppose it's possible that each factory
could have 2 references and, depending on which was used, give
out different reference types but it could never be sure that
an internal requester won't give the reference to an external
client.

I was hoping someone might think of a clever solution perhaps
using the ability of a reference to hold 2 IP addresses or
perhaps taking advantage of the LOCATION_FORWARD mechanism. I
suspect the double-reference won't work because the first
address it would try (the 192 address) might take a minute to
timeout, but I don't know that much about double-references and
perhaps there's someway for a client to choose the more optimal
address within the reference before sending anything.

I'm not sure how the LOCATION_FORWARD idea would work but right
now we're considering requiring external clients to perform an
extra method call to translate any internal references they are
given to external ones. This sounded similar to location
forwarding but I realize it's different.

Any ideas would be greatly appreciated!