Buen marco de sincronización de .Net para arquitectura de n niveles

Para un proyecto, necesito cambiar la comunicación entre el servidor y el cliente.

En realidad, es un servicio WCF, alojado en una aplicación de consola, que envía todo el contenido de la tabla al cliente, y el cliente reemplaza todo su caché local por el nuevo contenido.

La aplicación cliente puede funcionar sin conexión (tenemos un caché local, que es persistente a través de la serialización en el disco, y también tenemos una lista de transacciones, que almacena todos los cambios que tenemos que enviar al servidor una vez conectado).

El problema es que esta sincronización ahora ocurrirá en la conexión GSM, y enviar todo el contenido de la tabla es realmente pesado.

Entonces, o implemento todo esto (establezco una fecha de modificación, almaceno la última fecha de sincronización, obtengo solo campos actualizados, actualizo mi caché), o puedo encontrar una forma estándar de hacerlo. Creo que una biblioteca dedicada hará un mejor trabajo, porque ya han pensado en muchos escenarios que yo ciertamente no tenía.

La capa de sincronización tiene un acoplamiento bajo, por lo que no es gran cosa cambiar la forma en que funciona.

Los requisitos de mi proyecto son:

  • Debería tener sincronización incremental
  • Puede enviar cambios al servidor
  • Acceder/almacenar información fuera de línea
  • Posibilidad de hacer una resincronización completa (caché dañado o computadora nueva)
  • El proveedor de datos en el lado del servidor es Entity Framework
  • Necesito reutilizar mi autenticación personalizada actual
  • Bonificación: algunos tipos tienen una sincronización especial (por ejemplo, tengo una base de datos que contiene archivos pequeños, pero en el lado del cliente, los archivos deben colocarse directamente en la carpeta)

He mirado un poco alrededor para ver lo que existe.

Encontré algunas cosas sobre Microsoft Sync Framework, pero parece muy orientado a ADO.Net, y no estoy seguro de que pueda tomar datos de un servicio de entidad y colocarlos en un caché serializado.

De modo que:

¿Me puede aconsejar algún marco o biblioteca para hacer el trabajo? ¿O crees que con respecto a mis necesidades, debería implementar esto yo mismo?

preguntado el 12 de junio de 12 a las 10:06

3 Respuestas

He usado Microsoft Sync Framework en el pasado para un cliente conectado ocasionalmente N-Tier similar y funcionó de maravilla. Se ha movido desde la última vez que lo usé, pero así es como veo que responde a sus requisitos.

WCF

Funciona bien sobre WCF, así es como lo usamos. (Cómo: configurar la sincronización de n niveles)

Debería tener sincronización incremental

Los servicios de sincronización hacen esto muy bien, pero es posible que deba agregar marcas de tiempo a sus tablas de sincronización. La base de datos de su cliente (que en mi caso era una base de datos de SQL Server CE) contiene la última marca de tiempo que se usó cuando sincronizó por última vez y luego la usará para obtener todo lo que se cambió después durante la próxima sincronización.

Puede enviar cambios al servidor

Nuevamente hicimos esto. Hay muchos ganchos para proporcionar una lógica personalizada en el servidor para validar los datos.

Acceder/almacenar información sin conexión

Funciona bien en un escenario completamente desconectado (siempre que el usuario ya haya sincronizado sus datos primero). Ver Escenarios fuera de línea.

Posibilidad de hacer una resincronización completa (caché dañado o computadora nueva)

Es la base de datos del cliente la que contiene toda la información de sincronización (puede poner conocimiento en el servidor sobre lo que el cliente ha sincronizado si lo desea). Si elimina la base de datos local, el cliente realizará una sincronización completa.

El proveedor de datos en el lado del servidor es Entity Framework

No es así como lo he usado, pero los proveedores de sincronización son totalmente personalizables. Íbamos a considerar hacer uno de NHibernate, sin embargo, pregúntese por qué quiere hacer esto. Los servicios de sincronización listos para usar le permitirán insertar y extraer datos mediante procedimientos almacenados o consultas de tablas directas. Esto es muy fácil de configurar y debido a que podría estar usando una gran cantidad de datos, es muy rápido de ejecutar y los datos son fáciles de sincronizar a través del límite de WCF (aunque cambiamos al formateador binario del formateador xml para un mejor rendimiento).

