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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
200
Bref でサービスを運用している話
sgash708
0
300
tool ディレクティブを導入してみた感想
sgash708
1
290
DeepWiki で Go をもっと好きになろう
sgash708
0
1k
環境変数ライブラリ選手権
sgash708
0
300
はじめての Go * WASM * OCR
sgash708
1
430
もう僕は OpenAPI を書きたくない
sgash708
6
2.7k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
250
testcontainers のススメ
sgash708
1
530
Other Decks in Programming
See All in Programming
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
220
Flow は今どうなっているか
mizdra
PRO
0
250
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
690
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
190
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
470
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
510
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
560
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
120
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
210
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.6k
FDEが実現するAI駆動経営の現在地
gonta
2
280
テーブルをDELETEした
yuzneri
0
140
Featured
See All Featured
Ethics towards AI in product and experience design
skipperchong
2
340
The agentic SEO stack - context over prompts
schlessera
0
860
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
490
Paper Plane
katiecoart
PRO
2
53k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
640
Designing for humans not robots
tammielis
254
26k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
200
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Thoughts on Productivity
jonyablonski
76
5.3k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
620
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 引用