Handling Failures In Distributed Systems