Open2
Kaigi on Rails 2024のメモ
1日目
GMOのスポンサーセッション
- Shoryuken(Sidekiqと同じ非同期処理)
- AWSとの互換性が良さそう
https://qiita.com/gussann0505/items/7ff01520a735b2a7a60f
https://speakerdeck.com/yumu/minnenoshoryukenhuo-yong-kaigi-on-rails-2024-suponsalt
RailsのPull requestsのレビューの時に私が考えていること
-
Rubyコミッターとしての視点から
-
基本的にRailsガイドに書いてある
https://guides.rubyonrails.org/v3.1/contributing_to_ruby_on_rails.html- 今回は考えを踏まえて
-
Issuesについて考えていること
- Titleが重要
- 問題のサマリーをかく
- [BUG]などのタグをつけない(限られた文字数なので)
- 問題があるからIssueをあげているから
- Steps to reproduce(再現手順)
- 再現手順がないものはなかなか難しい
- Expected behavior(望む動作)
- Titleが重要
-
Pull Requests レビューについて考えていること
- ユースケースがあるか?
- 一番重要な要素
- あなたのユースケースであることが重要
- 理由を説明できるから
- 多くのユーザーの役に立つか
- そのユースケースはRailsで解決すべきか
- Emojiの数ではマージの判断にならない
- 英語
-
https://guides.rubyonrails.org/contributing_to_ruby_on_rails.html
https://speakerdeck.com/yahonda/railsnopull-requestsnorebiyunoshi-nisi-gakao-eteirukoto
- ユースケースがあるか?
-
1つのカラムをadd_columnすると何バイト増えるか?
- 224バイト
Sidekiqで実現する長時間非同期処理の中断と再開
SmartHR バーチーさん(千葉さん) バックエンドエンジニア
-
長時間実行中のジョブを抱える問題
- データや処理の不整合
- ログを目視確認してから停止している
- データや処理の不整合
-
中断・再開処理
- 長時間非同期処理については必須の技術
- 中断処理
- 再開処理
- 保存方式
- ID番号保持方式
- 行番号保持方式
-
運用上デプロイに影響
-
ファイルサイズが大きい(Redis、GCS)
- Redisの場合、容量超えるとSidekiqに影響する
-
中断・再開処理のテスト観点
-
Sidekiq Iteration
カスタムしながら理解するGraphQL Connection
- GraqhQL API
- 一つのエンドポイントで取得
- 必要な情報のみ取得できる
- 多分この辺の話
- オフセットページネーション、カーソルページネーション
リリース8年目のサービスの1800個のERBファイルをViewComponentに移行した方法とその結果
-
ビューファイルの問題
- パラメータ定義の曖昧さ
- 一貫性のパラメータの渡し方
- テンプレート内のロジックの多さ
-
ViewComponent
- ビューのテストも容易に行えるので保守性が上がる
- パーシャルよりもレンダリング時間が短くなり、パフォーマンスの向上が見込める
https://zenn.dev/cobachie/articles/tried-view-component
-
移行をどのようにやるか
- すべてのViewComponentを、erbをもとに自動生成スクリプトで実行した
- 開発を止めないでできる
- 全テストのパスが大変そう。。。
- リリース
- 別系統の生成
- フィーチャーフラッグでの切り替えでテスト
- カナリアリリース
- 一部のユーザーのみに先にリリース
- すべてのViewComponentを、erbをもとに自動生成スクリプトで実行した
-
移行期間(一人で)
現実のRuby/Railsアップグレード
- バージョンが古いと
- セキュリティ更新が受けられない
- gemの要求バージョンが満たせない
- アップグレード手順
- RubyとRailsのバージョン依存関係を確認
- 段階的なアップグレード(Railsガイド通りにやる)
- 発生した問題
- 保守されていないgem
- Railsをモンキーパッチしているgem
- Rubyの非互換な変更
- Railsの非互換な変更
- 得られたもの
- レスポンスのパフォーマンス向上
- テストを書く文化
- アップグレードするため
- gemの選び方
- 自分が保守できるか
- 継続性はありそうか
- コードの書き方
- 賢そうなコードを書かない
- 依存関係を閉じ込めない
- リソースの確保
- 片手間ではできない
- エンジニアの説明責任
- アップグレード自体は利益を生まない
- セキュリティの危険は確実に上がる
- 説明した結果、経営層から「やらない」判断されたらしょうがない
https://zenn.dev/takeyuwebinc/articles/4c44a4f284d3d1
- gemの選び方
- ちょっとした箇所ならばReactでなくて良くね?
https://zenn.dev/shita1112/books/cat-hotwire-turbo/viewer/abstract - stimulusとは
- Turboと相性の良いjsライブラリ
- Turboとは
- Hotwireの中核となるJavaScriptのライブラリ。Turboを使うとJavaScriptを書かずにSPAのようなインタラクティブなアプリケーションを作れる。
2日目
作って理解する RDBMSのしくみ
RDBMSの全体像
-
構文解析器
-
プランナ・オプティマイザ
- クエリの実行計画を立てる
-
クエリエクスキュータ
- 実行計画通りにデータにアクセスする
-
バッファプールマネージャ
- キャッシュの管理
-
ディスクマネージャ
- ディスク上のデータの読み書き
-
データの探索法の話
ActiveRecord SQLインジェクションクイズ (Rails 7.1.3.4)
- 何となくやってたところを再認識
- 最後の問題知らんかった
- breakeman
- コードをスキャンして脆弱性を指摘してくれる
- Rails7.2から標準
推し活のハイトラフィックに立ち向かうRailsとアーキテクチャ
- モノシリックなRailsでハイトラフィックをどう対応している?
- スロークエリを起こさないように実装
- CDNでのキャッシュを活用する
- CDNでのキャッシュでは難しい場合、Redisの利用
- イベント当日使うアプリはパフォーマンスシビアにみないといけないから大変そう
- トランザクションで行ロックの奪い合いになる
- 在庫テーブルの設計を変える
- 1在庫1行のデータ構造で管理する
- FOR UPDADE SKIP LOCKEDで行ロックしている行をスキップしてくれる
- 在庫テーブルの設計を変える
- 決済と在庫確保の調整難しそう。。。
- レートリミットを導入
- 捌けないものはそもそも受付けない
入門「状態」
- コード見るとめっちゃ辛い
- オブジェクトが持つ状態
- 内部が持つインスタンス変数で保持
- 状態は表現される幅が広くなると辛くなる
- 変化の幅が広くなると辛くなる
- 状態の辛さをどう抑制する?
- 状態の変化を可能な限り指せない
- 再代入させない
- 状態の変化幅を限定させる
- メソッドで限定させる
- 状態をシンプルに少なく保つ
- 状態の変化を可能な限り指せない
- Railsで辛い状態をいなす
- 再代入させないようにメソッドで分岐させるようにする
Sidekiq vs Solid Queue
- Sidekiqを既に使っているなら大体はそれを使うで良さそう
- 新規で小さいサービスで始める段階ならあり?
- バックグランドワーカー
- リクエスト処理に時間がかかるものをアプリケーションサーバーの代わりに行う
- メール送信、外部のWeb APIを実行する
- バッチ処理やCronジョブのようなタスクを実行する
- RailsだとActive Jobがある
- SidekiqはActive Jobより前に出ている
- それぞれ単体で使う想定で出来ているのでActive Jobのアダプタとして使用すると想定外の挙動になる可能性がある
- Rails8.0からSolid Queueが標準として採用される
- Active Jobから利用される前提のインターフェース
- バックグラウンドワーカーの選定
- SidekiqはProプランかEnterpriseプラン使用が前提になる
- ジョブ情報を貯めておける
- ジョブの情報を失わずに再実行できる
- ストレージ
- RedisかRDBか
- Solid Queueは基本的にジョブ専用のDBを持つ前提
- 小さいサービスであればアプリケーションのDBと相乗りができるのでSolid Queueが管理しやすい
- 大量のジョブを扱うのであればSidekiq(Redis)に優位性がある
- RedisかRDBか
- インターフェース
- 機能
- Sidekiqの方が使える機能多い
- バッチでジョブを処理できる
- Rate Limiting
- Encryption
- Redisに渡すデータの一部を自動的に暗号化、複合する
- Sidekiqの方が使える機能多い
- SidekiqはProプランかEnterpriseプラン使用が前提になる
Importmapを使ったJavaScriptの読み込みとブラウザアドオンの影響
- Webpackerがそのうち終わる?(あと5年くらい?)
- Rails 7で標準となったimportmap
- JSの読み込みに関するやつ?
- node_modulesを使わずにブラウザ上で読み込みるようになったビルドしなくて良くなった
- ビルドツール使わないでもいける
Tuning GraphQL on Rails
- N + 1をどうのように解決するかの話
- GraphQLでどう解決したか
- lookaheadを利用する
- graphql-batchを使う
- パフォーマンス問題の探し方
- APM使うのが良い
- gemだとGraphQLだと上手く動かない場合あり
- パフォーマンスは日々下がっていく
- 新しい機能が追加され、クエリが増えていく
https://speakerdeck.com/pyama86/tuning-graphql-on-rails
- 新しい機能が追加され、クエリが増えていく
大事なデータを守りたい!ActiveRecord Encryptionと、より安全かつ検索可能な暗号化手法の実装例の紹介