Haga espacio para JavaSpaces, parte 1

Este artículo comienza un segundo hilo de la serie Jiniology . En junio, Bill Venners lanzó Jiniology con una descripción general de la tecnología Jini, una nueva y poderosa infraestructura para construir e implementar sistemas distribuidos que se organizan como federaciones de servicios. Este hilo, que aparecerá cada dos meses en esta columna, se centra en JavaSpaces,un servicio Jini principal de Sun Microsystems que proporciona un medio de alto nivel para crear aplicaciones colaborativas y distribuidas. Si está creando aplicaciones con Jini, querrá saber cómo usar JavaSpaces para coordinar a los participantes en una federación Jini. Pero también es importante recordar que puede usar JavaSpaces por separado de Jini, como una herramienta para construir sistemas distribuidos generales en Java. En cualquier caso, vale la pena echarle un vistazo a JavaSpaces, porque puede facilitar significativamente el diseño y la codificación de aplicaciones distribuidas.

Haga espacio para JavaSpaces: ¡lea toda la serie!

  • Parte 1. Facilitar el desarrollo de aplicaciones distribuidas con JavaSpaces
  • Parte 2. Cree un servidor informático con JavaSpaces
  • Parte 3. Coordine sus aplicaciones Jini con JavaSpaces
  • Parte 4. Explore las transacciones de Jini con JavaSpaces
  • Parte 5.Haga que su servidor informático sea robusto y escalable

En esta serie, comenzaremos presentándole el modelo de programación único de JavaSpaces, que es bastante diferente de otras herramientas de red y distribuidas con las que quizás esté familiarizado. En artículos posteriores, cubriremos los detalles de la API de JavaSpaces y cómo puede usarla para unir procesos en una aplicación distribuida, y describiremos cómo interactúa JavaSpaces con otros componentes de Jini. A lo largo de la serie, verá que JavaSpaces es simple (la API consta de solo un puñado de operaciones), expresivo (una gran cantidad de problemas se pueden resolver usando JavaSpaces) y poderoso (puede construir sistemas distribuidos sofisticados con pequeñas cantidades del código JavaSpaces).

Empecemos.

Un nuevo modelo de computación distribuida

La construcción de aplicaciones distribuidas con herramientas de red convencionales generalmente implica pasar mensajes entre procesos o invocar métodos en objetos remotos. En las aplicaciones JavaSpaces, en cambio, los procesos no se comunican directamente, sino que coordinan sus actividades intercambiando objetos a través de un espacio o memoria compartida. Un proceso puede writeintroducir nuevos objetos en un espacio, takeobjetos de un espacio oread(hacer una copia de) objetos en un espacio; La Figura 1 muestra varios procesos (representados por Dukes) interactuando con espacios usando estas operaciones. Al tomar o leer objetos, los procesos utilizan una coincidencia simple, basada en los valores de los campos, para encontrar los objetos que les interesan. Si un objeto coincidente no se encuentra inmediatamente, entonces un proceso puede esperar hasta que llegue uno. En JavaSpaces, a diferencia de los almacenes de objetos convencionales, los procesos no modifican los objetos en el espacio ni invocan sus métodos directamente; mientras que allí, los objetos son solo datos pasivos. Para modificar un objeto, un proceso debe eliminarlo explícitamente, actualizarlo y reinsertarlo en el espacio.

Los espacios son almacenes de objetos con varias propiedades importantes que contribuyen a hacer de JavaSpaces una herramienta potente y expresiva. Miremos más de cerca:

  • Los espacios son compartidos: muchos procesos remotos pueden interactuar con un espacio al mismo tiempo; el propio espacio maneja los detalles del acceso concurrente, lo que le permite concentrarse en el diseño de los protocolos de alto nivel entre sus procesos.

  • Los espacios son persistentes: los espacios proporcionan un almacenamiento confiable para los objetos. Cuando almacena un objeto en un espacio, permanecerá allí indefinidamente hasta que se retire. También puede solicitar un tiempo de concesión durante el cual se debe almacenar un objeto. Una vez almacenado en el espacio, un objeto permanecerá allí hasta que finalice su tiempo de arrendamiento (que puede renovarse) o hasta que un proceso lo elimine explícitamente. Analizaremos los arrendamientos con más profundidad más adelante en esta serie.

  • Los espacios son asociativos: los objetos en un espacio se ubican mediante búsqueda asociativa, no por ubicación de memoria o por identificador. La búsqueda asociativa proporciona un medio sencillo de encontrar los objetos en los que está interesado según su contenido, sin tener que saber cómo se llama el objeto, quién lo creó o dónde está almacenado. Para buscar un objeto, crea una plantilla (un objeto con algunos o todos sus campos establecidos en valores específicos, y los demás se dejan nullpara actuar como comodines). Un objeto en el espacio coincide con una plantilla si coincide exactamente con los campos especificados de la plantilla. Verá que, con la búsqueda asociativa, puede expresar fácilmente consultas para objetos como "¿Hay tareas para calcular?" o "¿Hay alguna respuesta al factor primo que pedí? "

  • Los espacios son transaccionalmente seguros: JavaSpaces utiliza el servicio de transacciones de Jini para garantizar que una operación en un espacio sea atómica (se aplica la operación o no). Las transacciones se admiten para operaciones únicas en un solo espacio, así como para operaciones múltiples en uno o más espacios (se aplican todas las operaciones o ninguna). Como verá más adelante en la serie, las transacciones son una forma importante de lidiar con fallas parciales.

  • Los espacios le permiten intercambiar contenido ejecutable: mientras que en un espacio, los objetos son solo datos pasivos, no puede modificarlos ni invocar sus métodos. Sin embargo, cuando lee o saca un objeto de un espacio, se crea una copia local del objeto. Al igual que con cualquier otro objeto local, puede modificar sus campos públicos e invocar sus métodos, incluso si nunca antes ha visto un objeto como este. Esta capacidad le brinda un mecanismo poderoso para extender el comportamiento de sus aplicaciones a través de un espacio.

