  In the ever-shifting landscape of software engineering, we recognize the need
for adaptation and evolution to maintain system dependability. As each software
iteration potentially introduces new challenges, from unforeseen bugs to
performance anomalies, it becomes paramount to understand and address these
intricacies to ensure robust system operations during the lifetime. This work
proposes employing software diversity to enhance system reliability and
performance simultaneously. A cornerstone of our work is the derivation of a
reliability metric. This metric encapsulates the reliability and performance of
each software version under adverse conditions. Using the calculated
reliability score, we implemented a dynamic controller responsible for
adjusting the population of each software version. The goal is to maintain a
higher replica count for more reliable versions while preserving the diversity
of versions as much as possible. This balance is crucial for ensuring not only
the reliability but also the performance of the system against a spectrum of
potential failures. In addition, we designed and implemented a diversity-aware
autoscaling algorithm that maintains the reliability and performance of the
system at the same time and at any scale. Our extensive experiments on
realistic cloud microservice-based applications show the effectiveness of the
proposed approach in this paper in promoting both reliability and performance.
