Estoy buscando un patrón de diseño que maneje grandes conjuntos de datos a través de Internet, y realiza actualizaciones periódicas de estos objetos. Estoy desarrollando una aplicación que mostrará miles de registros en la interfaz de usuario a la vez. Además, varias propiedades de estos objetos son bastante transitorias y deben actualizarse en el cliente para mantener al usuario al tanto del estado cambiante de estos registros en el sistema. Tengo algunas ideas de cómo abordar este problema, pero pensé que podría haber un patrón de diseño (o patrones) que maneje este tipo de escenario.¿Existe un patrón de diseño para manejar grandes conjuntos de datos a través de Internet?
Limitaciones:
- el lado del cliente para esto se escribe en Silverlight.
- Los objetos en sí mismos no son muy grandes (alrededor de 15 propiedades de tipo de valor y cadena), pero consultar todos los datos es costoso. Las 15 o más propiedades contienen datos de varias fuentes; ninguna declaración de unión inteligente o indexación va a acelerar la consulta. Estoy pensando en rellenar solo un subconjunto de las propiedades en la carga inicial y luego completar los detalles más caros a medida que el usuario amplía una agrupación de objetos determinada. Piense en los mapas de Google, pero en lugar de calles y edificios, muestra los objetos.
- Podré limitar la parte de los miles de objetos que se están actualizando. Sin embargo, necesitaré que el usuario pueda "alejarse" de un contexto que permite la actualización granular a una que muestra todos los miles de objetos. Me imagino que la actualización se desactivará de nuevo para los objetos cuando dejan un contexto de zoom suficiente.
¿Ideas sobre cómo abordar todo o parte de este problema? Como mencioné, ya estoy considerando algunas ideas, pero nada de lo que he reunido hasta ahora me da una buena impresión sobre el éxito de este proyecto.
Editar:
creo que las partes difíciles realmente se reducen a dos cosas por las que pueden necesitar dos distintos patrones/prácticas/estrategias:
- Cargar un gran número de registros sobre el internet (~ 5k).
- Mantener actualizado un subconjunto de estos objetos (~ 500) a través de Internet.
Hay varios patrones de diseño que se pueden utilizar para todo lo demás.
Edición 2:
Gracias por los enlaces en diversos sistemas de aplicación "push" en Silverlight. Podría jurar que los enchufes habían sido eliminados de Silverlight, pero encontré una referencia de Silverlight 3 basada en una respuesta a continuación. Realmente, este no era un gran problema para mí y no había dedicado mucho tiempo a investigar, así que lo estoy editando fuera del texto original. Ya sea que las actualizaciones bajen en encuestas o por medio de push, los problemas generales de diseño todavía están allí. Es bueno saber que tengo opciones.
Edición 3: Seguimiento de las tecnologías push.
Como sospechaba, la implementación dúplex Silverlight WCF es comet-like push. Esto no se escalará, y hay numerosos artículos sobre cómo no funciona en el mundo real.
La implementación de sockets en Silverlight está paralizada de varias maneras. Parece que va a ser inútil en nuestro escenario ya que el servidor web puede ubicarse detrás de cualquier firewall de cliente dado que no permitirá puertos no estándar y los conectores Silverlight no se conectarán en 80, 443, etc.
Todavía estoy pensando en usar el enfoque WCFduplex de alguna manera limitada, pero parece que la respuesta será la votación.
Editar 4: Se encuentra un patrón para resolver la mitad de mi problema
he encontrado this pattern (PDF) que ilustra el uso de un iterador para recuperar las páginas de datos del servidor y presentarlos como un simple repetidor. En .Net land, imagino que esto se implementaría como IEnumerable (el código de las muestras está en Java y Oracle SQL). De particular interés para mí fue la búsqueda previa de página asíncrona, básicamente el buffer del conjunto de resultados del lado del cliente. Con objetos de 5k, todo no cabe en la pantalla de una vez, así que puedo usar una estrategia de no obtener todo a la vez y ocultar los detalles de implementación desde la interfaz de usuario. Los objetos principales que la aplicación recuperará se encuentran en una base de datos, luego se requieren otras búsquedas para completar completamente estos objetos. Esta metodología parece ser un buen enfoque para enviar rápidamente algunos de los datos al cliente.
Ahora estoy pensando en usar este patrón + algún tipo de patrón de objeto proxy que escuche los deltas en el conjunto de resultados y actualiza el objeto en consecuencia. Hay un par de estrategias que uno podría tomar aquí. Podría cargar todos los datos por adelantado, luego enviar deltas de cambios (que probablemente necesitarán algún código adicional en los subsistemas para proporcionar notificaciones de cambios). Este podría ser mi primer enfoque. Todavía estoy buscando. Gracias por todas las ideas hasta ahora.
¡Problema muy interesante! Me encantaría trabajar en algo así alguna vez. ¿Puedo preguntar sobre los detalles de lo que estás construyendo? – andyp
Es un sistema patentado que aún no hemos lanzado (obviamente) y he ofuscado algunos de los detalles debido a eso. En general, es una forma de controlar lo que está sucediendo en una aplicación que maneja un gran conjunto de "dispositivos" (la instalación más grande actual de alrededor de 5k). Esta herramienta le permitirá a un administrador observar la "red del dispositivo" en su totalidad y detectar problemas, y luego tomar medidas en áreas problemáticas. Lo siento, no puedo ser más específico. ¡Cuando salgamos, puedo mostrártelo! –