Lo que encontramos fue que solo porque usamos Entidades en el servidor, no necesariamente tenían sentido en el cliente y, por lo tanto, teníamos un conjunto completamente nuevo de entidades en el cliente. Esto también significaba que estábamos eliminando los datos que no eran necesarios en el cliente en los procedimientos almacenados. Nuevamente, esto fue muy fácil y no necesita ensuciarse con ADO.net. Luego, una vez que los datos están en el cliente, usamos NHibernate para leer y escribir en la base de datos local.

Creación de proveedores de sincronización personalizados para Microsoft Sync Framework

Necesito reutilizar mi autenticación personalizada actual

Si se refiere a la autenticación personalizada de WCF, entonces sí, ya que teníamos nuestro propio token de seguridad personalizado de WCF que funcionó bien sin ningún impacto.

Bonificación: algunos tipos tienen una sincronización especial (por ejemplo, tengo una base de datos que contiene archivos pequeños, pero en el lado del cliente, los archivos deben colocarse directamente en la carpeta)

Respuesta corta No lo sé, ya que es un proveedor de sincronización de archivos en el nuevo marco que no he usado, pero tiene otras dos opciones.

  1. Durante la sincronización en el cliente, puede conectarse al punto donde los datos se colocarán en las tablas y tiene la oportunidad de extraer los datos binarios y escribirlos en el sistema de archivos en lugar de en la base de datos.

  2. Excluya los datos binarios del archivo de la sincronización y extraiga estos datos después de la sincronización mediante otro proceso. Hicimos esto porque los paquetes que estábamos bajando eran bastante grandes, así que usamos la sincronización inicial para bajar los "metadatos" y luego usamos algo llamado BITS que es parte de Windows para desplegar los archivos de forma asíncrona.

Introducción al proveedor de sincronización de archivos de Microsoft Sync Framework

[ACTUALIZACIÓN]

En respuesta a las preguntas planteadas en los comentarios.

  1. Mi aplicación debería funcionar para diferentes usuarios en la misma computadora. En mi caso, estaba usando el almacenamiento aislado para garantizar que funcionen en una ubicación diferente, ¿es esto posible con SQL Server CE?

    Nuestra aplicación se implementó a través de ClickOnce, lo que proporcionaría una instalación independiente de la aplicación para cada usuario, pero no creo que sea eso lo que se solicita. SQL CE es solo una base de datos en memoria, apunta el SqlCeEngine en el archivo de la base de datos que desea cargar, por lo que el almacenamiento aislado es perfecto.

  2. Hasta donde yo sé, SQL Server CE es como SQLite, ¿cómo administra la creación del esquema?

    Puede dejar que Snyc Services cree el esquema de la base de datos si lo desea y eso será lo suficientemente bueno para comenzar, pero a la larga probablemente tendrá que cambiar el esquema en algún momento. Esto probablemente será cuando haga una actualización, por lo que es mejor que lo piense desde el principio. Lidié con esto al no pensar en la base de datos como perteneciente a los servicios de sincronización, sino como algo que se le dice a los servicios de sincronización que puede usar.

    Cuando nuestra aplicación se puso en marcha, hizo algunas tareas domésticas, como crear la base de datos si no existía o ejecutar scripts de la base de datos si la aplicación acababa de actualizarse.

  3. ¿Sabe si hay algún ejemplo de implementación de clase para esta sincronización de N niveles? Necesito ver qué interfaces tengo que implementar.

    La versión estable actual es la 2.1 y la estaba usando justo cuando salió la 2.0, así que todo mi trabajo estaba en la 1.0. Aquí hay un enlace a la Marco de sincronización de Microsoft 2.1 API en MSDN. Tuve que usar los documentos 1.0 para encontrar los ejemplos que usé para eliminar nuestra interfaz WCF, así que no sé cuánto han cambiado las cosas, pero puedes usar este para empezar con lo que define la interfaz como esta:

    [ServiceContract] interfaz pública IServiceForSync { [OperationContract()] SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession);

    [OperationContract()]
    SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession);
    
    [OperationContract()]
    SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession);
    
    [OperationContract()]
    SyncServerInfo GetServerInfo(SyncSession syncSession);
    

    }

  4. ¿Supongo que es un servicio por tipo de datos?

