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
150
qmuntal/stateless のススメ
Sugar Sato
October 22, 2024
Tweet
Share
More Decks by Sugar Sato
See All by Sugar Sato
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
62
testcontainers のススメ
sgash708
1
120
「僕ら」のテストに対する向き合い方
sgash708
3
370
spansql で ENUM を使いたかった話
sgash708
2
140
sqlx の実装を読んでみた話
sgash708
1
160
Atlas をプロジェクト導入してみた話
sgash708
0
450
チームで運用する golangci-lint の向き合い方
sgash708
3
820
サーバーレス環境をより改善してみた話
sgash708
4
1.8k
Other Decks in Programming
See All in Programming
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
760
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
Effective Signals in Angular 19+: Rules and Helpers @ngbe2024
manfredsteyer
PRO
0
140
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
テストコード文化を0から作り、変化し続けた組織
kazatohiei
2
1.5k
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
6
1.2k
From Translations to Multi Dimension Entities
alexanderschranz
2
130
PSR-15 はあなたのための ものではない? - phpcon2024
myamagishi
0
130
Recoilを剥がしている話
kirik
5
6.7k
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
270
Security_for_introducing_eBPF
kentatada
0
110
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
240
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
Done Done
chrislema
181
16k
Reflections from 52 weeks, 52 projects
jeffersonlam
347
20k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Code Review Best Practice
trishagee
65
17k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Into the Great Unknown - MozCon
thekraken
33
1.5k
It's Worth the Effort
3n
183
28k
Scaling GitHub
holman
458
140k
4 Signs Your Business is Dying
shpigford
181
21k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
What's in a price? How to price your products and services
michaelherold
243
12k
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 引用