2011-12-19 70 views
5

Actualmente estoy trabajando en un proyecto que tiene que usar WebSockets como una forma de transferir datos a mi cliente. La infraestructura se ve así.
cliente -> Servidor Web -> Base de datos de Microsoft SQLEscucha de WebSocket para Microsoft SQL Database

Creo que la situación más ideal sería así: cliente abre un socket con el servidor. El servidor abre un socket a la base de datos Microsoft SQL. Cada vez que se actualiza la base de datos (se han insertado algunos datos), el DB escribe los datos en el socket. El servidor escribe los datos nuevamente en el cliente. Esto puede ser un poco tedioso, ¿tal vez de alguna manera puedo abrir un socket al DB directamente desde el cliente?

Quiero saber si hay una manera de notificar automáticamente el socket al servidor web si se actualiza la base de datos MSSQL, para que pueda procesar esa información.

La pregunta principal es realmente; ¿Cómo voy a hacer que esto funcione? He investigado algunos proyectos que funcionan con WebSockets como Node.JS y Socket.IO, también Tornado. Aunque no he encontrado ninguna pista sobre dónde buscar esta característica específica. He encontrado algunos controladores bastante inestables para las bases de datos MSSQL para NodeJS, pero no entiendo si hay alguna manera de hacer un socket al DB y enviar instantáneamente los datos a través del socket cuando se bombea a la base de datos.

También me doy cuenta de que hacer un socket entre cliente y db no sería inteligente para decir lo menos posible en seguridad, ya que no es un problema, y ​​ese SQL no es el camino para aplicaciones en tiempo real, pero ' m ligada a él por ahora :)

Edición 1:

Gracias a @tomfanning ahora sé de una solución a este problema, pero serias dudas de la mejora en el rendimiento. Déjame imaginar la situación para ti. En el caso de que use el disparador en la base de datos MSSQL, me imagino que esto sucederá.

Situación 1

  1. La base de datos se actualiza
  2. se aprieta el gatillo
  3. El guión CLR establece una conexión con el servidor Web. Ya sea a través un enchufe que tiene que abrir y cerrar para cada disparo o a través de una solicitud HTTP (S), que implica la apertura y cierre de una Header (que es sobrecarga inútil)
  4. el servidor Web recibe el gatillo y Emite los datos al cliente .
  5. Actualizaciones del cliente.

Y ahora imagine el mismo escenario, pero luego con AJAX

Situación 2:

  1. Un tiempo de espera de 1000 ms se establece en el cliente para AJAX pide
  2. El cliente se ha agotado el tiempo y realiza una solicitud de AJAX
  3. La base de datos ejecuta algunas consultas y publica el resultado
  4. Actualizaciones del cliente.

En la situación 1 necesita una solicitud y un socket emit/receive y en la situación 2 solo necesita una solicitud. Si tuviera que configurar el tiempo de espera de la solicitud de AJAX en 10MS, ¿le parecería al usuario como si fuera una aplicación en tiempo real como un websocket? ¿O la situación 1 sería aún más eficiente y estoy exagerando?

¡Gracias de antemano!

+0

Si puede acceder a su db a través de websockets de una manera no segura, yo también puedo. Si puedo acceder a tu db, voy a troll por el lulz. La seguridad no es una broma. – Raynos

+0

@Raynos Sé que la seguridad no es una broma y definitivamente la tendré en cuenta. Pero solo tengo que saber si hay una manera de hacer esto por ahora. –

Respuesta

3

La solución posible podría ser T-SQL triggers on INSERT or UPDATE con un CLR procedure que envía una notificación a su aplicación principal, que luego transfiere datos a su cliente a través de websockets. Evitaría tener que sondear la base de datos.

Según su comentario, no estoy seguro de cómo AJAX lo ayudaría específicamente en este caso, porque al tratarse de una tecnología impulsada por el cliente (navegador), su solución volvería a sondear, lo cual entiendo que desea evitar. WebSockets suena como la opción adecuada aquí porque le da la capacidad de hacer verdadero "push" desde el servidor al cliente sin necesidad de una encuesta.

Obviamente estoy hablando en términos muy generales y teóricos aquí.

+0

De hecho, intento evitar el sondeo y quiero usar WebSockets en mi aplicación. Pero imaginen que se desencadena un disparador y se ejecuta el script, la base de datos tendría que establecer una conexión con el servidor web a través de un socket o abriría la solicitud como un enlace o algo similar. Eso significaría que tendría que construir un Encabezado que quiero evitar debido a la sobrecarga. Si tuviera que hacer una solicitud de AJAX del cliente al servidor, se necesitaría una solicitud en lugar de 1 solicitud + transferencia de socket ¿verdad? –

+0

No hay manera de que sea una idea sensata en cualquier escenario que se me ocurra tener un código de cliente que hable directamente al servidor de la base de datos. Por lo tanto, siempre tendrá algún tipo de middleware, y por lo tanto dos conexiones en total (una entre el cliente y el servidor web, una entre el servidor web y el servidor de la base de datos) en lugar de una, independientemente de la tecnología. Y si inicia sus actualizaciones * desde * el lado del cliente, siempre estará en un modelo de sondeo, que será menos escalable que un modelo push. Si desea un verdadero modelo push, debe iniciar la operación de alguna manera desde el final de la base de datos. – tomfanning

+0

Acabo de pensar, también, que un disparador INSERTAR o ACTUALIZAR en la base de datos abriría solo una conexión a la aplicación web, lo que a su vez podría saber sobre lotes (decenas, miles ...) de clientes que necesitan recibir el impulso notificación a través de WebSockets.Eso es muchísimo mejor que tener miles de clientes enviando solicitudes AJAX periódicas para sondear en busca de actualizaciones, lo que a su vez supondría una gran presión sobre la base de datos. – tomfanning

Cuestiones relacionadas