メインコンテンツまでスキップ

ブローカー

MaaS Blender は、複数のコンポーネントをイベントを介して連携させながら実行します。 任意のシミュレーション時刻において、同時に実行されるのはいつも「1つのコンポーネントのみ」です。つまり、コンポーネントは並列実行されません。 どの順序でコンポーネントが実行されるかは完全に決定的であり、各コンポーネント自体が決定的に振る舞う限り、シミュレーション全体も決定的です。

この実行順序の制御を担うのが「ブローカー(Broker)」です。 ブローカーは次に実行すべきコンポーネントを選択し、そのコンポーネントを呼び出してイベントを生成させ、生成されたイベントを他のすべてのコンポーネントに伝播します。

コンポーネントのインターフェース

各コンポーネントは、以下の3つの API を公開しなければいけません。

  • peek() 次にそのコンポーネントで予定されているイベントのシミュレーション時刻を返します。

  • step() コンポーネントを実行し、1つ以上のイベントを発生させます。

  • triggered(event) 他のコンポーネントによって生成されたイベントを受け取ります。

ブローカーの処理フロー

シミュレーションは、以下の手順を繰り返すことで進行します。

  1. ブローカーが全コンポーネントに対して peek() を呼び、最も小さい時刻を返したコンポーネントを選択します。
  2. ブローカーは選択したコンポーネントに対して step() を呼びます。コンポーネントは実行され、生成したイベント群を返します。
  3. ブローカーはそれぞれの生成イベントについて、全コンポーネントに対して triggered(event) を呼び出しイベントを伝播します。
  4. 手順1に戻り、これをシミュレーション終了まで継続します。

API 詳細

  • peek()

    • Returns:

      { "next": number }

      ここで next は、そのコンポーネントで次のイベントが発生するシミュレーション時刻です。

  • step()

    • Returns:

      { "now": number, "events": Event[] }

      ここで now は、イベントが発生したシミュレーション時刻です。 同一時刻に複数のイベントが発生する場合は配列で返します。

  • triggered(event)

    • 引数:

      • event: 他のコンポーネントによって発生したイベント