Removing the client/server distinction entirely β every component is both.
π Where this lives: this is the architecture that taught the industry an expensive lesson. CORBA and its successors tried to make a call to a remote object look exactly like a call to a local one, so distribution would be an implementation detail. It does not work β the network can be slow, can fail, can duplicate, and can partition, and no amount of syntax can hide that. The "fallacies of distributed computing" were written in reaction to precisely this. Understanding why the abstraction leaks is more valuable than any API you will learn. Search "fallacies of distributed computing Deutsch".
The model
In a DISTRIBUTED OBJECT ARCHITECTURE, there is no distinction
between clients and servers. Each distributable entity is an
OBJECT that provides services to other objects and receives
services from other objects.
Object communication is through a MIDDLEWARE system called an
OBJECT REQUEST BROKER (a SOFTWARE BUS). The broker provides a
transparent set of services allowing objects to communicate,
and to be added to and removed from the system.
ββββββ ββββββ ββββββ ββββββ
β o1 β β o2 β β o3 β β o4 β
β S1 β β S2 β β S3 β β S4 β
βββ¬βββ βββ¬βββ βββ¬βββ βββ¬βββ
βββββ΄ββββββββ΄ββββββββ΄ββββββββ΄ββββ
SOFTWARE BUS (object request broker)
βββββ¬ββββββββ¬ββββββββ¬ββββββββ¬ββββ
βββ΄βββ βββ΄βββ βββ΄βββ βββ΄βββ
β o5 β β o6 β β o7 β β o8 β
β S5 β β S6 β β S7 β β S8 β
ββββββ ββββββ ββββββ ββββββ
THE BROKER'S JOB: an object need not know the LOCATION of the
objects it calls. It asks the broker, and the broker handles
finding the target, marshalling the arguments, transmitting
them, invoking the method, and returning the result.
ADVANTAGES
Β· it allows the SYSTEM DESIGNER TO DELAY DECISIONS on where
and how services should be provided β a genuinely valuable
property, because the deployment topology can change without
redesign
Β· it is a very OPEN SYSTEM ARCHITECTURE that allows new
resources to be added as required
Β· the system is FLEXIBLE AND SCALABLE β new objects can be
added on new processors as demand grows
Β· it is possible to RECONFIGURE THE SYSTEM DYNAMICALLY, with
objects migrating across the network as required
DISADVANTAGES
Β· it is a more COMPLEX PARADIGM than the clientβserver model,
and harder for designers to think about. Clientβserver
systems have a natural "who serves whom" structure; a peer
mesh of objects has none, and the resulting design can be
difficult to visualise, test and debug.
Β· the middleware itself becomes a critical dependency and a
single point of failure
Β· performance is unpredictable, because a method call that
looks local may be a network round trip
USES OF DISTRIBUTED OBJECT ARCHITECTURE:
1. As a LOGICAL MODEL allowing you to structure and organise
the system. In this case, you think about how to provide
application functionality solely in terms of services and
combinations of services.
2. As a FLEXIBLE APPROACH TO IMPLEMENTING clientβserver
systems. The logical model is clientβserver, but both
clients and servers are realised as distributed objects
communicating through the software bus.
Middleware, and the standards
MIDDLEWARE is the software sitting in the middle, between the
objects, providing the services they need to interoperate.
Sommerville lists what a broker must provide.
CORBA β the Common Object Request Broker Architecture, from the
Object Management Group (OMG). An international standard
defining an architecture for an ORB. Four major elements:
1. AN OBJECT MODEL
a CORBA object is an encapsulation of state with a
well-defined, language-neutral interface defined in an
IDL (Interface Definition Language)
2. AN OBJECT REQUEST BROKER
handles requests for service delivery: locates the
object, ensures it is ready, transmits the request,
returns the result
3. OBJECT SERVICES
common services many distributed systems need:
directory/naming services, transaction services,
persistence, security, event notification
4. COMMON COMPONENTS / FACILITIES
higher-level, domain-specific standard components
HOW A CALL WORKS β the mechanism worth understanding, because
every RPC system since works this way:
caller object
β calls a local STUB (a proxy with the same interface)
βΌ
STUB marshals the arguments into a byte stream
β
βΌ
ORB / network (the wire)
β
βΌ
SKELETON unmarshals, invokes the real method
β
βΌ
target object
The stub and skeleton are GENERATED FROM THE IDL, which is
why the call site looks like an ordinary method call. That
resemblance is the design goal β and, as below, also the
problem.
OTHER TECHNOLOGIES in this family:
Java RMI Java-only distributed objects
DCOM Microsoft's equivalent
.NET Remoting its successor
SOAP / WSDL XML-based web services, an ORB by
another name
gRPC + Protobuf the modern, and much better-engineered,
descendant: an IDL, generated stubs,
binary encoding, HTTP/2 transport
NOTE THE CONTINUITY: gRPC is the same idea as CORBA β define
an interface, generate stubs, call remotely β with three
decades of hard-won corrections. The idea was not wrong; the
first implementations were.
Why the transparency leaks β and what replaced it
THE CENTRAL DESIGN GOAL of distributed objects was LOCATION
TRANSPARENCY: a remote call should look like a local one. This
is the goal that fails, and the reasons are worth learning as a
list.
THE FALLACIES OF DISTRIBUTED COMPUTING β assumptions that a
transparent remote call implicitly makes, all of them false:
1. THE NETWORK IS RELIABLE β it is not; calls are lost
2. LATENCY IS ZERO β a local call is ~1 ns; a
same-datacentre call is
~500,000 ns; a
cross-continent call is
~150,000,000 ns
3. BANDWIDTH IS INFINITE β passing a large object
graph by value is
catastrophic
4. THE NETWORK IS SECURE β it is not
5. TOPOLOGY DOESN'T CHANGE β it does
6. THERE IS ONE ADMINISTRATOR β there is not
7. TRANSPORT COST IS ZERO β marshalling and
serialisation cost real CPU
8. THE NETWORK IS HOMOGENEOUS β it is not
PUT NUMBERS ON FALLACY 2, because it is the decisive one:
local method call β 1 ns
same-datacentre RPC β 0.5 ms = 500,000 ns
cross-continent RPC β 150 ms = 150,000,000 ns
A remote call is between 500 thousand and 150 million times
more expensive than a local one. Any abstraction that makes
those two look identical in source code is HIDING SOMETHING
THAT MATTERS ENORMOUSLY.
THE CONSEQUENCE IN PRACTICE β the "chatty interface" problem.
Code written as if calls were free:
for (Order o : customer.getOrders()) // 1 call
for (Line l : o.getLines()) // N calls
total += l.getPrice(); // N Γ M calls
With 50 orders of 10 lines each, on a 0.5 ms link:
calls = 1 + 50 + 500 = 551
time = 551 Γ 0.5 ms = 275 ms
Rewritten as ONE coarse-grained call returning the total:
time = 0.5 ms
A 550Γ difference, from the same logic β and the local
version of that loop runs in microseconds, so nothing in
testing on one machine would reveal the problem.
THE RULE THIS YIELDS: DISTRIBUTED INTERFACES MUST BE
COARSE-GRAINED. Ask for everything you need in one call. This
is the direct opposite of good local object design, where
fine-grained accessors are a virtue β and that contradiction
is exactly why "just distribute your objects" cannot work.
WHAT REPLACED DISTRIBUTED OBJECTS:
Β· SERVICE-ORIENTED ARCHITECTURE and REST β stop pretending
remote is local. Make the network explicit, make calls
coarse-grained, make services stateless, use a document
(a representation) rather than an object reference.
Β· MESSAGE-BASED / EVENT-DRIVEN INTEGRATION β accept that the
call may not return, and design for asynchrony from the
start.
Β· gRPC β keep the IDL and generated stubs, but with explicit
streaming, deadlines, and cancellation, so failure and
latency are part of the programming model rather than
hidden from it.
THE LASTING LESSON, which is the real content of this topic:
A GOOD ABSTRACTION HIDES DETAIL YOU DO NOT NEED. A LEAKY
ABSTRACTION HIDES DETAIL YOU DO NEED. Location is the second
kind.
The contradiction at the heart of this topic is worth stating plainly: good local object design favours many small, fine-grained methods, and good distributed interface design demands few coarse-grained ones. A technology promising that local and remote calls are interchangeable is therefore promising something incoherent β which is why distributed objects lost to REST and messaging.
π Go further: the honest replacement for location transparency is to make failure and time part of the type. Modern RPC frameworks require a deadline on every call, return a status that includes UNAVAILABLE and DEADLINE_EXCEEDED alongside your result, and pair with circuit breakers that stop calling a failing dependency rather than queueing behind it. The design philosophy inverts CORBA's: instead of hiding that the call crosses a network, force the programmer to say what should happen when it does not come back. Search "circuit breaker pattern deadlines gRPC resilience".
π‘ Exam angle: draw the distributed object architecture with objects above and below a software bus, and state the defining property β no distinction between clients and servers, every object both provides and requests services. List the advantages (delays decisions on where services are provided, open, flexible and scalable, dynamically reconfigurable) and the key disadvantage (a more complex paradigm than clientβserver, harder to design and visualise). Describe CORBA's four elements (object model, object request broker, object services, common facilities) and the role of the IDL, and name the two uses of the architecture β as a logical model, and as a flexible way to implement clientβserver systems.
Syllabus points
Distributed object model
Create a free account to tick topics off, take notes as you read, watch the video lessons and get a day-by-day study plan built around your exam date.