La gema permite proteger la singularidad laboral con las próximas estrategias:
Estrategia | El trabajo está bloqueado | El trabajo está desbloqueado |
---|---|---|
until_executing | Cuando empujado a la cola | Cuando comienza el procesamiento |
until_executed | Cuando empujado a la cola | Cuando el trabajo se procesa con éxito |
until_expired | Cuando empujado a la cola | Cuando la cerradura está expirada |
until_and_while_executing | Cuando empujado a la cola | Cuando comienza el procesamiento Se adquiere un bloqueo de tiempo de ejecución para evitar trabajos simultáneos tiene opciones adicionales: runtime_lock_ttl , on_runtime_conflict |
while_executing | Cuando comienza el procesamiento | Cuando se procesa el trabajo con cualquier resultado que incluya un error |
Inspirado por SidekiquniqueJobs, usa Redlock debajo del capó.
Agregue la gema activejob-uniqueness
a su archivo gem.
gem 'activejob-uniqueness'
Si desea desbloquear trabajos para la interfaz de usuario web SideKIQ, requiera el parche explícitamente. ¡La limpieza de las colas se vuelve más lenta!
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
Y ejecute el comando bundle install
.
ActiveJob :: la unicidad está listo para funcionar sin ninguna configuración. Utilizará REDIS_URL
para conectarse a la instancia de Redis. Para anular los valores predeterminados, cree un inicializador config/initializers/active_job_uniqueness.rb
usando el siguiente comando:
rails generate active_job:uniqueness:install
class MyJob < ActiveJob :: Base
# new jobs with the same args will raise error until existing one is executed
unique :until_executed
def perform ( args )
# work
end
end
class MyJob < ActiveJob :: Base
# new jobs with the same args will be logged within 3 hours or until existing one is being executing
unique :until_executing , lock_ttl : 3 . hours , on_conflict : :log
def perform ( args )
# work
end
end
Puede establecer valores predeterminados a nivel mundial con la configuración
class MyJob < ActiveJob :: Base
# Proc gets the job instance including its arguments
unique :until_executing , on_conflict : -> ( job ) { job . logger . info "Oops: #{ job . arguments } " }
def perform ( args )
# work
end
end
class MyJob < ActiveJob :: Base
unique :until_executed
def perform ( foo , bar , baz )
# work
end
def lock_key_arguments
arguments . first ( 2 ) # baz is ignored
end
end
class MyJob < ActiveJob :: Base
unique :until_executed
def perform ( foo , bar , baz )
# work
end
def lock_key
'qux' # completely custom lock key
end
def runtime_lock_key
'quux' # completely custom runtime lock key for :until_and_while_executing
end
end
La estrategia seleccionada desbloquea automáticamente los trabajos, pero en algunos casos (por ejemplo, la cola se purga) es útil desbloquear los trabajos manualmente.
# Remove the lock for particular arguments:
MyJob . unlock! ( foo : 'bar' )
# or
ActiveJob :: Uniqueness . unlock! ( job_class_name : 'MyJob' , arguments : [ { foo : 'bar' } ] )
# Remove all locks of MyJob
MyJob . unlock!
# or
ActiveJob :: Uniqueness . unlock! ( job_class_name : 'MyJob' )
# Remove all locks
ActiveJob :: Uniqueness . unlock!
Lo más probable es que no desee que los trabajos se bloqueen en las pruebas. Agregue esta línea a su suite de prueba ( rails_helper.rb
):
ActiveJob :: Uniqueness . test_mode!
ActiveJob :: Instrumentos de singularidad ActiveSupport::Notifications
con los próximos eventos:
lock.active_job_uniqueness
runtime_lock.active_job_uniqueness
unlock.active_job_uniqueness
runtime_unlock.active_job_uniqueness
conflict.active_job_uniqueness
runtime_conflict.active_job_uniqueness
Y luego escribe a ActiveJob::Base.logger
.
ActiveJob antes de la versión 6.1
siempre Enqueued MyJob (Job ID) ...
incluso si se detiene la cadena de devolución de llamada. Detalles
Ejecutar el servidor Redis (en consola separada):
docker run --rm -p 6379:6379 redis
Ejecutar pruebas con:
bundle
rake
ActiveJob :: La unicidad admite la API SideKIQ a los bloqueos de trabajo no establecidos en la limpieza de colas (por ejemplo, a través de la interfaz de usuario web Sidekiq). Inicio Sidekiq 5.1 La muerte del trabajo también desencadena la limpieza de cerraduras. Tenga en cuenta que la limpieza de grandes colas se vuelve mucho más lenta porque cada trabajo se desbloquea individualmente. Para activar el parche de API SideKIQ, requiere explícitamente en su archivo gem:
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
Los informes de errores y las solicitudes de extracción son bienvenidos en GitHub en https://github.com/veeqo/activejob-uniquity.
La gema está disponible como código abierto bajo los términos de la licencia MIT.
En Veeqo, nuestro equipo de ingenieros está en una misión para crear un inventario de clase mundial y una plataforma de envío, construida con los más altos estándares en las mejores prácticas de codificación. Somos un equipo en crecimiento, buscando otros desarrolladores apasionados para unirse a nosotros en nuestro viaje. Si está buscando una carrera trabajando para una de las compañías tecnológicas más emocionantes del comercio electrónico, queremos saber de usted.
Blog de Veeqo Developers