On 29 October 2013 02:08, David T. Lewis <le...@mail.msen.com> wrote:

> I have some experience with this, not related to Smalltalk but maybe
> still relevant. I have worked with systems that were designed around
> networked message passing, implemented on platforms like MS-DOS with time
> slicing kernels, Series I, OS/2, etc. These systems were designed to
> operate
> with asynchronous message passing protocols. The asynchronous designs were
> intended to support primitive OS environments, including MS-DOS with
> software interrupts for multitasking.
>
> These are production-critical manufacturing applications, and in the course
> of modernizing them I have reimplemented the network protocols in Java and
> moved them to new computing platforms. Along the way I have found that the
> asynchronous designs could always be replaced by bidirectional send-receive
> transactions running in the context of a thread or process. Even the
> systems
> that appeared to be most complex have turned out to work perfectly well
> when modeled as synchronous send-receive transactions on a bidirectional
> communication channel. The software is much simpler to understand and debug
> when structured in this manner.
>
> My conclusion is that designing around asynchronous, loosely coupled
> channels sounds like a good idea, but in practice it leads to unnecessary
> complexity, and to systems that are difficult to debug and support.
>
> $0.02
>
> Dave
>

Example from my life: real-time voice over IP project.
>From very starting, it was designed as a bidirectional connection between
two peers.
Even though, that outgoing/incoming traffic was handled separately, the
model was still there
and treated as 'single conversation channel'.

Later we wanted to introduce many-peer conversation and found that the
above bi-directional model simply
does not fits.. everything falls apart.
Simple example: you have 3 peers A, B , C.
So, you can represent is in this way:
  A<->B , A<->C , B<->C,
or this:
  A -> (B,C)
  B -> (A, C)
  C -> (A,B)

The bidirectional model implies that you have symmetry in number of
outgoing and incoming channels (hence <->)..
and if you send data over one of them, only single node will receive it.
Logically, that leads to sending same data to two different channels. So,
at very beginning you nailing down
how the traffic is going to flow.

With unidirectional model, as illustrated when you sending data over one
channel,
it will be delivered to all participants, and you don't have to do it
yourself - the transport layer handles it for you.

The thing is, that the way how data gets to receivers is heavily depends on
network topology:
imagine that two peers, B, C belong to same subnet, and latency between
them is miniscule comparing
to latency between A and one of them. The logical choice then should be to
route the signal from A
to either B or C and then broadcast from middle point to the listener which
is left.
Not possible with bidirectional model, because A insists on having direct
socket connection with both B and C.

Same goes for proxies: imagine that node A is connected via proxy..
and not directly to nodes B and C.. that means that to deliver its voice
traffic to both of them it should
just send a single packet to proxy, and then proxy will broadcast it to
listeners.
Not going to happen with bidirectional model, A will still send two very
same packets to same proxy.. but with different destination
address.

Or even, it could be, that receiving traffic from A to C goes faster via B,
while sending traffic from C to A is faster to do directly..
So try to fit that into bidirectional model of communication and see where
it goes.

Yes, i agree it is easier to put everything into sequential bidirectional
model which makes everything so simple.
If it fits. But if its not, you should not even try to fit it..

My point is, that IP is inherently asynchronous and unidirectional.

-- 
Best regards,
Igor Stasenko.

Reply via email to