What makes distributed systems complex? -heterogeneity -openness -security -scalability -failure handling -concurrency -transparency DNS - why is it a good example of a distributed system? Models - client/server, multiple servers, proxies/caches, p2p Models - synchronous versus asynchronous systems Failure models - crash, byzantine Middleware - RPC, distributed objects, marshalling, stub Web Services - REST/SOAP/XML-RPC, compare to RMI Clock sync - synch, async, berkeley (internal/external) Logical time - causal ordering (happened-before), lamport, vector (why use vector instead of lamport?), cuts/global state (consistent, inconsistent) Failure detection - keep alive messages Mutual Exclusion - safety/liveness -central server, token ring, mutlicast and logical clocks Election - ring, bully Consensus - possible in sync w/ < 1/3 failure, impossible if communication unreliable, impossible in async Multicast - building the tree (dense/sparse mode), fault tolerance, FIFO ordering (local seq no), causal ordering (vector timestamps), total ordering (sequencer process) Replication - passive (one primary), active (mcast to all), lazy (talk to one, it updates others when it can)