A jóia permite proteger a singularidade do trabalho com as próximas estratégias:
Estratégia | O trabalho está bloqueado | O trabalho está desbloqueado |
---|---|---|
until_executing | Quando empurrado para a fila | Quando o processamento começa |
until_executed | Quando empurrado para a fila | Quando o trabalho é processado com sucesso |
until_expired | Quando empurrado para a fila | Quando a trava expirou |
until_and_while_executing | Quando empurrado para a fila | Quando o processamento começa Um bloqueio de tempo de execução é adquirido para evitar empregos simultâneos tem opções extras: runtime_lock_ttl , on_runtime_conflict |
while_executing | Quando o processamento começa | Quando o trabalho é processado com qualquer resultado, incluindo um erro |
Inspirado pelo sidekiquniquejobs, usa Redlock sob o capô.
Adicione a jóia activejob-uniqueness
ao seu GemFile.
gem 'activejob-uniqueness'
Se você deseja que o desbloqueio de empregos para a interface do usuário da Web Sidekiq, exige explicitamente o patch. A limpeza das filas se torna mais lenta!
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
E execute o comando bundle install
.
ActiveJob :: A singularidade está pronta para funcionar sem nenhuma configuração. Ele usará REDIS_URL
para conectar -se à instância do Redis. Para substituir os padrões, crie um Inicializador config/initializers/active_job_uniqueness.rb
usando o seguinte 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
Você pode definir padrões globalmente com a configuração
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
A estratégia selecionada desbloqueia automaticamente os trabalhos, mas em alguns casos (por exemplo, a fila é purgada), é útil desbloquear trabalhos 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!
Provavelmente você não quer que os empregos sejam trancados em testes. Adicione esta linha ao seu conjunto de testes ( rails_helper.rb
):
ActiveJob :: Uniqueness . test_mode!
ActiveJob :: Singularent Instruments ActiveSupport::Notifications
com os 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
E então grava no ActiveJob::Base.logger
.
O ActiveJob antes da versão 6.1
sempre Enqueued MyJob (Job ID) ...
mesmo que a cadeia de retorno de chamada seja interrompida. Detalhes
Run Redis Server (em console separado):
docker run --rm -p 6379:6379 redis
Execute testes com:
bundle
rake
ActiveJob :: Singularidade suporta a API SAMPERKIQ para não atingir os bloqueios de trabalho na limpeza das filas (por exemplo, via Samekiq Web UI). Sidekiq 5.1 Death Death Death também desencadeia a limpeza de bloqueios. Leve em consideração que a limpeza das grandes filas se torna muito mais lenta porque cada trabalho está sendo desbloqueado individualmente. Para ativar o patch da API Sidekiq, o requer explicitamente no seu GemFile:
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
Relatórios de bug e solicitações de puxar são bem-vindos no github em https://github.com/veeqo/activeJob-uniqueness.
A GEM está disponível como código aberto nos termos da licença do MIT.
Na Veeqo, nossa equipe de engenheiros está em uma missão para criar uma plataforma de inventário e remessa de classe mundial, construída com os mais altos padrões nas melhores práticas de codificação. Somos uma equipe em crescimento, procurando outros desenvolvedores apaixonados para se juntar a nós em nossa jornada. Se você está procurando uma carreira trabalhando para uma das empresas de tecnologia mais emocionantes do comércio eletrônico, queremos ouvir você.
Blog de desenvolvedores Veeqo