¿Cuales son los desafíos de los Sistemas Distribuidos?

Y bueno la definición de lo que son los Sistemas Distribuidos está muy sencilla de encontrar (Wikipedia y el Rincón del Vago) así que sólo les traigo los desafíos de los sistemas Distribuidos para que hagan su tarea de la profesora Xochipilli:

DESAFÍOS DE LOS SISTEMAS DISTRIBUIDOS
* Heterogeneidad
* Extensibilidad
* Seguridad
* Escalabilidad
* Tolerancia a Fallas
* Concurrencia
* Transparencia
DESAFÍOS: Heterogeneidad
La heterogeneidad se aplica en los siguientes elementos:
* Redes
* Hardware de computadores
* Sistemas operativos
* Lenguajes de programación
* Implementaciones de diferentes
* Desarrolladores
Middleware: es el estrato de software que provee una abstracción de programación, así como un enmascaramiento de la heterogeneidad subyacente de las redes, hardware, sistemas operativos y lenguajes de programación. Ejem: Corba, Java RMI
Heterogeneidad y código móvil. Código que puede enviarse desde un computador a otro y ejecutarse en este último. El concepto de máquina virtual ofrece un modo de crear código ejecutable sobre cualquier hardware.
DESAFÍOS: Extensibilidad
Es la característica que determina si el sistema puede extenderse de varias maneras. Un sistema puede ser abierto o cerrado con respecto a extensiones de hardware o de software. Para lograr la extensibilidad es imprescindible que las interfaces clave sean publicadas.
Los Sistemas Distribuidos Abiertos pueden extenderse a nivel de hardware mediante la inclusión de computadoras a la red y a nivel de software por la introducción de nuevos servicios y la re implementación de los antiguos. Otro beneficio de los sistemas abiertos es su independencia de proveedores concretos.
DESAFÍOS: Seguridad
La seguridad tiene tres componentes: Confidencialidad: protección contra individuos no autorizados,
Integridad: protección contra la alteración o corrupción, Disponibilidad: protección contra la interferencia que impide el acceso a los recursos
DESAFÍOS: Escalabilidad
Se dice que un sistema es escalable si conserva su efectividad cuando ocurre un incremento significativo en el número de recursos y en el número de usuarios.
DESAFÍOS: Tratamiento de Fallos
Detección de fallos: Ejem. Se pueden utilizar sumas de comprobación (checksums) para detectar datos corruptos en un mensaje.
Enmarascamiento de fallos: Ejem: Los mensajes pueden retransmitirse, Replicar los datos.
Tolerancia de fallos: los programas clientes de los servicios pueden diseñarse para tolerar ciertos fallos. Esto implica que los usuarios tendrán también que tolerarlos.
Recuperación de fallos: implica el diseño de software en el que, tras una caída del servidor, el estado de los datos puede reponerse o retractarse (rollback) a una situación anterior.
Redundancia: emplear componentes redundantes.
DESAFÍOS: Concurrencia
Existe la posibilidad de acceso concurrente a un mismo recurso. La concurrencia en los servidores se puede lograr a través de threads. Cada objeto que represente un recurso compartido debe responsabilizarse de garantizar que opera correctamente en un entorno concurrente. Para que un objeto sea seguro en un entorno concurrente, sus operaciones deben sincronizarse de forma que sus datos permanezcan consistentes.
DESAFÍOS: Transparencia
Transparencia de acceso: permite acceder a los recursos locales y remotos empleando operaciones idénticas.
Transparencia de ubicación: permite acceder a los recursos sin conocer su localización.
Transparencia de concurrencia: permite que varios procesos operen concurrentemente sobre recursos compartidos sin interferencia mutua.
Transparencia de replicación: permite replicar los recursos sin que los usuarios y los programadores necesiten su conocimiento.
Transparencia frente a fallos: permite ocultar fallos.
Transparencia de movilidad: permite la reubicación de recursos y clientes en un sistema sin afectar la operación de los usuarios y los programas.
Transparencia de rendimiento: permite reconfigurar el sistema para mejorar el desempeño según varíe su carga.
Transparencia al escalado: permite al sistema y a las aplicaciones expandirse en tamaño sin cambiar la estructura del sistema o los algoritmos de aplicación.