Architecting fault-tolerant software systems by