Chapter 19. Marshaling and Remoting
The
days of
integrated
programs all running in a single process on a single machine are, if
not dead, at least seriously wounded. Today's
programs consist of complex components running in multiple processes,
often across the network. The Web has facilitated distributed
applications in a way that was unthinkable even a few years ago, and
the trend is toward distribution of responsibility.
A second trend is toward centralizing business logic on large
servers. Although these trends appear to be contradictory, in fact
they are synergistic: business objects are being centralized while
the user interface and even some middleware are being distributed.
The net effect is that objects need to be able to talk with one
another at a distance. Objects running on a server handling the web
user interface need to be able to interact with business objects
living on centralized servers at corporate headquarters.
The process of moving an object across a boundary is called
remoting. Boundaries exist at various levels of
abstraction in your program. The most obvious boundary is between
objects running on different machines.
The process of preparing an object to be remoted is called
marshaling. On a single machine, objects might
need to be marshaled across context, app domain, or process
boundaries.
A process is essentially a running application.
If an object in your word processor wants to interact with an object
in your spreadsheet, they must communicate across process boundaries.
Processes are divided into application
domains (often called app
domains); these in turn are divided into
various
contexts.
App domains act like lightweight processes, and contexts create
boundaries that objects with similar rules can be contained within.
At times, objects will be marshaled across both context and app
domain boundaries, as well as across process and machine boundaries.
When an object is remoted, it appears to be sent through the wire
from one computer to another, much like Captain Kirk being teleported
down to the surface of a planet some miles below the orbiting USS
Enterprise.
In Star Trek, Kirk was actually sent to the
planet, but in the .NET edition, it is all an illusion. If you are
standing on the surface of the planet, you might think you are seeing
and talking with the real Kirk, but you are not talking to Kirk at
all: you are talking to a proxy, or a simulation whose job is to take
your message and beam it up to the Enterprise where it is relayed to
the real Kirk. Between you and Kirk there are also a number of
"sinks."
A
sink
is an object whose job is to enforce policy. For example, if Kirk
tries to tell you something that might influence the development of
your civilization, the prime-directive sink might disallow the
transmission.
When the real Kirk responds, he passes his response through various
sinks until it gets to the proxy and the proxy tells you. It seems to
you as though Kirk is really there, but he's
actually sitting on the bridge, yelling at Scotty that he needs more
power.
The actual transmission of your message is done by a
channel.
The channel's job is to know how to move the message
from the Enterprise to the planet. The channel works with a
formatter.
The formatter makes sure the message is in the right format. Perhaps
you speak only Vulcan, and the poor Captain does not. The formatter
can translate your message into Federation Standard, and translate
Kirk's response from Federation Standard back to
Vulcan. You appear to be talking with one another, but the formatter
is silently facilitating the communication.
This chapter demonstrates how your objects can be marshaled across
various boundaries, and how proxies and stubs can create the illusion
that your object has been squeezed through the network cable to a
machine across the office or around the world. In addition, this
chapter explains the role of formatters, channels, and sinks, and how
to apply these concepts to your programming.
|