2009-04-24 6 views
5

Tengo una aplicación que funciona de la siguiente manera: las máquinas Linux generan 28 tipos diferentes de cartas para los clientes. Las cartas deben enviarse en .docx (formato Microsoft Word). Una secretaria mantiene plantillas de MS Word, que se utilizan automáticamente según sea necesario. Cambiar de usar MS Word no es una opción.alternativa a la base de datos de votación?

Para coordinar todo esto, los trabajos de documento se colocan en una tabla de base de datos y un programa python ejecutándose en cada una de las máquinas de Windows sondea la base de datos con frecuencia, bloqueando trabajos y ejecutándolos según sea necesario.

Utilizamos una tabla de base de datos central para la información del trabajo para coordinar diferentes estados ("nuevo", "procesamiento", "terminado", "impreso") ... así como para proporcionar información de estado precisa.

De todos modos, no me gustan los clientes que consultan la base de datos con frecuencia, ya que no están funcionando la mayor parte del tiempo. Los clientes hpoll cada 5 segundos.

Para evitar el sondeo, quiero un mensaje de difusión que diga "hay algo de trabajo que hacer" o "revise su base de datos para algún trabajo que hacer" enviado a todas las máquinas del cliente.

Creo que algún tipo de cola de mensajes de publicación/suscripción estaría a la altura, pero no quiero una complejidad extra enorme.

¿Hay un software de configuración/mantenimiento cero o casi cero que logre esto? ¿Cuales son las opciones?

X

+0

¿Qué sistema de base de datos está utilizando? ¿Servidor SQL? –

+0

Es una base de datos MySQL. –

+3

arr ok. Con Sql server 2005 tiene Sql server message broker. Permite a los procesos de su cliente bloquear y consumir 0% de CPU hasta que haya trabajo pendiente (un mensaje en la q). Cada mensaje es transaccional. Sin embargo, ofc, no necesita el servidor SQl para hacer este tipo de procesamiento. Sin embargo, no puedo recomendar otro, ya que no los he usado; p –

Respuesta

3

¿Existe un cero o cerca de cero config/pieza de mantenimiento de software que permita lograr esto? ¿Cuales son las opciones?

Posiblemente, pero lo que ahorraría en tiempo de configuración e implementación probablemente perjudicaría el rendimiento más de lo que su servicio de sondeo podría. SQL Server no está hecho para hacer un push realmente (no es fácil de todos modos). Hay cosas que podría usar para enviar datos (servicio de replicación, envío de registros, cosas desagradables), pero serían más complejos y requerirían más recursos que su simple servicio de votación. Algunas opciones serían:

  1. algún tipo de disparador que ejecuta el ejecutable usando la línea de comandos llama (sp_cmdshell)

  2. utilizando un objeto COM, que SQL Server podría abrir y ejecutar

  3. usando un trabajo del Agente SQL para ejecutar un VBScript (que a su vez pueda ser considerada "polling")

Estas opciones son un poco ridículo teniendo en cuenta WH lo que ya has hecho es mucho más simple.

Si le preocupa que el servicio de sondeo use demasiados ciclos o algo así - siempre puede regularlo - la votación cada minuto, cada 10 minutos o incluso una vez al día podría ser más apropiado - esto sería un negocio decisión, así que pregúntele a alguien en el negocio qué tan rápido debe ser.

Los servicios de votación simples son bastante comunes, porque son, bueno, simples. Además, también tienen una sobrecarga baja, son estables a distancia y toleran errores. El inconveniente es que pueden convertir la base de datos en polvo si no se controla cuidadosamente.

3

Una cola de mensajes podría funcionar bien, ya que generalmente están configurados para poder bloquear por un tiempo sin desperdiciar recursos. Pero con MySQL, no creo que sea una opción.

Si solo desea reducir la carga en la base de datos, puede crear una tabla con una sola fila: la última identificación del trabajo. Entonces los clientes solo necesitan comparar eso con su última identificación para ver si necesitan ejecutar una encuesta completa contra la tabla real. De esta forma, la sobrecarga debería reducirse en gran medida, si es un problema ahora.

+1

Su encuesta puede usar 'SHOW TABLE STATUS' para detectar cuándo se actualizó por última vez una tabla y evitar crear una nueva tabla. –

5

¿Hay alguna evidencia objetiva de que se está cargando de forma significativa en el servidor? Si funciona, me aseguraré de que realmente haya un problema que resolver aquí.

¡Debe ser agradable tener todo funcionando tan suavemente que estés viendo cosas que solo podrían mejorarse!

+0

Buena manera de decirlo. Upvote en eso :) – Jasmine

1

A diferencia de Postgres y SQL Server (o tiendas de objetos como CouchDb), MySQL no emite eventos de base de datos. Sin embargo, hay algunos patrones de codificación que puede usar para simular esto.

Si tiene una o más tablas que desea supervisar, puede crear activadores en estas tablas que agregan una fila a una tabla de "cambios" que registra una cola de eventos para procesar. Sus factores desencadenantes filtran el subconjunto de cambios de datos que le interesan y crea registros en su tabla de cambios para cada evento que desea realizar. Como este patrón colas y persisten los eventos, funciona bien incluso cuando los trabajadores que procesan estos eventos tienen interrupciones.

Puede pensar que MyISAM es la mejor opción para la tabla de cambios ya que es sobre todo realizar escrituras (o incluso MEMORIA si no necesita persistir los eventos entre interrupciones del servidor de base de datos). Sin embargo, tenga en cuenta que tanto la Memoria como la MEMORIA y MyISAM solo tienen bloqueos de mesa completa, por lo que su desencadenante en una tabla InnoDB podría golpear el cuello de una botella al realizar una inserción en una mesa MEMORY y MyISAM. También puede requerir InnoDB para la tabla de cambios si está utilizando ON DELETE CASCADE con otra tabla InnoDB (requiere que ambas tablas usen el mismo motor).

También puede usar SHOW TABLE STATUS para verificar la hora de la última actualización de la tabla de cambios para verificar si hay algo que realizar. Esta característica wont work para tablas InnoDB.

¡Estos artículos describen en mayor profundidad algunas de las formas alternativas de implementar colas en MySQL e incluso evitar el sondeo!

Cuestiones relacionadas