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
320
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
qmuntal/stateless のススメ
Sugar Sato
October 22, 2024
More Decks by Sugar Sato
See All by Sugar Sato
AIと共に生きる技術選定 2026
sgash708
0
180
Bref でサービスを運用している話
sgash708
0
290
tool ディレクティブを導入してみた感想
sgash708
1
280
DeepWiki で Go をもっと好きになろう
sgash708
0
1k
環境変数ライブラリ選手権
sgash708
0
290
はじめての Go * WASM * OCR
sgash708
1
420
もう僕は OpenAPI を書きたくない
sgash708
6
2.6k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
240
testcontainers のススメ
sgash708
1
530
Other Decks in Programming
See All in Programming
どこまでゆるくて許されるのか
tk3fftk
0
490
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.5k
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
520
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
860
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.6k
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
230
霧の中の代数的エフェクト
funnyycat
1
390
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
320
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
110
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
390
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
100
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
エンジニアに許された特別な時間の終わり
watany
108
250k
Ruling the World: When Life Gets Gamed
codingconduct
0
280
Crafting Experiences
bethany
1
220
Tell your own story through comics
letsgokoyo
1
1k
Faster Mobile Websites
deanohume
310
32k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Building AI with AI
inesmontani
PRO
1
1.1k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
970
Bash Introduction
62gerente
615
220k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Designing for Timeless Needs
cassininazir
1
370
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 引用