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
1.1k
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.9k
kzltコマンドの新たなソリューションについて
muryoimpl
0
2.8k
俺とTODOアプリ~Linearの変~
muryoimpl
0
2.3k
POSIX文字クラスでの躓き
muryoimpl
0
2.2k
/kzlt コマンドとは
muryoimpl
0
940
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.5k
meetup.kzrb.org の更新を 考える ゆるふわ編
muryoimpl
0
1.5k
最近のデスク周りの diff / kzrb meetup#108-2
muryoimpl
0
31
ショートカットキーのショートカットキー / shortcut keys of shortcut keys
muryoimpl
0
100
Other Decks in Programming
See All in Programming
deno-redisの紹介とJSRパッケージの運用について (toranoana.deno #21)
uki00a
0
120
從零到一:搭建你的第一個 Observability 平台
blueswen
1
960
機械学習って何? 5分で解説頑張ってみる
kuroneko2828
0
220
AWS CDKの推しポイント 〜CloudFormationと比較してみた〜
akihisaikeda
3
280
Development of an App for Intuitive AI Learning - Blockly Summit 2025
teba_eleven
0
120
Gleamという選択肢
comamoca
6
740
Javaに鉄道指向プログラミング (Railway Oriented Pro gramming) のエッセンスを取り入れる/Bringing the Essence of Railway-Oriented Programming to Java
cocet33000
2
580
ASP.NETアプリケーションのモダナイズ インフラ編
tomokusaba
1
380
ドメインモデリングにおける抽象の役割、tagless-finalによるDSL構築、そして型安全な最適化
knih
11
1.9k
Create a website using Spatial Web
akkeylab
0
290
ktr0731/go-mcpでMCPサーバー作ってみた
takak2166
0
170
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
370
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
134
9.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.5k
4 Signs Your Business is Dying
shpigford
184
22k
How to Ace a Technical Interview
jacobian
277
23k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.7k
Site-Speed That Sticks
csswizardry
10
650
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
46
9.6k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
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