Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
970
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
Kanazawa.rb LT大会用/kzlt コマンドの説明 2024/01版
muryoimpl
0
2.8k
kzltコマンドの新たなソリューションについて
muryoimpl
0
2.8k
俺とTODOアプリ~Linearの変~
muryoimpl
0
2.3k
POSIX文字クラスでの躓き
muryoimpl
0
2.2k
/kzlt コマンドとは
muryoimpl
0
930
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.5k
meetup.kzrb.org の更新を 考える ゆるふわ編
muryoimpl
0
1.5k
最近のデスク周りの diff / kzrb meetup#108-2
muryoimpl
0
29
ショートカットキーのショートカットキー / shortcut keys of shortcut keys
muryoimpl
0
99
Other Decks in Programming
See All in Programming
JSAI2025 RecSysChallenge2024 優勝報告
unonao
1
420
TypeScriptのmoduleオプションを改めて整理する
bicstone
4
460
Using AI Tools Around Software Development
inouehi
0
670
SODA - FACT BOOK
sodainc
1
360
RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate
moznion
1
130
Zennの運営完全に理解した #完全に理解したTalk
wadayusuke
1
170
Practical Tips and Tricks for Working with Compose Multiplatform Previews (mDevCamp 2025)
stewemetal
0
110
推論された型の移植性エラーTS2742に挑む
teamlab
PRO
0
170
漸進。
ssssota
0
1.6k
TypeScript製IaCツールのAWS CDKが様々な言語で実装できる理由 ~他言語変換の仕組み~ / cdk-language-transformation
gotok365
7
400
TypeScript LSP の今までとこれから
quramy
1
440
CSC307 Lecture 17
javiergs
PRO
0
110
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
35
6.7k
Raft: Consensus for Rubyists
vanstee
138
7k
The World Runs on Bad Software
bkeepers
PRO
68
11k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Faster Mobile Websites
deanohume
307
31k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Why Our Code Smells
bkeepers
PRO
337
57k
Statistics for Hackers
jakevdp
799
220k
How STYLIGHT went responsive
nonsquared
100
5.6k
Producing Creativity
orderedlist
PRO
346
40k
Automating Front-end Workflow
addyosmani
1370
200k
A better future with KSS
kneath
239
17k
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