No, como puedes ver desde arriba solo hay un servicio. Lo que se sincroniza depende de lo que exponga en el servidor y en lo que el cliente quiera participar. Por ejemplo, teníamos dos clientes, uno solo estaba interesado en un pequeño subconjunto de los datos y solo participó en la sincronización de un par de tablas (llamadas a SyncTable) donde como el otro sincronizó todas las tablas.

También hay un concepto de SyncGroup, estos consisten en cambios relacionados que deben persistir transaccionalmente ya que todos están relacionados, es decir, si uno falla, todos fallan. También puede sincronizar los grupos individualmente sin tener que sincronizar todo.

  1. ¿Puedo sincronizar solo datos relativos al usuario?

Absolutamente. Cuando haces una sincronización pasas un SyncParameter que contiene valores que puede usar para filtrar los datos que se devuelven al cliente. Cómo: filtrar filas y columnas.

Respondido el 23 de enero de 16 a las 09:01

Su propuesta parece bastante interesante, tengo varias preguntas: 1. Mi aplicación debería funcionar para diferentes usuarios en la misma computadora. En mi caso, estaba usando el almacenamiento aislado para garantizar que funcionen en una ubicación diferente, ¿es posible con SQL CE? 2. Por lo que sé, SQL CE es como SQLite, ¿cómo gestiona la creación del esquema? 3. ¿Sabe si hay algún ejemplo de implementación de clase para esta sincronización de N niveles? Necesito ver qué interfaces tengo que implementar. 4. ¿Supongo que es un servicio por tipo de datos? 5. ¿Puedo sincronizar solo datos relativos al usuario? - J4N

@ J4N He actualizado la respuesta para abordar los puntos adicionales que planteaste. - Bronumski

Estoy tratando de implementar su solución, tengo una pregunta: ¿Cómo maneja la eliminación? Si se elimina un elemento, ¿cómo lo sabe cuando el cliente llama a las operaciones GetChanges? ¿Mantuvo todos los datos en la base de datos y los marcó como eliminados? ¿O tiene una tabla que contiene todos los ID de elementos eliminados? - J4N

@J4N Desafortunadamente, cambié de trabajo, así que no puedo decirte exactamente. Si no recuerdo mal, administramos una tabla de desecho (pre sql server 2008 que puede hacer esto por usted con el seguimiento de cambios). Esto le permite manejar borrados duros. Si está haciendo eliminaciones suaves, entonces probablemente sea más fácil. No creo que sea una talla única. - Bronumski

Dependiendo de la forma en que pueda o esté dispuesto a implementar y exponer el servidor que podría usar Replicación de SQL Server

La replicación podría encargarse de todos los tediosos tareas de replicación mientras te preocupas por la aplicación.

Podría considerar instalar SQL Express y usar Merge Replication.

EDITAR Uso de filtros parametrizados para administrar qué datos se replicarán y instalar SQL Express como requisito previo usando un programa previo. Aparentemente, Microsoft no proporcionó un programa previo para SQL Express aquí hay una discusión sobre eso

Respondido el 12 de junio de 12 a las 12:06

Ya lo pensé. Pero los usuarios solo tienen acceso a una copia parcial de la base de datos (y necesito que todo en el cliente esté instalado a través de UNA configuración) - J4N

La instalación de SQL Express se puede realizar agregándolo como requisito previo a la instalación de su aplicación. Por lo que sé, puede especificar filtros para determinar qué datos se enviarán. - Emond

Hum, empieza a ser interesante. Entonces me dices que la instalación y configuración de SQL Express se puede hacer en el setup? Y para el filtro, tengo algunas dudas de que pueda configurarlos dependiendo del usuario actual. - J4N

De acuerdo, ¿pero esto significa que debería tener un usuario de Windows/usuario de SQL para CADA usuario? Solo tengo un usuario de SQL para conectarme a la base de datos (y este usuario/contraseña solo se almacena en el servidor). - J4N

Si es posible, usaría seguridad integrada. La replicación podría ejecutarse en una cuenta diferente. - Emond

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.