1. tanaken on Rails
  2. #013: permanent_connection_c..
2024-03-31 12:07

#013: permanent_connection_checkout setting, association options list, allow_retry

サマリー

彼/彼女はアクティブレコードに関する3つのプレリクエストを紹介しています。1つ目はpermanent-connection-checkout設定の追加です。2つ目はアソシエーションオプションリストに欠けているオプションの追加です。そして3つ目はDB接続エラー時のクエリの再試行の実装です。

add-config-active-record-permanent-connection-checkout-setting
はい、こんにちは。 tanaken on Rails 第13回を始めます。
今週のThis Week in Railsから、3つのプレリクエストをピックアップしています。
早速、それぞれ説明していきます。
1つ目、add-config-active-record-permanent-connection-checkout-settingというプレリクエストです。
こちらは、アクティブレコードに関する変更です。
アクティブレコードのコンフィグに、permanent-connection-checkoutが追加されました。
この設定で、active-record-base.connectionが使われたときの挙動として、次のいずれかを指定できるようになっています。
1つ目が、エラーを発生させる。
2つ目が、非推奨の警告を発生させる。
3つ目は、どちらも発生させない。
この3つの挙動から設定ができるようになっています。
active-record-base.connectionというコネクションメソッドは、
DBコネクションプールからコネクションをチェックアウトして、
リクエストまたはジョブが終了するまでコネクションを維持したままにするという機能になっています。
この挙動は、今までよく使われているメソッドなんですけど、
この挙動自体は、使用可能なDBコネクションの数よりも、
多くリクエストが来たりとか、スレッドまたはファイバを使用する環境などで、
コネクションが足りなくなる、望ましくないという場合があると。
そんな場合において、このコネクションメソッドの代わりに、
withConnectionメソッドを使用すると、コネクションを節約することができるよという話があります。
このwithConnectionメソッドは、第7回でも紹介しているので、そちらも聞いてみてほしいんですが、
ざっくり説明すると、withConnectionメソッドについては、
ブロックを渡すことができて、受け取ったブロックの中だけコネクションを維持して、
ブロックを抜けたらコネクションを解放するという仕組みになっています。
なので、多くのスレッドとかファイバを使うような環境であっても、
必要なところだけこのwithConnectionメソッドでコネクションを張って、
終わったら解放するというふうにやると、
リクエスト全体とかジョブ全体でコネクションを維持したままにするという、
そういう必要がなくなるということができるので、
withConnectionメソッドを使いましょうねという話があります。
今回のブログリクエストで、
このパーマネントコネクションチェックアウトという設定値が追加されたことによって、
例えばエラーを発生させるという設定にしておいたら、
このコネクションメソッドを使ったときにエラーになるので、
例えばテストとか、
そもそもアプリケーション自体が落ちるようになるので気づけると。
代わりにwithConnectionを使いましょうねというような、
実装の変更がしやすくなるよねということかなと思っています。
なのでうまく適切に活用して設定をしていきましょうということですね。
Ensure all needed options are added to association options list unconditionally by unconditionallyのか
続いて2つ目。
Ensure all needed options are added to association options list unconditionally by unconditionallyのか。
英語がちょっと難しいですね。
こちらもアクティブレコードに関する変更です。
アクティブレコードを継承しているモデルでは、
HasOneとかHasManyとかいろいろアソシエーションを設定できますよね。
アソシエーションを設定するときに、
さまざまなオプションを渡すことができると思います。
皆さんご存知かと思いますが。
そういったアソシエーションに対して、
指定できないオプションを渡した場合、
そういった場合にはエラーが発生して、
エラーメッセージに指定可能なオプションはこれですよというリストが表示されるようになっています。
そうなんだと。
知らなかったんですけどね。
アソシエーションに指定できないオプションを渡したことそういえばあまりないかもなと思って。
あとはなんだろうな。
このプレリクエストでも紹介されているのが、
タイピングミス、タイポをしてしまった場合とかに、
エラーが発生するよねという感じで例で紹介されているんですけど。
このプレリクエストで何をやっているかというと、
エラーメッセージの修正をしています。
特にこのプレリクエストではHasOneのアソシエーションとHasManyのアソシエーションの場合に、
表示されるエラーメッセージの修正をしていて、
具体的にはエラーメッセージに記載される指定可能なオプションの一覧の中に、
AsとThroughが含まれていなかったので含まれるようにしているという変更ですね。
加えてThroughオプションを指定した場合には、
ソース、ソースタイプ、ディセーブルジョインズという3つのオプションも指定できるようになるので、
ソースオプションが渡ってきた場合にはこの3つのオプションも指定可能なオプションとして一覧に追加するようにしているということですね。
これによって何が嬉しいのかというと、
例えばさっきのタイポしちゃったという例のときに、
指定可能なオプションの一覧がこれですよという中に、
タイポしたもののオプションが今まで適切に例えばThroughというオプションを間違えて、
例えばHとかRとかを書かずに間違えてオプションを指定した場合に、
Throughというオプションが指定可能なオプションの一覧に出てこないので、
なんかあれおかしいな、これThroughって使えないんだっけみたいなそういう勘違いをしてしまうと、
実際はタイポしてるだけなんだけど、あれThrough使えないのかなみたいな気持ちになっちゃうのを、
ちゃんと使えるオプションは一覧に載るようになったので、
Through使えるんだけどタイポしてたんだってわかるみたいなね、
そういうことでエラーメッセージが丁寧になって嬉しいねという感じですね。
Retry Unknown Idempotent Select Queries on Connection Related Exceptions
これらのオプションは、
アクティブレコードコロンコロンアソシエーションズコロンコロンビルダーというモジュールの中の
HasOneクラスだったりHasManyクラスというのがありまして、
そのそれぞれのクラスにクラスメソッド、ValidOptionsというメソッドがありますと、
今回のプールリクではこのValidOptionsの実装を修正していて、
AsとかThroughとかそういったオプションがValidOptionsの配列に追加されるようになっていると、
そんな実装になってますね。
最後3つ目、タイトルが
Retry Unknown Idempotent Select Queries on Connection Related Exceptionsというタイトルです。
アクティブレコードに関する変更です。
今回は3つともアクティブレコードに関する変更ですね。
このプールリクエストは何をやっているかというと、
DBコネクション関連のエラーが発生した場合に、
セレクトクエリを自動的に再実行する仕組みを実装しています。
自動的に再実行されるというのはどういう時かというと、
メソッドに対して明示的に再実行可能だよということを示すパラメータを渡すという場合、
2個目がこれは絶対適当だよねというのが分かっているメソッドに関しては、
勝手に再実行のフラグが立つようにしていると、
再実行可能であるというフラグが立つようになっているということですね。
それぞれ説明すると、
例えばfindBySQLというメソッドがあります。
このメソッドにAllowRetryというキーワード引数が指定できるようになっています。
これまだマスターにはマージされているけど、
公式のAPIドキュメントにはないので、
最新のedgeapi.libreorgのドキュメントから引っ張ってきていますが、
例えばfindBySQLというメソッドだと、引数がいくつかあるんですけど、
その中にAllowRetryという引数が追加されています。
このAllowRetryに、基本はデフォルトではフォルスになっていて、
明示的にtrueを渡すことができるようになって、
trueを渡すとDBコネクション関連のエラーが発生した場合に、
セレクトクエルを自動的に再実行するようになりますということですね。
また、findメソッドとかfindByメソッドという、
Railsアプリケーションを実装していたら何度も使うようなメソッドですね。
そういったメソッドは、
適当なセレクトクエリが発行されることが自明ですよね。
例えばfindメソッドだったら、IDを引数に渡して、
モデルからIDが一致するものをセレクトしてくるとか、
findByとかも、例えばnameとかで絞り込んだ結果を1個取ってくるみたいな感じですよね。
といった、適当なセレクトクエリが発行されることが自明であるメソッドに関しては、
アクティブレコードの内部実装で再実行可能であるというフラグが立つように、
今回の修正で手が加えられているということですね。
今までDBコネクション関連のエラーが発生した場合は、
エラーになっておしまいという感じだったと思うんですけど、
それを自動的に再実行されるので、
次のコネクション成功、エラーにならずにコネクションがちゃんと繋がったとき、
繋がっていれば、再実行でうまくデータが取れるということになるので、
ありがたいのかなという感じはしてますね。
そんな感じでございます。
以上、3つのプレリクエストを紹介しました。
こんなところで今週の田中絵音レールズ、終わりにしたいと思います。
ではまた来週。バイバイ。
12:07

コメント

スクロール