Tengo una tabla de bases de datos con ~ 50K filas, cada fila representa un trabajo que debe realizarse. Tengo un programa que extrae un trabajo de la BD, hace el trabajo y devuelve el resultado a la base de datos. (este sistema se está ejecutando en este momento)La mejor manera de usar una tabla de DB como mensaje/cola de trabajos
Ahora quiero permitir que más de una tarea de procesamiento realice trabajos, pero asegúrese de que ninguna tarea se haga dos veces (ya que una preocupación de rendimiento no es que esto cause otros problemas). Debido a que el acceso es a través de un sproce, mi actual aunque es reemplazar dicho sproce con algo que se parece a esto
update tbl set owner=connection_id() where avalable and owner is null limit 1;
select stuff from tbl where owner = connection_id();
cierto; las tareas de los trabajadores pueden tener que ver con la conexión entre obtener un trabajo y enviar los resultados. Además, no espero que el DB siquiera se acerque a ser el cuello de la botella a menos que arruine esa parte (~ 5 trabajos por minuto)
¿Hay algún problema con esto? ¿Hay una mejor manera de hacer esto?
Nota: el "Database as an IPC anti-pattern" es solo un poco oportuno aquí porque 1) No estoy haciendo IPC (no hay ningún proceso que genere las filas, todos ya existen en este momento) y 2) la queja principal descrita para ese antipatrón es que es el resultado de la carga que no sean necesarios en la base de datos como procesos esperan mensajes (en mi caso, si no hay mensajes, todo puede se realiza el apagado, ya que todo)
Derecha - mal = IPC síncrono con bloqueo en un dbms SELECCIONAR como lectura. Presumiblemente estás haciendo esto como una estrategia para introducir la asincronía. – dkretz
Por cierto, si desea poner los lectores en un temporizador, es útil hacer que revisen con poca frecuencia, pero si encuentran trabajo, pueden drenar la cola antes de volver a dormir. – dkretz
Nota mi edición: si no encuentran trabajo, nunca encontrarán trabajo. Pero si eso no fuera cierto ... – BCS