Pregunta

Hola. Yo uso delayed_job en proceso de fondo. Tengo 8 CPU del servidor, MySQL y comienzo 7 procesos delayed_job

RAILS_ENV=production script/delayed_job -n 7 start 

P1: Me pregunto ¿es posible que 2 o más procesos delayed_job comenzar a procesar el mismo proceso (el mismo registro fila en el delayed_jobs base de datos). Revisé el código del plugin delayed_job pero no puedo encontrar la directiva de bloqueo de manera que debería ser (sin tabla de bloqueo o SELECT ... FOR UPDATE).

creo que cada proceso debe bloquear la tabla de base de datos antes de ejecutar una actualización de la columna lock_by. Se cerraba el registro, simplemente actualizando el campo locked_by (ACTUALIZACIÓN delayed_jobs locked_by SET ...). ¿Es realmente suficiente? No se necesita de bloqueo? ¿Por qué? Yo sé que ACTUALIZACIÓN tiene mayor prioridad que SELECT pero creo que esto no tiene efecto en este caso.

Mi comprensión de la situación del multy-roscado es:

Process1: Get waiting job X. [OK]
Process2: Get waiting jobs X. [OK]
Process1: Update locked_by field. [OK]
Process2: Update locked_by field. [OK]
Process1: Get waiting job X. [Already processed]
Process2: Get waiting jobs X. [Already processed]

creo que en algunos casos más puestos de trabajo pueden obtener la misma información y pueden comenzar a procesar el mismo proceso.

P2: 7 es un número delayed_jobs buena para el servidor 8CPU? ¿Por qué sí / no.

Thx 10x!

¿Fue útil?

Solución

Creo que la respuesta a su pregunta es en la línea 168 de 'lib / delayed_job / job.rb':

self.class.update_all(["locked_at = ?, locked_by = ?", now, worker], ["id = ? and (locked_at is null or locked_at < ?)", id, (now - max_run_time.to_i)])

A continuación, la actualización de la fila solo se hace, si no hay otro trabajador ya ha bloqueado el trabajo y esto se comprueba si se actualiza la tabla. No es necesario un bloqueo de tabla o similar (que por cierto reduciría enormemente el rendimiento de la aplicación), ya que su DBMS asegura que la ejecución de una sola consulta se aísla de los efectos frente a otras consultas. En su ejemplo Proceso2 no puede obtener el bloqueo de trabajo X, ya que se actualiza la tabla de puestos de trabajo si y sólo si no estaba cerrada antes.

Para la segunda pregunta: Depende. En un servidor de 8 CPU. que se dedica a este trabajo, 8 trabajadores son un buen punto de partida, ya que los trabajadores son de un solo subproceso debe ejecutar uno por cada núcleo. Dependiendo de su configuración más o menos trabajadores son mejores. Es en gran medida depende de sus puestos de trabajo. Tome su ventaja trabajos de núcleos mutiple? ¿O es que espere su trabajo la mayor parte del tiempo por los recursos externos? Tienes que experimentar con diferentes configuraciones y echar un vistazo a todos los recursos involucrados.

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