Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + ...
Search
muryoimpl
January 18, 2025
Programming
0
1.3k
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + Litestream 編
北陸三県.rb Lightning Talks in Kanazawa@ ITBP武蔵 で LT したスライド
muryoimpl
January 18, 2025
Tweet
Share
More Decks by muryoimpl
See All by muryoimpl
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
70
人魚とたわむれる
muryoimpl
0
26
Kanazawa.rb LT大会用/kzlt コマンドの説明 2024/01版
muryoimpl
0
3k
kzltコマンドの新たなソリューションについて
muryoimpl
0
2.9k
俺とTODOアプリ~Linearの変~
muryoimpl
0
2.6k
POSIX文字クラスでの躓き
muryoimpl
0
2.3k
/kzlt コマンドとは
muryoimpl
0
960
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.6k
meetup.kzrb.org の更新を 考える ゆるふわ編
muryoimpl
0
1.5k
Other Decks in Programming
See All in Programming
スタートアップを支える技術戦略と組織づくり
pospome
8
16k
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
380
20 years of Symfony, what's next?
fabpot
2
340
【Streamlit x Snowflake】データ基盤からアプリ開発・AI活用まで、すべてをSnowflake内で実現
ayumu_yamaguchi
1
120
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
shogo4131
8
2.3k
なあ兄弟、 余白の意味を考えてから UI実装してくれ!
ktcryomm
11
11k
Go コードベースの構成と AI コンテキスト定義
andpad
0
120
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
170
AIコーディングエージェント(Manus)
kondai24
0
160
ZOZOにおけるAI活用の現在 ~モバイルアプリ開発でのAI活用状況と事例~
zozotech
PRO
8
5.4k
How Software Deployment tools have changed in the past 20 years
geshan
0
28k
社内オペレーション改善のためのTypeScript / TSKaigi Hokuriku 2025
dachi023
1
550
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
710
Building Flexible Design Systems
yeseniaperezcruz
330
39k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
BBQ
matthewcrist
89
9.9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
Practical Orchestrator
shlominoach
190
11k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Transcript
Kanazawa.rbのLT大会を 支える技術の裏側を変更する Ruby on Rails + Litestream 編 2025/01/18 北陸三県.rb
Lightning Talks in Kanazawa@ ITBP武蔵 Kanazawa.rb muryoimpl
Kanazawa.rb の LT 大会は Slack の Slash Command である KZLT
コマンドでエントリと発表順の 管理をしている
実行の仕組み Slack Apps Script /kzlt を入力 POST リクエスト Webアプリとして公開された Apps
Script end- point レスポンス Spread sheet 結果を 書き込む doPost() 関数 hook で呼び出す ※動かすためにお金はかけていない
KZLT に対する不満 • Spreadsheet が裏側だと同時に同セルに書き込みすることがあり、 エントリが消されてしまう(頑張らずにあえて放置してた) ◦ 創造主による監視、修正が必要 • データを扱う際は、
SQL を使いたい ◦ Spreadsheet を全部舐めてデータ集計を頑張りたくない • 慣れた言語を使って実装したい ◦ Kanazawa. “rb” だし • 無料 もしくは 使った分だけお支払いにしたい ◦ == 使わないときはお金かからないようにしたい
年末年始を使って 作り変えちゃおうか と啓示があったので 作り変える
どう作るか? • SQLite + Litestream を採用する ◦ SQLを使いつつ、DB をファイルとして扱いバックアップをとることで常時動く Database
にかかるコス トをなくす ◦ entryの登録はDBへのINSERTが基本になるので、書き込み時に衝突して消えることはなくなるはず • Ruby on Rails を採用し、 Cloud Run 上で動かす ◦ リクエストをさばく分だけ課金されるようにする。おそらく無料枠で足りるだろう ◦ 慣れ親しんだ言語、慣れ親しんだフレームワークを使う ◦ コンテナ を作り、その中で Litestream を動かす • Google Cloud 上の Cloud Run でアプリを、 Cloud Storage で SQLite を管理する ◦ https://github.com/fractaledmind/litestream-ruby を Rails と一緒に使って Cloud Storage を保 管先にする • https://github.com/muryoimpl/kzlt-ruby にコードを置く
注意点 • SQLiteを Litestream で使うには WAL を有効にする必要がある ◦ Write-Ahead Logging
オプションのこと ◦ 有効にすると高速化し同時実行性が高まるらしい ▪ https://www.sqlite.org/wal.html ◦ その他チューニングは PRAGMA、cofig/database.yml と patch で 適用する ◦ patchとその記事: https://fractaledmind.github.io/2023/09/07/enhancing-rails-sqlite-fine-tuning/ • litestream-ruby に付属の puma extension を有効にする ◦ pumaの扱うイベントに replicateを任せるなら puma.rbに追記が必要。今回は任せる ◦ https://github.com/fractaledmind/litestream-ruby?tab=readme-ov-file#replication
ということで KZLT の裏側を 新しいものに差し替えた
新しい仕組み Slack /kzlt を入力 POST リクエスト Google Cloud Cloud Run
レスポンス データを 世代管理 Cloud Storage bucket generations generations generations Container Ruby on Rails Litestream • Cloud Build で GitHub と連携し、自動でコンテナをビルドしている • Artifact Registryサイズ超過で今月は数十円かかるが、設定で解決する見込み
モデル この 4 モデルで管理する。 workspace のデータは data_migrate で入れる。 他の workspace
から request がきても処理しない つくりになっている。
やったこと • rails new して、Gemfile に `gem “litestream”` を追記する •
bundle install して、 `rails g litestream:install` を実行する • config/litestream.yml に、保存する bucket, path, type: gcs, を記述する • Dockerfile に litestream のインストール処理を記述する • Dockerfile の CMD に 、entrypoint.sh を指定する ◦ 古い sqlite3 ファイルを削除する ◦ rails litestream:restore – –if-replica-exists を実行し、 sqlite3ファイルを復元する ◦ rails server を実行する • config/puma.rb に production のときだけ宣言 plugins :litestream を実行する ように設定する • sqlite に pragma を適用する patches を当てる • リクエストを処理して希望のコマンドに当たる処理を実装する
Litestream を使うと ←↑のようにCloud Storage 上に SQLite が世代管理される
置き換えてよかった点 • いつもの言語 Ruby で実装 & データの操作は SQL (ActiveRecord) でできるよう
になった ◦ セルの操作よりは断然イメージしやすく実装しやすい • ひきつづき、低コストで運用できる ◦ リクエスト毎の課金だが、無料枠がありこれを超えることはなさそう ◦ コンテナイメージの管理がサイズ課金だが、削除ポリシー適用であっても数円になる予定 ◦ 仮にCloud Run を起動しっぱなしにしても、年 2 回なら大したコストではなさげ • Strategy Pattern や Command Pattern な感じの実装で適度に分割統治できた 気がする ◦ サブコマンドの追加が容易になった
ちょっと悪くなった点 • Cloud Run なので、コンテナの停止 → 起動までに時間がかかるようになった ◦ 初回リクエストからコマンドを受け付けるまでの間、エラーになっちゃう ◦
暖機運転的なリクエストをあらかじめしておくか? ◦ 年 2 回運用ならその日だけ常時動かしておくのもいいかな、とは思う • フレームワーク、ライブラリを使うようになったので保守が必要 ◦ dependabot PR のマージが基本だとは思うが、 runtimeの更新やライブラリの breaking change が出る可能性はある • Litestream を使っている関係で、スケールアウトはできない ◦ それほど Kanazawa.rb の LT 大会に参加する人が増えるというのは、嬉しい悲鳴の範疇なので は? ◦ そうなったらちゃんとした hosted database を使おうと思う
まとめ • Cloud Run + Litestream でお安く動作環境を準備できた • Ruby +
Ruby on Rails の慣れた環境、 SQLでデータを操作できるようになった • コマンド毎に処理を実装できるようになったので、追加・修正は簡単になった • 初回起動に時間かかるは運用で回避する。保守に手間がかかるは毎月の meetup でやればどうということはないかな • SQLite利用 + 同時実効性上昇の設定で、書き込みでエントリが衝突、消える問 題は解消されたはず
参照URLs • https://litestream.io/ • https://github.com/fractaledmind/litestream-ruby • https://fractaledmind.github.io/2023/09/07/enhancing-rails-sqlite-fine-tuning/ • https://github.com/fractaledmind/litestream-ruby?tab=readme-ov-file#replication •
https://github.com/muryoimpl/kzlt-ruby