Open2

Kaigi on Rails 2024のメモ

やまやまやまやま

1日目

GMOのスポンサーセッション

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(望む動作)
  • Pull Requests レビューについて考えていること

    そのカラム追加、ちょっと待って!カラム追加で増えるActiveRecordのメモリサイズ、イメージできますか?

  • 1つのカラムをadd_columnすると何バイト増えるか?

    • 224バイト

Sidekiqで実現する長時間非同期処理の中断と再開

SmartHR バーチーさん(千葉さん) バックエンドエンジニア

カスタムしながら理解するGraphQL Connection

リリース8年目のサービスの1800個のERBファイルをViewComponentに移行した方法とその結果

  • ビューファイルの問題

    • パラメータ定義の曖昧さ
    • 一貫性のパラメータの渡し方
    • テンプレート内のロジックの多さ
  • ViewComponent

  • 移行をどのようにやるか

    • すべてのViewComponentを、erbをもとに自動生成スクリプトで実行した
      • 開発を止めないでできる
    • 全テストのパスが大変そう。。。
    • リリース
      • 別系統の生成
      • フィーチャーフラッグでの切り替えでテスト
      • カナリアリリース
        • 一部のユーザーのみに先にリリース
  • 移行期間(一人で)

現実のRuby/Railsアップグレード

  • バージョンが古いと
    • セキュリティ更新が受けられない
    • gemの要求バージョンが満たせない
  • アップグレード手順
    • RubyとRailsのバージョン依存関係を確認
    • 段階的なアップグレード(Railsガイド通りにやる)
  • 発生した問題
    • 保守されていないgem
    • Railsをモンキーパッチしているgem
    • Rubyの非互換な変更
    • Railsの非互換な変更
  • 得られたもの
    • レスポンスのパフォーマンス向上
    • テストを書く文化
  • アップグレードするため
    • gemの選び方
      • 自分が保守できるか
      • 継続性はありそうか
    • コードの書き方
      • 賢そうなコードを書かない
      • 依存関係を閉じ込めない
    • リソースの確保
      • 片手間ではできない
    • エンジニアの説明責任

    Hotwire or React? 〜Reactの録画機能をHotwireに置き換えて得られた知見〜

  • ちょっとした箇所ならばReactでなくて良くね?
    https://zenn.dev/shita1112/books/cat-hotwire-turbo/viewer/abstract
  • stimulusとは
    • Turboと相性の良いjsライブラリ
  • Turboとは
    • Hotwireの中核となるJavaScriptのライブラリ。Turboを使うとJavaScriptを書かずにSPAのようなインタラクティブなアプリケーションを作れる。

https://speakerdeck.com/harunatsujita/hotwire-or-react

やまやまやまやま

2日目

作って理解する RDBMSのしくみ

RDBMSの全体像

  • 構文解析器

  • プランナ・オプティマイザ

    • クエリの実行計画を立てる
  • クエリエクスキュータ

    • 実行計画通りにデータにアクセスする
  • バッファプールマネージャ

    • キャッシュの管理
  • ディスクマネージャ

    • ディスク上のデータの読み書き
  • データの探索法の話

ActiveRecord SQLインジェクションクイズ (Rails 7.1.3.4)

  • 何となくやってたところを再認識
  • 最後の問題知らんかった
  • breakeman
    • コードをスキャンして脆弱性を指摘してくれる
    • Rails7.2から標準

https://speakerdeck.com/kozy4324/activerecord-sqlinziekusiyonkuizu-rails-7-dot-1-3-dot-4

推し活のハイトラフィックに立ち向かうRailsとアーキテクチャ

  • モノシリックなRailsでハイトラフィックをどう対応している?
    • スロークエリを起こさないように実装
    • CDNでのキャッシュを活用する
    • CDNでのキャッシュでは難しい場合、Redisの利用
  • イベント当日使うアプリはパフォーマンスシビアにみないといけないから大変そう
  • トランザクションで行ロックの奪い合いになる
    • 在庫テーブルの設計を変える
      • 1在庫1行のデータ構造で管理する
    • FOR UPDADE SKIP LOCKEDで行ロックしている行をスキップしてくれる
  • 決済と在庫確保の調整難しそう。。。
  • レートリミットを導入
    • 捌けないものはそもそも受付けない

入門「状態」

  • コード見るとめっちゃ辛い
  • オブジェクトが持つ状態
    • 内部が持つインスタンス変数で保持
  • 状態は表現される幅が広くなると辛くなる
  • 変化の幅が広くなると辛くなる
  • 状態の辛さをどう抑制する?
    • 状態の変化を可能な限り指せない
      • 再代入させない
    • 状態の変化幅を限定させる
      • メソッドで限定させる
    • 状態をシンプルに少なく保つ
  • Railsで辛い状態をいなす
    • 再代入させないようにメソッドで分岐させるようにする

Sidekiq vs Solid Queue

https://speakerdeck.com/willnet/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)に優位性がある
    • インターフェース
    • 機能
      • Sidekiqの方が使える機能多い
        • バッチでジョブを処理できる
        • Rate Limiting
        • Encryption
          • Redisに渡すデータの一部を自動的に暗号化、複合する

Importmapを使ったJavaScriptの読み込みとブラウザアドオンの影響

https://speakerdeck.com/swamp09/importmapwoshi-tutajavascriptno-du-miip-mitoburauzaadoonnoying-xiang

  • Webpackerがそのうち終わる?(あと5年くらい?)
  • Rails 7で標準となったimportmap
    • JSの読み込みに関するやつ?
    • node_modulesを使わずにブラウザ上で読み込みるようになったビルドしなくて良くなった
    • ビルドツール使わないでもいける

Tuning GraphQL on Rails

  • N + 1をどうのように解決するかの話
    • GraphQLでどう解決したか
    • lookaheadを利用する
    • graphql-batchを使う
  • パフォーマンス問題の探し方
    • APM使うのが良い
    • gemだとGraphQLだと上手く動かない場合あり
  • パフォーマンスは日々下がっていく

大事なデータを守りたい!ActiveRecord Encryptionと、より安全かつ検索可能な暗号化手法の実装例の紹介

https://www.docswell.com/s/free_world21/ZQRM4V-2024-10-26-165756