

Ruby on Railsを使用しており、非同期処理としてsidekiqを用いています。  
インフラとしてはAWS ECSを用いており、それぞれwebリクエスト処理のためにwebサーバ、sidekiq用にjobサーバを用意しています。

リリース時にはそれぞれのサーバにデプロイすることになるのですが、リリースにカラム追加などのDBスキーマの変更が含まれている場合、サーバ間のスキーマ不整合でしばしばエラーが起こります。

具体的には以下のような感じです。

① jobサーバにリリース  
② タスク起動後、bundle exec sidekiqでsidekiqプロセス開始  
③ webサーバにリリース  
④ タスク起動後、bundle exec rails db:migrateでマイグレーション、カラム追加  
⑤ bundle exec pumaでpuma起動  
⑥ ②のsidekiqプロセス上のスキーマキャッシュでは、④で追加されたカラムが存在しないので  
Unknown Attributeエラーが発生

①、③の前後関係は制御していないため、① -> ③の時間差が生じた際にのみエラーが発生します。  
何か解決策があればお教えいただけるとありがたいです。

情報が不足していればお教えください。


CC BY-SA 4.0
2023-01-23T12:42:26.247
93528
2023-01-30T17:43:48.037
2023-01-24T00:39:43.223
3060
56728
question
ruby-on-rails aws sidekiq
デプロイ時DBスキーマの変更で発生するwebサーバとjobサーバの不整合について（カラムの追加）


  1. job server, web server のコードを migration 前後のどちらの DB スキーマでも動作するようなコードに修正してデプロイ
  2. migration コードデプロイ & migration 実行
  3. job server デプロイ & 再起動等入れ替え
  4. web server デプロイ & 再起動等入れ替え

の順番にするのが良いというか一般的かと思いました。(3,4はどちらが先でもよい)

サービスをメンテナンス状態にせずにデプロイして更新するという運用を実現したい場合、常に上記手順にするのが必須かと思います。これは DB
スキーマ変更タイミングの前後に必ずコード修正前後の状態が同時に発生するためです。


CC BY-SA 4.0
2023-01-30T17:43:48.037
93629
2023-01-30T17:43:48.037
16793
93528
answer