Servicios de Windows en una granja de servidores web (cómo evitar conflictos de concurrencia)

StackOverflow https://stackoverflow.com/questions/1420578

Pregunta

Mirando hacia el futuro, hasta cuándo se creará un Web Farm ...

Tenemos varias aplicaciones de servicio de Windows que realizan diversas tareas de fondo: envío de correos electrónicos, miniaturas / procesamiento de archivos, etc.

En un entorno de granja de servidores, en teoría podríamos instalar y ejecutar cada servicio en cada máquina, sin embargo, puede haber conflictos debido a la base de objetos de negocio "first-write-win". o duplicación indeseable de tareas, por ejemplo: los mismos correos electrónicos que se envían varias veces.

El " first-write-wins " El escenario se puede superar mediante código o lógica que resuelva el problema u omita el elemento. (si se trata de un mecanismo básico de espera (lista de consultas y registro de proceso), simplemente se volverá a intentar)

Para la duplicación de tareas, uno podría realizar tareas en las transacciones para evitar que otros procesos se apoderen de los mismos recursos, sin embargo, supongo que simplemente esperarán y que tendremos que manejar un inicio de sesión en función de las cosas que suceden nuevamente. ¿Sería este el caso?

Para evitar la duplicación de tareas, estoy pensando en construir algún mecanismo que escriba una "bandera de bloqueo". a la base de datos que establecerá el primer servicio que se active. Esta bandera estará fechada y hará referencia a la instancia del servicio. El servicio que '' posee '' la bandera ejecutará las tareas y actualizará periódicamente esta fecha. También habrá una configuración de tiempo de espera / tolerancia en cada servicio en el caso de que el servicio no posea la bandera, verificará la tolerancia y asumirá el control si es necesario.

¿Suena esto como una solución razonable o debería irse a una mejor solución basada en la cola de mensajes en esa etapa (tampoco está seguro de cómo funcionaría eso en un entorno agrícola?

Tecnologías: C # / ASP.NET / SQL Server

¿Fue útil?

Solución

Puedo pensar en dos mecanismos.

  1. Si todas sus tareas se derivan de actividades de base de datos, podría crear una nueva " tareas " tabla y establecer desencadenantes en las actividades para que se inserte un nuevo registro con la información de la tarea. Sus servicios de Windows pueden luego sondear las "tareas". tabla y utilice una transacción de selección y eliminación atómica para garantizar que solo un servicio lo haga.

  2. Puede usar una cola de mensajes y soltar sus tareas en ella y luego hacer que sus servicios de Windows sondeen la cola. Cada mensaje en cola solo podrá ser retirado por un solo servicio para que pueda asegurarse de que cada tarea se realice solo una vez. Por supuesto, debe preocuparse por la carga en la cola de mensajes. Dependiendo de su aplicación, podría usar algo como el Servicio de cola simple de Amazon, lo que aliviaría la necesidad de preocuparse por la confiabilidad y la escalabilidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top