Seconds of response time – Hours of offline maintenance – Gigabytes of data • Now – Diverse platforms (i.e. from mobile devices to cloud-based clusters on thousands of multicore processors) – Millisecond to microsecond response times – 100% uptime – Petabytes of data
Shared Mutable State • Synchronization/Locks • Non-Deterministic/Race Conditions • Code is hard to understand and maintain – Blocking a single thread • Resource consuming • High wake-up cost
message passing – Easy parallelization • Loose Coupling – Separated Producer and Consumer – Hiding the details of event propagation and communication – Location Independence – Easy to extend – Easy to maintain – Providing flexibility while programming
consumers – Higher throughput – Lower latency – Effective hardware utilization and lower costs • Push based – Resources not wasted by polling or waiting on data
or upgraded on demand based on its usage – Scale up or down without redesign/rewrite – Cost effective on cloud deployments as it can grow or shrink elastically based on usage
handling • Not all problems can be dealt with where they occur – Clustered servers • Failover for whole application • Recovery is time consuming thus costly • Potential risk of cascading failures
failures – Observe to detect it whenever it happens, not when its too late • Event-driven model to the rescue – Full isolation as a result of loose coupling – Failures can be packaged and sent as events where other components decides how to deal with it – Helps keeping business flow clear and lets you deal with failure in a more rigid and planned way – Location transparent
Applications are – Quick to respond and react – Responds fast even in case of failure • Not responding in a timely manner – Might cause total failure (Medical Systems) – Decreased utility (Finance, Telco, Internet)