Client-Server Model

So why use client-server?

Well, just using procedures is a kind of soft-modularity - our modules agree to only interact in some way, but nothing’s actually stopping them from messing with each other.

Just using procedures is also fate-sharing. If the callee fails, the caller fails. This is an error that shouldn’t propogate up to the caller - but it does.

So the client-server modules enforces modularity by only allowing the caller and callee to communicate over one channel/wire. We can represent interactions with a timing diagram.

But there are potential issues too:

  • representation
    • serialization, deserialization
    • little-endian, big-endian
  • ordering of messages
  • client or server behaving badly

Advantages:

  • no shared state (aside from messages)
    • errors can only propogate via messages
  • limited interaction = limited errors
  • client and server can protect against failure to response
    • e.g. timeouts
  • well-defined interface
    • client and server can have independent implementations

Hard v. Soft Modularity

Whereas soft modularity is an agreement to only interact in some way, hard modularity means that components can only interact in well-defined ways.

Isolation: calling convention (soft) v. physical boundaries

Mechanism: functions, classes, etc v. client/server

Failures: total v. partial

Programmability: easy v. hard

The Bad: less isolation v. more executions