A medida que avanza esta serie, le mostraremos cómo estas propiedades juegan un papel clave para permitirle crear aplicaciones distribuidas que funcionan bien en el entorno Jini, donde la red es a menudo espontánea y los procesos se unen y abandonan la computación de forma dinámica, a veces debido a dispositivos o falla de red.

Orígenes de JavaSpaces

Hemos descrito JavaSpaces como un nuevo modelo de computación distribuida, pero sus orígenes se remontan a la Universidad de Yale a principios de la década de 1980. Allí, el Dr. David Gelernter desarrolló una herramienta llamada Linda para crear aplicaciones distribuidas. Linda consta de una pequeña cantidad de operaciones combinadas con un almacén persistente llamado espacio de tuplas. Estas operaciones son ortogonales a cualquier lenguaje de programación en particular; forman parte de un lenguaje de coordinación que se puede agregar a cualquier otro lenguaje de cálculo.El resultado de la investigación de Linda fue sorprendente: al usar un almacén de objetos junto con una pequeña cantidad de operaciones simples, puede implementar fácilmente una gran clase de problemas paralelos y distribuidos utilizando técnicas que alivian muchos de los escollos de la construcción de sistemas en red. En otras palabras, los sistemas basados ​​en el espacio no solo son simples (requieren solo unas pocas operaciones), sino también expresivos (se prestan bien para resolver muchos problemas distribuidos).

El trabajo del Dr. Gelernter inspiró el servicio JavaSpaces de Sun y también influyó en el diseño de los componentes de búsqueda y descubrimiento de la tecnología principal de Jini (que verá a medida que avanza la serie Jiniology ). Si bien JavaSpaces heredó el modelo espacial de Linda, los diseñadores de JavaSpaces han actualizado el modelo de manera significativa, aprovechando el poder de los objetos Java, Jini, RMI y la serialización de objetos.

JavaSpaces en contexto

Nuestra descripción hasta ahora ha sido un poco abstracta, así que consideremos algunos ejemplos de aplicaciones distribuidas reales que puede modelar como procesos que intercambian objetos a través de espacios.

Sistemas de chat

Considere un simple sistema de chat multiusuario, en el que un espacio sirve como área de chat que contiene todos los mensajes que componen una discusión. Para hablar, un participante deposita objetos de mensaje en el espacio. Todos los miembros del chat esperan a que aparezcan nuevos objetos de mensaje, los leen y muestran su contenido. Los que lleguen tarde pueden examinar los objetos de mensaje existentes en el espacio para revisar la discusión anterior. De hecho, dado que el espacio es persistente, un nuevo participante puede ver la discusión mucho después de que todos los demás se hayan ido, y los participantes pueden incluso regresar mucho más tarde para retomar la conversación donde la dejaron. La lista de participantes del chat también se puede mantener en el espacio y actualizar cada vez que alguien se une o abandona la conversación.

Servidores informáticos

Ahora considere analizar los datos del radiotelescopio en tiempo real en busca de signos de vida extraterrestre (tanto como lo hace el proyecto SETI @ home). Dichos datos son voluminosos y analizarlos es un trabajo computacionalmente intensivo que se adapta bien a la computación en paralelo mediante una red de computadoras, en otras palabras, un "servidor de computación". Con la tecnología JavaSpaces, se escribe en el espacio una serie de tareas, por ejemplo, una tarea por fragmento de datos que se debe analizar. Cada computadora participante busca en el espacio una tarea, la elimina, completa el trabajo computacional necesario, devuelve el resultado al espacio y luego continúa buscando más tareas. Este enfoque escala de forma natural: funciona de la misma manera tanto si hay 10 computadoras disponibles como si hay 1,000. El enfoque también proporciona un equilibrio de carga natural , ya que cada trabajador realiza exactamente la misma cantidad de trabajo que puede realizar en un tiempo determinado, con las computadoras lentas haciendo menos trabajo y las computadoras rápidas haciendo más.

