Architecting resilient computing systems: A component-based approach for adaptive fault tolerance