SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Railsの新機能を知ろう!

より強化されたRails 8.0の新機能――SQLite統合によるSolid AdapterとActive Recordの改善など

Railsの新機能を知ろう! 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

SQLiteの本番環境への対応

 Rails 8.0では、SQLiteがProduction環境で利用できるように改良されました。SQLiteといえば、2004年のリリース以来、簡易型のRDBMS(リレーショナルデータベースシステム)として位置付けられてきました。Railsにおいても、Development環境とTest環境で使うためのRDBMSとして位置付けられ、Production環境ではRails 7.1でサポートされたTrilogyをはじめ、PostgreSQL、MySQL、SQL Server、OracleといったRDBMSを用意して使うことが推奨されてきました。

 改良は、SQLiteアダプタとRubyドライバに対して多くの点で実施されました。その結果、Production環境での利用に耐える性能になり、今回の変更に至りました。config/database.ymlファイルを見ると、既定でSQLiteを使用し、それはProduction環境でも変わりません。従来は、Trilogyを使う前提の設定となっていたところでした。

リスト config/database.yml
default: &default
  adapter: sqlite3				# 既定でSQLiteが使用される
…略
production:
  primary:
    <<: *default
    database: storage/production.sqlite3	# そのままSQLiteが使用される

 開発のフェーズにかかわらず同様のデータベース環境を利用できることで、いちいち本番用のデータベース環境を構築する必要がなく、開発効率を向上できます。また、後述するSQLite Solid Adapterの実装にもつながり、結果として本番環境であるDockerコンテナの構成要素をシンプルにできる効果も生まれました。

 この他、以下の改善が実施されています。

  • create_virtual_tableメソッドによる全文検索と仮想テーブルのサポート
  • 同時実行性の向上を目的としてトランザクションは既定でIMMEDIATEモードに
  • SQLite3::BusyExceptionのActiveRecord::StatementTimeoutへの変換によるエラー処理強化

[NOTE]IMMEDIATEモードとEXCLUSIVEモード

 データベースのトランザクションで指定できるロックモードのことを言います。ロック中、IMMEDIATEモードでは他のユーザは読み取りのみ許可されますが、EXCLUSIVEモードでは読み書きともに許可されません。読み取りのみ許可されるIMMEDIATEモードの方が、性能が向上する可能性がありますが、読み取りが許可されることの問題が生じる可能性もあり、状況に応じた使い分けが必要となっています。

SQLite Solid Adapterの実装

 Rails 8.0では、各環境の利用データベースがSQLiteに統合されたことで、Solid Adapterが利用可能になりました。

 Solid Adapterとは、SQLiteを前提としたデータベースアダプタです。従来、WebSocket(Action Cable)、キャッシュ(Active Cache)、ジョブ(Active Job)については、そのバックエンドとしてPostgreSQLやMySQLといったリレーショナルデータベースに加えてオンメモリデータベースRedisを必要としていました。Rails 8.0では、これらの全てをSQLiteで置き換える3つのSolid Adapter(Solid Cable、Solid Cache、Solid Queue)によって、MySQLやRedisが必須ではなくなりました。

 この背景には、SSDなどの高速なメモリストレージによって、オンメモリデータベースの必要性が低下したことがあります。また、上記のとおりRailsにおけるSQLiteデータベースの性能が向上し、Webサーバとして一般的な利用の範囲において十分に運用に耐える状況となったことも挙げられます。

 3つのアダプタの導入により、config/database.ymlファイルにおいてProduction環境の設定が以下のように変わりました。モデル用に通常使用されるデータベースファイルとは別に、それぞれ専用のデータベースとマイグレーションファイルのパスが使用されます。

リスト config/database.yml
production:
  primary:					# モデル用
    <<: *default
    database: storage/production.sqlite3
  cache:					# Solid Cache用
    <<: *default
    database: storage/production_cache.sqlite3
    migrations_paths: db/cache_migrate
  queue:					# Solid Queue用
    <<: *default
    database: storage/production_queue.sqlite3
    migrations_paths: db/queue_migrate
  cable:					# Solid Cable用
    <<: *default
    database: storage/production_cable.sqlite3
    migrations_paths: db/cable_migrate

Solid Cable

 Solid Cableは、Action Cableにおける新しいサブスクリプションアダプタです。Action Cableでは、Pub/Subモデルにおけるサブスクリプションの管理に、Production環境ではRedisやPostgreSQLなどの利用が推奨されてきました。SQLiteを使うSolid Cableの導入により、これらのデータベースシステムが必須でなくなります。

 さらに、送信メッセージを1日間データベースに保持するので、リアルタイム更新におけるデバッグを行いやすくなるメリットもあります。Action Cableの設定ファイルであるconfig/cable.ymlにおいても、以下のようにサブスクリプションアダプタにsolid_cableを使うように設定されています。

リスト config/cable.yml
production:
  adapter: solid_cable

Solid Cache

 Solid Cacheは、Railsのキャッシュシステムにおける新しい保存先です。HTMLのフラグメントキャッシュは、従来はProduction環境を含めて内部メモリに記録されてきました(Production環境では必要に応じてデータベースを使う前提)。

 Rails 8.0では、config/environments/production.rbファイルにおけるconfig.cache_storeの設定は、既定でSolid Cacheを使うように変更されています。

リスト config/environments/production.rb
config.cache_store = :solid_cache_store

 SQLiteを使うSolid Cacheによって、キャッシュ保存先をSQLiteデータベースにすることで、高速性が失われないばかりか、大きなキャッシュサイズに対するコストを抑えたキャッシュシステムを構築できるようになりました。メモリキャッシュと異なり容量に余裕があるので、キャッシュの有効期間を延ばすこともできます。

 なお、キャッシュには暗号化が施され、明示的な廃棄期間によって管理しやすくなっています。プライバシーポリシーなどで定めたキャッシュ期間を反映しやすくなるといったメリットがあります。

Solid Queue

 Solid Queueは、Active Jobにおける新しいキューアダプタです。Active Jobでは、ジョブのキューイングのためにResque、Delayed Job、Sidekiqといったライブラリを必要としていました(既定はSidekiq)。

 Sidekiqは、バックエンドにRedisを使用するので、Active Jobの利用ではRedisの稼働が前提となっていました。SQLiteを使うSolid Queueには、堅牢な同時実行制御、失敗時の再試行とアラート、定期的なジョブスケジューリングなどの特徴があり、Sidekiqやそれが依存するRedisが必須でなくなります。

 config/environments/production.rbファイルにおけるconfig.active_job.queue_adapterの設定は、既定でSolid Queueを使うように変更されています。

リスト config/environments/production.rb
config.active_job.queue_adapter = :solid_queue
config.solid_queue.connects_to = { database: { writing: :queue } }

次のページ
scriptフォルダとジェネレータ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Railsの新機能を知ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20998 2025/02/21 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング