ヽ(´・肉・`)ノログ

How do we fighting without fighting?

すごいE本をElixirでやる(47)

第15章 レイジ・アゲインスト・ザ・有限ステート・マシーン - 15.3 取引システムの仕様 から

第15章 レイジ・アゲインスト・ザ・有限ステート・マシーン

15.3 取引システムの仕様

架空のテレビゲーム向けのアイテム取引システムを設計し、実装してみましょう

プレーヤー間でのアイテム交換や確認を仲介するブローカーは使わずに(実を言えば使うほうが楽なのですが)、プレーヤー同士が直接やり取りするサーバを実装します

あなたの動作を見せて

取引の際にプレーヤーが取れるアクションを定義しましょう。 1 つめは取引の申し入れです。他方のユーザもその取引を受け入れられるべきです。 単純化のため、取引を拒否する機能は与えません。

取引に関連したアクションは以下となる

いずれのプレーヤーも自分の FSM とやり取りできて、その自分の FSM が相手の FSM とやり取りすることになります。

2 つの独立したプロセスがお互いにやり取りする状況では、何はともあれ、できるだけ同期呼び出しを避けてください。

独立したプロセスがお互いにやり取りする状況で,同期呼び出しをすると, 「FSM甲がFSM乙へメッセージを送信して,返信を待つ.同時にFSM乙がFSM甲へメッセージを送信して,返信を待つ」 だけで容易にデッドロックしてしまう. タイムアウトを設定して解決をはかることもできるが,双方のプロセスのメールボックスにメッセージが残ってしまうと,プロトコルがぐちゃぐちゃになる.

「相互にやりとりするプロセス」の通信は ** 非同期 ** で行うとよい. 「片方だけが依頼するプロセス」は,同期で行ってもかまわない.

図がないとわかりにくいので Web版 から拝借する.

./fsm_overview.png

2 つの FSM は両方ともアイドル状態です。 あなたが Jim に取引を持ちかけたとき (ask Jim)、Jim は取引を進める前に取引を受け入れなければいけません。 それから両者はアイテムの提示や撤回ができます。両者が取引の準備ができたと宣言するときに取引が行われます。

単純に思えるような取引でもやりとりは結構複雑だ.