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
qmuntal/stateless のススメ
Search
Sugar Sato
October 22, 2024
Programming
0
180
qmuntal/stateless のススメ
Sugar Sato
October 22, 2024
Tweet
Share
More Decks by Sugar Sato
See All by Sugar Sato
もう僕は OpenAPI を書きたくない
sgash708
5
1.8k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
130
testcontainers のススメ
sgash708
1
230
「僕ら」のテストに対する向き合い方
sgash708
3
410
spansql で ENUM を使いたかった話
sgash708
2
160
sqlx の実装を読んでみた話
sgash708
1
190
Atlas をプロジェクト導入してみた話
sgash708
0
610
チームで運用する golangci-lint の向き合い方
sgash708
3
1k
サーバーレス環境をより改善してみた話
sgash708
4
1.9k
Other Decks in Programming
See All in Programming
昭和の職場からアジャイルの世界へ
kumagoro95
1
410
データの整合性を保つ非同期処理アーキテクチャパターン / Async Architecture Patterns
mokuo
53
18k
一休.com のログイン体験を支える技術 〜Web Components x Vue.js 活用事例と最適化について〜
atsumim
0
740
color-scheme: light dark; を完全に理解する
uhyo
7
470
Open source software: how to live long and go far
gaelvaroquaux
0
650
Introduction to kotlinx.rpc
arawn
0
740
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
590
Java Webフレームワークの現状 / java web framework at burikaigi
kishida
9
2.2k
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
220
Go 1.24でジェネリックになった型エイリアスの紹介
syumai
2
250
2025.2.14_Developers Summit 2025_登壇資料
0101unite
0
130
PHPカンファレンス名古屋2025 タスク分解の試行錯誤〜レビュー負荷を下げるために〜
soichi
1
630
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
250
Mobile First: as difficult as doing things right
swwweet
223
9.4k
Adopting Sorbet at Scale
ufuk
74
9.2k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
Statistics for Hackers
jakevdp
797
220k
Docker and Python
trallard
44
3.3k
A designer walks into a library…
pauljervisheath
205
24k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
980
Building a Scalable Design System with Sketch
lauravandoore
461
33k
Testing 201, or: Great Expectations
jmmastey
42
7.2k
Transcript
qmuntal/stateless のススメ Go Connect #3 2024.10.23
自己紹介 Sugar Sato (@satoIsSugar) • 2023年 BuySell Technologies入社 • 基盤チーム所属(Portal/Account/Approval)
PjM ◦ アソシエイトマネージャー • Go / Angular / Serverless ◦ Go歴: Go 年目くらい • 熱帯植物 ◦ ビカクシダ • 猫 ◦ Lambda (♀ 2才)
プロダクト群「バイセルリユースプラットフォーム Cosmos」の開発が進行中 リユースに必要なすべての機能を提供する 「リユースプラットフォーム Cosmos」の開発が進行中です。 Cosmosを活用して、バイセルグループ全体での業務効率改善やデータドリブン経営の深化を目指しています。 リユースプラットフォーム Cosmos 自社開発のリユース特化業務基幹システムでありサービス群の集合体 買取申込
買取・査定 在庫管理 販売 多様なチャネルで収益最大化 CRM -顧客対応- 買取種別に応じた最適なシステム構築 Visit -訪問買取 - Store -店舗買取 - Promas -商材マスタ - Appraisal -専門査定 - Stock -在庫管理 - EXS -販売管理 - Core -会員管理- Portal -データ利用- Pocket -データ基盤- 買取 専門チームによる真贋・査定と連携 査定 申込 効率的な顧客対応 在庫 在庫管理の最適・効率化 販売 データ 各事業プロセスにある データを一元管理 :基幹システム
アジェンダ ステートマシンとは 01 ステートマシン導入背景 02 まとめ 04 qmuntal/stateless とは 03
ステートマシンとは
みなさんは ステートマシンって知っていますか?
• 状態遷移を表現するための理論モデル ◦ ゲームや組み込みなどで使われてきた技術 ▪ 「キャラクターにどのようなアクションをさせるか」 ◦ サービス ▪ AWS:
Step Functions ▪ GoogleCloud: Workflows ステートマシン
ステートマシン
ステートマシン導入背景
• 決裁サービス開発でステータス管理が必要 ◦ どんなイベントがきても不具合を起こしにくくしたい ◦ 新しく「状態」を追加することを簡単にしたい ◦ 状態遷移に漏れがないか気が付きやすくしたい ◦ テストパターンもシンプルにしたい
導入背景
導入するにあたって Go だと どんなステートマシンがあるだろうか、、、
技術選定 スター数 リリース 特徴 qor/transition 433 v1.1.0 (2019/04/23) GORMと統合 状態変化ログの自動
保存 bykof/stateful 209 v0.0.8 (2020/05/24) 構造体を作って stateful インター フェースを実装する looplab/fsm 2,830 v1.0.2 (2024/05/16) 他言語ステートマシ ンライブラリに触発さ れている ※ 2024/10/16 現在
• 不採用 ◦ GORM との相性がよい ▪ b.c. コミッターに jinzhu san
◦ 最後のリリースから早5年... ◦ [IMO] 状態遷移のコードが若干見づらいかも 技術選定 (qor/transition)
技術選定 (qor/transition)
• 不採用 ◦ 構造体を作って stateful インターフェースを実装する ◦ 状態は文字列で定義する ◦ 最後のリリースから早4年...
◦ graphviz を使ってグラフ化できる 技術選定 (bykof/stateful)
技術選定 (bykof/stateful)
技術選定 (bykof/stateful)
• 不採用 ◦ 他言語のステートマシンライブラリに触発されている ▪ oxplot/fysom, jakesgordon/javascript-state-machine ◦ [IMO] 若干使い勝手が悪く感じた
▪ fsm.Events 内が全て string 型のため • 定数が扱えない ▪ 既存のパラメータに対して fsm を合成する必要がある 技術選定 (looplab/fsm)
技術選定 (looplab/fsm)
選択肢のなかだと looplab/fsm がよさそうだけど より使いやすそうなステートマシンはないかな ...
「さらに便利なステートマシンをもとめ 我々はアマゾンの奥地へ向かった ――」
qmuntal/stateless とは
• > Create state machines and lightweight state machine-based workflows
directly ◦ UML ステートチャート に基づいている ◦ C# の dotnet-state-machine/stateless を Go に移植したもの • スター数: 945 (※ 2024/10/16 時点) • リリース: v1.7.1 (2024/08/23) qmuntal/stateless
• いろんなタイプの状態とトリガーをサポート ◦ int, string, boolean, struct, etc… • 階層化構造
• Entry/exit イベント • 条件付き遷移をサポートするガード機構 • スレッドセーフ • etc… qmuntal/stateless
• ステートマシン設定方法は、たったこれだけ! ◦ ステートマシン初期化 ◦ Configure 関数と Permit 関数をつかって定義 ◦
Fire 関数にトリガーを渡す qmuntal/stateless
None
なんか「良い感じ」に使いやすいかも
• ドキュメントが簡潔でよい ◦ This page is an almost-complete description of
Stateless, and its explicit aim is to remain minimal. • 直感的に使える ◦ looplab/fsm だと既存パラメータに対して合成して使っていた ◦ 基本的には Configure() と Permit() を使って定義するだけ ▪ どのトリガーを使い、どこに遷移するのかわかりやすい 推しポイント
推しポイント • トリガーに定数が使えるので誤字によるミスが防げる ◦ 内部実装的には Trigger は any ◦ looplab/fsm
は string 指定だったので独自型が使えなかった
とはいえ API リクエストごとに ステートマシンを初期化するのなんか冗長だな
None
ステートマシンの初期化を一度だけにするには • NewStateMachineWithExternalStorage を使う ◦ 初期化に適当な状態をいれておく ◦ 変更前の状態を適用させステータス変更処理を実行する ◦ https://github.com/qmuntal/stateless/issues/72
NewStateMachineWithExternalStorage を使う理由 • NewStateMachine ◦ 内部状態 (State) を自分自身で保持 ◦ 内部で
stateAccessor と stateMutator を持つ ◦ 状態を参照・変更するためにローカルメモリでのアクセスを行う ▪ あとから初期状態を変更することができない
NewStateMachineWithExternalStorage を使う理由
NewStateMachineWithExternalStorage を使う理由
実際に NewStateMachineWithExternalStorage を使った例
None
None
外部ストレージを使うことで リクエストごとに初期化しなくて済んだ 🙌
まとめ
まとめ • qmuntal/stateless を使ってみて ◦ 良かったこと ▪ 定数が使えるので誤字によるミスが防げた ▪ 簡単に新しい「状態」を増やすこともできる
▪ テストも楽になった ▪ それから猿人バーゴンも発見することができた ◦ 課題感 ▪ mermaid からコード自動生成できるといいな
ステートマシンを導入するなら qmuntal/stateless はどうでしょうか
Thank you
• https://thinkit.co.jp/article/10012 • https://www.slideshare.net/slideshow/statemachinefull/40100048 • https://github.com/qor/transition • https://github.com/bykof/stateful • https://github.com/bykof/stateful?tab=readme-ov-file#draw-graph
• https://github.com/looplab/fsm • https://github.com/oxplot/fysom • https://github.com/jakesgordon/javascript-state-machine • https://github.com/qmuntal/stateless • https://en.wikipedia.org/wiki/UML_state_machine • https://github.com/dotnet-state-machine/stateless • https://github.com/qmuntal/stateless?tab=readme-ov-file#project-goals 引用