非同期jobをtransaction内で呼ぶなよ!絶対に呼ぶなよ!

Railsアプリケーションでは、ActiveRecordのtransaction内でperform_laterを呼び出すと、transactionのcommit前に非同期jobが実行され、DBの状態とジョブの実行タイミングがずれてエラーになることがあります。私たちのプロダクトでもこの問題に直面し、意図せぬエラーが発生するという事象がたまに発生するという状態に陥りました。再現性があまりなく、「たまに謎の非同期jobエラーが起こる」というデバッグもしづらい問題でした。

本セッションではこの問題の実例をもとに、どういった条件で再現するのか、どのような対策を取ったのかを紹介します。例えば、開発チーム内でコンセンサスを取った上での運用面で防ぐ工夫や、Rails7.2で新たに導入されたenqueue_after_transaction_commitオプションを使い、commit後にエンキューさせる方法などです。

「なぜかたまに非同期jobで謎のエラーが発生している」「うちも同様のことをやってるかも」「enqueue_after_transaction_commitオプションって実際にどうなの」と感じている方に向けて、明日から役立つ知識とチェックポイントをお届けします。

Speaker

Yuto Urushima

Yuto Urushima

Ruby on Rails を主軸としたバックエンドエンジニアとして、Web サービスの設計・開発・運用に従事しています。現在は株式会社 Hubble にて契約書管理クラウドの開発を担当し、主に長年の技術負債を解消するチームで開発を行なっています。Rails の文脈で現実的なアーキテクチャ判断や開発効率に関心があり、技術とビジネスをつなぐ立場として価値を届けることを目指しています。個人開発や技術記事執筆、コミュニティ登壇なども継続中です。