2010-12-07 23 views
11

Actualmente estoy trabajando en una aplicación de escritorio C# .NET que se comunicará a una base de datos a través de Internet a través de WCF y WCF Data Services. Habrá muchos puntos en la aplicación que pueden necesitar actualizarse en algún intervalo. La solución más fácil sería poner estas áreas en un temporizador y volver a consultar la base de datos. Sin embargo, con miles de clientes que se conectan a la capa de servicio y, por lo tanto, a la base de datos, estas operaciones serían muy costosas para el servidor.Buena solución C# .NET para administrar sondeos de bases de datos frecuentes

Lo que he considerado es crear un canal de información RSS que es consultado por el cliente, y le permite al cliente saber cuándo estas áreas particulares necesitan ser actualizadas. El feed de RSS será administrado por un servicio que sondea la base de datos en busca de cambios o itera a través de una lista de elementos que están en cola por las solicitudes de WCF realizadas por el cliente.

También he considerado crear alguna conexión directa y continua desde el cliente al servidor, pero no estoy seguro de qué puertos de firewall de salida se abrirían desde el cliente. Probablemente solo podría contar con el puerto 80/443.

Así que mi pregunta es qué soluciones han tenido éxito las personas implementando para resolver este problema? ¿Han hecho personas RSS? Servicios de sincronización de Microsoft? Comunicación bidireccional entre el cliente y el servidor a través de un puerto de salvar a través de WCF?

Cualquier idea es muy apreciada.

Respuesta

8

Creo que es posible que desee ir con una combinación de dos enfoques. En primer lugar, puede usar long polling del cliente al servidor para que el servidor pueda notificar al cliente tan pronto como ocurra un cambio que interese al cliente.

Una nueva tecnología que maneja muy bien la sugerencia anterior en ASP. NET es SignalR. Esto maneja gran parte de los detalles del sondeo largo (o usa WebSockets cuando puede) para que no tenga que preocuparse por eso.

En segundo lugar, en función de las etiquetas en esta pregunta, parece que está utilizando SQL Server. Puede usar las notificaciones de la base de datos en las tablas que le interesen para que el DB notifique a su servicio cuando se produzcan cambios. Esto podría disparar el servicio para notificar al cliente sobre los cambios a través de las conexiones de encuesta largas. Puede hacerlo utilizando la clase SqlDependency.

Estoy seguro de que hay otras formas, pero esto probablemente se escalaría bastante bien ya que solo tendrías un servicio para recibir las notificaciones y distribuirlas a todos los clientes.

+0

+1, pero me preocupan los miles de clientes que usan encuestas largas. Es probable que se necesite cierta optimización del entorno para las conexiones abiertas. Nunca he hecho esto con WCF, así que no puedo comentar sobre las dificultades/aspectos positivos. – marr75

+0

+1 ¿Conoces alguna buena implementación de sondeo largo en C# utilizando WCF? Lo busqué en Google y no he encontrado buenos ejemplos. – BernicusMaximus

+0

Lo siento, no lo hago. Sé que hay un canal Dúplex en WCF para Silverlight, pero por lo que he leído sondeará periódicamente y no realizará encuestas largas (http://msdn.microsoft.com/en-us/library/cc645028(VS.95) .aspx) –

0

Si la operación costosa es el servidor para poner en común la base de datos, debe implementar algún tipo de almacenamiento en caché. Puede ser básico como el almacenamiento en caché de ASP.NET o avanzado como el uso de memcached.

Pero si la operación costosa es que el cliente reúna el servidor, puede usar una fuente Atom o RSS con PubSubHubbub para minimizar el número de solicitudes al servidor. Va a ser más barato, ya que hay algunos editores PubSubHubbub gratuitos que se encargarán de la carga.

0

Se podría buscar en el Service Broker, de esa manera usted no tendrá que sondear en busca de actualizaciones

5

se puede definir una interfaz de devolución de llamada en la conexión de WCF como esto:

[ServiceContract(CallbackContract = typeof(IFooClient))] 

Como los iniciados cliente la conexión debería funcionar a través del firewall.El método que el servidor puede registrar los cambios de una se puede obtener la interfaz de devolución de llamada con

IFooClient client = OperationContext.Current.GetCallbackChannel<IFooClient>(); 

y devolver la llamada a todos los clientes que están registrados en los cambios de datos.

+0

Me gusta este enfoque también. Lo investigaré más a fondo. – BernicusMaximus

0

No sé por qué RSS sería más simple que tener la información de la caché de los servicios web de la base de datos.

Para comparar las 2 opciones, digamos que necesita saber quién editó un objeto en un informe al último (o la última vez que se actualizó, etc.). Con un feed RSS, tendrá que realizar una solicitud para el feed, obtenerlo, analizarlo y tomar medidas en función de los valores relevantes. Con una llamada de servicio web que memoriza y almacena en caché su llamada a la base de datos, simplemente llame al servicio y tome medidas sobre el resultado. La única vez que pude ver que RSS es mejor es si 1) Usted admite varios clientes que no controla o que no son clientes de .Net y 2) Está tomando medidas basadas en muchos de los valores sondeados al mismo tiempo .

Cuestiones relacionadas