Atributos de Calidad y Tacticas Flashcards
Que son los QAs?
son una propiedad mensurable o testeable del sistema .
son necesarios para evaluar y medir qu´e tan bien
un sistema cumple con los est´andares y expectativas del usuario
Que son las tacticas?
Una vez que comprendemos la importancia de los atributos de calidad,
es natural querer maximizarlos todos en nuestro sistema. Sin embargo, nos
enfrentamos al hecho de que no es posible satisfacer todos los atributos al mismo
nivel. Por lo tanto, es imperativo tomar decisiones informadas sobre qu´e atributos
de calidad se priorizan para el sistema y c´omo equilibrarlos mediante el uso de
t´acticas adecuadas.
Las t´acticas son t´ecnicas o enfoques espec´ıficos que se utilizan para lograr
atributos de calidad en la arquitectura de software. Cada atributo de calidad
puede requerir t´acticas espec´ıficas para mejorar o mantener su cumplimiento.
Sin embargo, algunas t´acticas pueden entrar en conflicto con otras o tener efectos
secundarios no deseados en diferentes atributos de calidad.
Con este conflicto entramos en trade-off, que se refiere a la necesidad de
tomar decisiones que afectan a unos atributos en beneficio de otros.
Availability (Disponibilidad)
Es la habilidad del sistema para reparar o enmascarar fallas de manera tal
que el per´ıodo que el sistema est´a fuera de servicio no exceda un determinado
valor durante un lapso de tiempo especificado.
Una falla (failure) ocurre cuando el sistema deja de brindar un servicio
consistente con su especificaci´on.
Una falta (fault) se convierte en falla si no es corregida o enmascarada.
Tipos de fallas
Los tipos de fallas que nos podemos encontrar son:
1. Omission: El sistema no responde a un pedido
2. Crash: El sistema sufre omisiones repetitivas.
3. Timming: El sistema responde, pero fuera de tiempo.
4. Response Failure: El sistema responde, pero con un valor incorrecto.
Regla de los cinco 9’s
Es una m´etrica que se utiliza para medir la confiabilidad y disponibilidad de
un sistema o servicio. Se expresa como un porcentaje y significa que el sistema
est´a disponible el 99.999% del tiempo.
Tacticas para Availability (Disponibilidad)
Prevenci´on
1. Dise˜no redundante: La idea es implementar redundancia en com-
ponentes cr´ıticos para que, en caso de falla, otro componente pueda
ocupar su lugar y mantener la disponibilidad del sistema.
2. Transacciones: El uso de transacciones en el dise˜no del sistema
puede evitar incoherencias y la p´erdida de datos en caso de error. Las
transacciones garantizan que las operaciones se completen o reviertan
por completo, manteniendo la integridad de los datos y asegurando la
disponibilidad del sistema.
* Detecci´on
1. Envio de se˜nales y monitoreo: La idea es implementar mecanismos
de detecci´on que impliquen el envio de se˜nales o mensajes peri´odicos
entre componentes para verificar su estado y asegurar que sigan
funcionando correctamente.
Un envio de se˜nales puede ser el famoso Ping y un sistema de moni-
toreo puede ser Datadog.
2. Votaci´on: Utilizado en sistemas con redundancia, la votaci´on consiste
en monitorear diferentes componentes y comparar sus resultados para
detectar errores. Las coincidencias en la mayor´ıa de los componentes
se consideran v´alidas y las no coincidencias se ignoran, lo que permite
detectar y recuperar las fallas del sistema.
* Recuperaci´on
1. Redundancia activa: Esta t´actica implica implementar compo-
nentes o servicios duplicados que se ejecutan simult´aneamente, donde
uno puede controlar y reanudar las operaciones en caso de que falle
el componente principal. Esto permite una recuperaci´on r´apida y
mejora la disponibilidad del sistema.
2. Redundancia pasiva: Similar a la redundancia activa, con la difer-
encia de que requiere una intervenci´on manual para activar el compo-
nente redundante.
3. Repuesto: Esta t´actica consiste en tener componentes de repuesto
disponibles y listos para reemplazar r´apidamente aquellos que fallen.
Performance (Rendimiento)
capacidad del sistema para responder a eventos y realizar sus
funciones de manera r´apida y eficiente.
Los eventos pueden ser de las siguientes naturalezas:
1. Peri´odicos (ej. cada 10 ms)
2. Estoc´asticos (ej. 100 req/s)
3. Espor´adicos (ej. alarma)
El rendimiento de un sistema se ve afectado por las interacciones entre sus
elementos. Esto incluye la velocidad y la eficiencia en el uso de la red y la
percepci´on del rendimiento por parte del usuario. La arquitectura del sistema
juega un papel importante en la determinaci´on de esta interacci´on
¿cu´ando atacar los problemas de
performance?
- Durante el tiempo de ejecuci´on: En el caso de una aplicaci´on en
ejecuci´on, puede resolver un problema de rendimiento proporcionando
herramientas para que su c´odigo realice la acci´on correcta. Esto implica
identificar ´areas cr´ıticas donde el rendimiento puede verse afectado y
recopilar datos sobre tiempos de respuesta, consumo de recursos y otras
m´etricas relevantes. Con estas m´etricas en la mano, es posible optimizar
el c´odigo y los algoritmos para mejorar la eficiencia y la velocidad de la
aplicaci´on. - Optimizar de forma temprana: Un enfoque proactivo es abordar el
rendimiento temprano en el desarrollo, considerando todas las decisiones
arquitect´onicas. Al tomar decisiones de dise˜no, es importante considerar
c´omo estas opciones afectar´an el rendimiento general del sistema. Algunas
decisiones de arquitectura pueden ser dif´ıciles de revertir o mejorar con la
optimizaci´on tard´ıa, por lo que es mejor abordarlas temprano para evitar
problemas de rendimiento graves en el futuro.
Es importante tener en cuenta que la optimizaci´on prematura no significa caer
en la trampa de la optimizaci´on excesiva, lo que puede conducir a una arquitectura
compleja que es dif´ıcil de mantener.
Network Perfomance
Throughput: Se define como la velocidad a la que se transfiere la infor-
maci´on entre los diferentes componentes del sistema y, por lo general, se
mide en bytes por segundo. Esta m´etrica incluye tanto los datos de la
aplicaci´on como los gastos generales asociados con la comunicaci´on, que
pueden surgir tanto de la configuraci´on inicial como de la interacci´on de
los componentes.
2. Capacity: Se refiere a la carga m´axima que puede soportar, es decir, el
rendimiento m´aximo que el sistema puede manejar de manera efectiva. Para
medir la capacidad, las personas suelen utilizar el concepto de transacciones
por segundo (tx/s, tps).
Bandwidth: Representa el rendimiento m´aximo disponible en un canal
de comunicaci´on en particular.
Esta es una medida importante para
comprender la capacidad de transmisi´on de la red. Adem´as, ”ancho de
banda utilizable” se refiere a la porci´on de ancho de banda disponible para
la aplicaci´on en cuesti´on que es relevante para determinar el rendimiento
de la red en el contexto espec´ıfico de la aplicaci´on.
4. Estilos de Interacci´on: El estilo de la arquitectura juega un papel
importante en la forma en que se comunican los componentes y, por
lo tanto, afecta directamente el rendimiento de la red. Los estilos m´as
efectivos buscan minimizar el acceso a la red,
User-Perceived Performance
teniendo en cuenta
c´omo perciben y experimentan el rendimiento del sistema en t´erminos de tiempo
de respuesta y eficiencia. Hay 2 tipos de m´etricas:
Completion Time (Response Time): Esta m´etrica representa el tiempo
requerido por el sistema para completar una solicitud espec´ıfica (request)
desde la perspectiva del usuario.
Dado que estos tiempos pueden ser
peque˜nos, variables y dependientes de diferentes par´ametros, su medici´on
desde el exterior del sistema puede resultar desafiante.
2. Latency: Se refiere al tiempo m´ınimo que el sistema necesita para ejecutar
cualquier solicitud, incluso si esta implica no realizar ninguna acci´on. Seg´un
la descripci´on de Fowler, es el tiempo que transcurre desde el est´ımulo
inicial hasta la primera indicaci´on de respuesta. Por otro lado, Fielding
la define como el tiempo que pasa entre el est´ımulo inicial y la primera
indicaci´on de respuesta.
Responsiveness, que denota el tiempo que un sistema requiere
para reconocer o ”aceptar” una solicitud del usuario. Algunos ejemplos ilustran
la importancia de esta m´etrica, como el caso de una progress bar que mejora
la responsividad, pero no necesariamente afecta el completion time.
Efficiencia
Efficiency
Es una medida importante que se refiere a la capacidad que tiene un sistema
para ofrecer un rendimiento ´optimo en relaci´on con los recursos consumidos.
Espec´ıficamente, la eficiencia se relaciona con la relaci´on entre la performance y
los recursos involucrados en cumplir con un pedido o en realizar una acci´on.
¿como podemos evaluar la eficiencia? F´acil, con una prueba
de Load Test o prueba de carga. Este tipo de pruebas simulan situaciones
realistas de uso que nos permiten evaluar la eficiencia y la performance en
diversas situaciones en las cuales se aumentan la carga.
El ultimo concepto importante sobre eficiencia es el Load Sensitivity (sensibil-
idad de carga, para los amigos), este concepto representa la variaci´on del tiempo de
respuesta en funci´on del nivel de carga. Cuando la performance empeora a medida que
aumenta la carga, se evidencia una sensibilidad a la carga, lo cual indica que el sistema
puede experimentar una disminuci´on del rendimiento bajo cargas m´as altas.
Tacticas para performance
dos categor´ıas principales: Control
Resource Demand y Manage Resources.
Control Resource Demand
1. Cache
2. Lazy Loading: Cargar datos o recursos solo cuando se necesitan, en lugar de cargarlos todos al inicio.
3. Prefetching: Anticipar y cargar datos que probablemente seran requeridos en un futuro cercano
4. Rate Limiting: Restringir la cantidad de solicitudes que un usuario o
sistema puede realizar en un per´ıodo de tiempo determinado
Manage Resources
1. Load Balancing
2. Asynchronous Operations: Utilizar operaciones asincr´onicas para liberar recursos mientras se espera la finalizaci´on de ciertas tareas,
3. Schedule Resources: Es el acceso a recursos a traves de politicas como FIFO, prioridad fija, prioridad dinamica.
Scalability (Escalabilidad)
capacidad para soportar una gran cantidad de componentes o las
interacciones entre ellos [Fielding]. Es la capacidad del sistema para adaptarse al
aumento de usuarios, transacciones y niveles de actividad, entre otros factores.
La efectividad de agregar recursos al sistema es crucial para la escalabilidad. Esta
efectividad se mide en t´erminos de una mejora mensurable en una caracter´ıstica de
calidad sin invertir recursos innecesarios o interrumpir el funcionamiento del sistema.
Tipos de escalabilidad?
Escalabilidad vertical (scaling up): Es el proceso de agregar m´as recursos a
las unidades f´ısicas, lo que se conoce como ”crecer en hardware”. Por ejemplo,
aumentar la memoria de un servidor
Escalabilidad horizontal (scaling out): implica agregar m´as recursos a las
unidades l´ogicas, como tener m´ultiples servidores colaborando como un todo.
El agregar m´as servidores a un cl´uster es un ejemplo de esto. Debido a la
coordinaci´on necesaria entre los servidores, esta forma de escalabilidad puede ser
m´as potente, pero tambi´en puede ser m´as dif´ıcil de implementar.
Tacticas para escalabilidad
Stateless: implica dise˜nar los componentes del sistema de tal manera que
no tengan informaci´on sobre el estado de las interacciones anteriores con el
cliente.
Horizontal Scale: Es una estrategia para aumentar la capacidad del sistema
agregando m´as instancias o nodos en paralelo.
Avoid Hardcoded Values: Al evitar el uso de valores o configuraciones hard-
codeados, se facilita la escalabilidad.
Async Design: Permite que las tareas se realicen de manera no secuencial,
evitando bloqueos y esperas innecesarias.
Sharding (Fragmentaci´on o particionado): Consiste en dividir una base
de datos o conjunto de datos grande en ”fragmentos”. Cada shard maneja un
subconjunto de datos. Esta estrategia permite distribuir la carga entre varios
servidores o bases de datos, lo que mejora la capacidad de manejar grandes
cantidades de datos y mejora la eficiencia del acceso a la informaci´on.