Sidekiqは、Ruby/Railsアプリケーションのための非同期ジョブ処理ライブラリ。アプリケーションのパフォーマンスとユーザー体験を向上させるために、重い処理をバックグラウンドで実行できる
またJobとは、非同期で実行したい処理の単位のことで、Rubyのクラスとして定義する
Sidekiqシステムは3つの主要コンポーネントから構成されている
MyWorker.perform_async(args)
を呼び出したときbundle exec sidekiq
で起動)SomeWorker.perform_async(1, 2)
を呼び出す例:
メリット:
軽量な処理の場合:
whenever
gem + cron で十分複雑・重い定期処理の場合:
Docker環境でRailsアプリケーションとSidekiqを使用するときのcompose.yml。Sidekiqの使用例としては、管理画面からマスターデータのCSVファイルをアップロードしてデータベースに保存するとする
この時、appコンテナ (Railsアプリ)は、Sidekiq ClientとしてJobをRedisにキューイングする役割を持っているので、redisコンテナが先に起動している必要がある
また、sidekiqコンテナは、RedisからJobを取り出してデータベースに保存する処理 (Workerクラスに定義) を担うので、redisコンテナとdbコンテナが先に立ち上がっている事を保証する必要がある
# compose.ymlservices:app:image: your-rails-appdepends_on:db:condition: service_healthyredis:condition: service_healthy # ...その他の設定db:image: mysql:8.0volumes:-mysql_data:/var/lib/mysqlhealthcheck:test:["CMD","mysqladmin","ping","-h","localhost"]interval: 5stimeout: 5sretries:5 # ...その他の設定redis:image: redis:7.0volumes:-redis_data:/datacommand: redis-server --appendonly yeshealthcheck:test:["CMD","redis-cli","ping"]interval: 5stimeout: 3sretries:5 # ...その他の設定sidekiq:image: your-rails-appcommand: bundle exec sidekiqdepends_on:db:condition: service_healthyredis:condition: service_healthyvolumes:mysql_data:redis_data:
Redisコンテナのデータを永続化するには、以下の2つの方法がある
volumes:-redis_data:/data
volumes:-./redis-data:/data
バックエンド側での非同期処理についてあまりイメージがついていませんでしたが、Sidekiqを使うことで、重い一斉メール送信やCSVインポートなどの処理を非同期で実行できて、また、複雑な処理の定期実行などもできるみたいです
多くのシステムで画像を別テーブルに保存する理由:
実際のベストプラクティスとしては、画像データ自体はデータベースではなく専用のストレージに保存することが一般的
この場合、データベースには画像への参照情報(パスやURL)のみを保存します。
データベースにバイナリデータとして保存する場合:
最も広く採用されているアプローチは以下の2パターン
画像データはデータベース外のストレージに保存
データベースには参照情報のみを保存
このアプローチは以下のメリットがある
小規模なアプリケーションや特殊な要件がある場合を除き、画像データの保存には専用のストレージソリューションを使用するのが現代のベストプラクティスと言える
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。