私はサードパーティのサービスを使用するアプリケーションを持っています。私のアプリケーションは、DBに格納されているそのサービスの認証を作成できます。その認証は、使用されるDB内にある必要があるため、同じトランザクションでコミットすることはできません。この作業を行うために、スレッドを開いて新しいDB接続を作成し、直ちに認証レコードをコミットします。スレッドからバックグラウンドジョブを作成する
このスレッドを使用して問題が発生しているようです。スレッドがなければ、すべてのコードがスムーズに実行されます。私は認証を使用する必要があり、DBにまだ入っていないので、401が表示されます。
以下は何が起こっているかを追うことができます。ユーザーを作成すると、run_backround_job
になるまでさまざまなコールバックがトリガーされます。それはperform_later
にぶら下がっているようです。スレッドコードを削除して直ちに実行させると、すべてが機能します。しかし何らかの理由で、ジョブが別のスレッドにある場合は、ジョブをキューイングすることに固執します。
class User < ApplicationRecord
belongs_to :organization
after_create :use_auth
def use_auth
organization.find_or_create_auth
end
end
class Organization < ApplicationRecord
has_many :authentications
has_many :users
def find_or_create_auth
Thread.new do
ApplicationRecord.connection_pool.with_connection do
authentications.find_or_create_by(name: name)
end
end.join.value
end
end
class Authentication < ApplicationRecord
belongs_to :organization
after_create :run_background_job
def run_background_job
AuthBackgroundJob.perform_later(id)
end
end
レール(5.0.0) PUMA(3.6.0) sidekiq(4.1.4)
これは動作するようです!しかし、私にはそれほど奇妙ではありませんでした。 –
https://github.com/mperham/sidekiq/wiki/FAQ#why-am-i-seeing-a-lot-of-cant-find-modelname- with-id12345-errors-with-sidekiq –