Sistemas de corredores

Como tercer ejemplo, considere un sistema de subastas en línea que reúne a compradores y vendedores de bienes y servicios. Suponga que usted, como comprador potencial, describe el artículo (como un automóvil) que le gustaría comprar y el precio que está dispuesto a pagar, envuelva la información en una entrada y escriba la entrada resultante de la compra deseada a un espacio. Al mismo tiempo, los vendedores potenciales monitorean continuamente el espacio para la llegada de entradas deseadas para comprar que coincidan con los artículos de su inventario. Por ejemplo, los concesionarios Mazda controlan el espacio para las entradas que describen Mazdas, mientras que los concesionarios de autos usados ​​monitorean el espacio para todas las solicitudes de autos usados. Cuando se encuentra y se lee una solicitud coincidente, un vendedor potencial escribe una entrada de oferta en el espacio, indicando un precio de oferta. Como comprador potencial, supervisa continuamente el espacio para las ofertas en sus solicitudes pendientes y,cuando encuentre una que sea aceptable, elimine las ofertas y se comunique con el vendedor (posiblemente a través del espacio a través de otra entrada).

Una breve descripción general de la API

Ahora es el momento de presentar la API de JavaSpaces. Como ya dijimos, es simple; de hecho, en el resto de este artículo cubriremos todo lo que necesita saber (salvo algunos detalles menores) al respecto. Sin embargo, antes de describir la JavaSpaceinterfaz y sus métodos, primero debemos hablar sobre las entradas.

Entradas

Un objeto que se almacena en un espacio se llama

entrada.

Para ser una entrada, un objeto solo necesita implementar el

Entry

interfaz. Como ejemplo, definamos una entrada de mensaje que puede escribir en un espacio:

importar net.jini.core.entry.Entry;

Mensaje de clase pública implementa Entrada {contenido de cadena pública;

// un constructor sin argumentos public Message () {}}

Aquí hemos definido una Messageclase con un campo de cadena que contendrá el contenido del mensaje. Debido a que queremos usar esta clase con espacios, necesitamos implementar la interfaz net.jini.core.entry.Entry, que se encuentra en el paquete net.jini.core.entry. Es importante señalar que Entryes una interfaz de marcador; en otras palabras, la interfaz no contiene constantes o métodos y, por lo tanto, no requiere ningún trabajo especial para implementar, aparte de agregar implements Entrya la definición de su clase.

Además de implementar la Entryinterfaz, hay algunas otras convenciones que nuestras entradas deben seguir. Tendremos más que decir sobre las razones en artículos posteriores, pero por ahora solo veremos las líneas generales. Una entrada debe tener un constructor público que no acepte argumentos (un constructor llamado sin argumentos ); este requisito se deriva de la serialización subyacente que se produce cuando las entradas se transfieren dentro y fuera de los espacios. Tenga en cuenta que nuestra definición de Messagecontiene un constructor sin argumentos. Otra convención es que los campos de una entrada deben declararsepublic; esto permite que otros procesos encuentren sus entradas en espacios mediante una búsqueda asociativa, según los valores de esos campos. Una tercera convención es que los campos de una entrada deben contener referencias a objetos, en lugar de tipos primitivos (es decir, si necesita definir un campo de tipo primitivo como int, debe usar la clase contenedora correspondiente en su Integerlugar). Para asegurarse de que está cubriendo todas sus bases en la definición de entradas, le recomendamos que consulte Principios, patrones y práctica de JavaSpaces , o la Especificación de JavaSpaces de Sun Microsystems para obtener más detalles. También, como se mencionó, tocaremos algunos de los puntos más finos en artículos posteriores.

Aparte de estos requisitos, una entrada es como cualquier otra clase de Java; puede instanciarlo, invocar sus métodos y asignar valores a sus campos públicos. Ahora que hemos definido una Messageclase de entrada, veamos qué operaciones están disponibles para interactuar con entradas en espacios.

La interfaz de JavaSpace

Para interactuar con un espacio, necesita obtener acceso a un objeto que implementa la JavaSpaceinterfaz. Hay muchas formas de obtener acceso a dicho objeto (puede, por ejemplo, usar la búsqueda de Jini o el registro RMI) y cubriremos los detalles de cómo hacerlo en el próximo artículo. Por ahora, nos concentraremos en la JavaSpacepropia interfaz.