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
210
qmuntal/stateless のススメ
Sugar Sato
October 22, 2024
Tweet
Share
More Decks by Sugar Sato
See All by Sugar Sato
DeepWiki で Go をもっと好きになろう
sgash708
0
99
環境変数ライブラリ選手権
sgash708
0
130
はじめての Go * WASM * OCR
sgash708
1
230
もう僕は OpenAPI を書きたくない
sgash708
6
2.2k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
160
testcontainers のススメ
sgash708
1
350
「僕ら」のテストに対する向き合い方
sgash708
4
440
spansql で ENUM を使いたかった話
sgash708
2
210
外部登壇のススメ
sgash708
1
16
Other Decks in Programming
See All in Programming
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
160
Effect の双対、Coeffect
yukikurage
5
1.4k
ASP.NETアプリケーションのモダナイズ インフラ編
tomokusaba
1
400
童醫院敏捷轉型的實踐經驗
cclai999
0
130
地方に住むエンジニアの残酷な現実とキャリア論
ichimichi
5
1.1k
LINEヤフー データグループ紹介
lycorp_recruit_jp
0
780
Benchmark
sysong
0
240
データの民主化を支える、透明性のあるデータ利活用への挑戦 2025-06-25 Database Engineering Meetup#7
y_ken
0
290
[初登壇@jAZUG]アプリ開発者が気になるGoogleCloud/Azure+wasm/wasi
asaringo
0
130
エンジニア向け採用ピッチ資料
inusan
0
150
PHPで始める振る舞い駆動開発(Behaviour-Driven Development)
ohmori_yusuke
2
160
KotlinConf 2025 現地で感じたServer-Side Kotlin
n_takehata
1
220
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
53
7.6k
Embracing the Ebb and Flow
colly
86
4.7k
Writing Fast Ruby
sferik
628
61k
Designing for Performance
lara
609
69k
Fireside Chat
paigeccino
37
3.5k
Navigating Team Friction
lara
187
15k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Stop Working from a Prison Cell
hatefulcrawdad
270
20k
Statistics for Hackers
jakevdp
799
220k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
The Invisible Side of Design
smashingmag
299
51k
4 Signs Your Business is Dying
shpigford
184
22k
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 引用