イベントのフィルタ

すべての視聴者がイベントを送信できるため、ゲームプロセスが効率よく処理できないほどの膨大なイベントが発生する可能性があります。

この問題を解決するため、送信されるすべてのイベントは一連の MapReduce フィルタを通過し、膨大な数になる可能性のあるイベントを、適切な数に変換します。

JSON ファイルを使用してこれらのフィルターを作成し、イベントサービスに読み込んで適切に機能させる必要があります。サンプルには、マップを含む events.json ファイルと config フォルダに読み込んだ reduce があります。

In This Section

Map の例

map 関数は、 key:value のペアを入力値として、特定の条件を満たした時にそれぞれを別の key:value ペアに変換します。これをマッピングステップと呼びます。

Genvid は、JSON ファイルを使用して、map と変換の両方を定義します。

{
  "version": "1.7.0",
  "event": {
    "game": {
      "maps": [
        {
          "id": "changeColor",
          "source": "userinput",
          "where": {"key": ["changeColor", "<name>"], "name": "<color>", "type": "string"},
          "key": ["changeColor", "<name>", "<color>"], "value": 1
        },
        {
          "id": "cheer",
          "source": "userinput",
          "where": {"key": ["cheer"], "name": "<name>", "type": "string"},
          "key": ["cheer", "<name>"], "value": 1
        }
      ]
    }
  }
}

この例は、チュートリアル用サンプルの最初の例である イベント生成ページの例 で指示された changeColor イベントです。 ["changeColor", "<name>"] に一致するキーがシステムに入力されると、新しい key:value ペアを生成します。

新しいキーは ["changeColor", "<name>", "<color>"] になり:

  • "<name>" は 2 つ目のキーとしてイベントに送信された名前に対応します。
  • "<color>" は、キーの値として割り当てられた文字列に対応します。

マッピング手順は、マップに示されている値をこのペアの新しい値として割り当てることにより終了します。この場合、値は 「1」 です。

たとえば、以下のイベントが複数の視聴者から送信された場合:

[
  {"key": ["changeColor", "Aramis"], "value": "red"},
  {"key": ["changeColor", "Porthos"], "value": "green"},
  {"key": ["changeColor", "Porthos"], "value": "green"},
  {"key": ["changeColor", "Athos"], "value": "blue"}
]

map changeColor は、次のように変化します。

[
  {"key": ["changeColor", "Aramis", "red"], "value": 1},
  {"key": ["changeColor", "Porthos", "green"], "value": 1},
  {"key": ["changeColor", "Porthos", "green"], "value": 1},
  {"key": ["changeColor", "Athos", "blue"], "value": 1}
]

複数の視聴者から cheer イベントが送信される 2 つ目の例の場合:

[
  {"key": "cheer", "value": "Aramis"},
  {"key": "cheer", "value": "Porthos"},
  {"key": "cheer", "value": "Porthos"},
  {"key": "cheer", "value": "Athos"}
]

map cheer は、次のように変化します。

[
  {"key": ["cheer", "Aramis"], "value": 1},
  {"key": ["cheer", "Porthos"], "value": 1},
  {"key": ["cheer", "Porthos"], "value": 1},
  {"key": ["cheer", "Athos"], "value": 1}
]

データの変換後、 reduce 処理を適用します。

Reduce の例

Reduce 処理は、 key:value ペアを入力値として、他の key:value ペアに変換しますが、マージして数を減らします。

マッピングステップと同様、Genvid は Reduce のステップに JSON を使用します。

{
  "version": "1.7.0",
  "event": {
    "game": {
      "reductions": [
        {
          "id": "changeColor",
          "where": {"key": ["changeColor", "<name>", "<color>"]},
          "key": ["<name>", "<color>"],
          "value": ["$count"],
          "period": 250
        },
        {
          "id": "cheer",
          "where": {"key": ["cheer", "<name>"]},
          "key": ["<name>"],
          "value": ["$sum"],
          "period": 250
        }
      ]
    }
  }
}

この例では、チュートリアル用サンプルで使用する最初のサンプルとして以前指示した changeColor イベントです。Reduce の処理中に、 "changeColor" で始まるキーを探し、2 番目、3 番目のパラメータは無視します (任意の値であるため)。

一致する key:value をマージし、組み合わされたすべての値の min、max、count、sum を含む新しい値を作成します。

たとえば、 map 機能の結果は次のようになります。

[
  {"key": ["changeColor", "Aramis", "red"], "value": 1},
  {"key": ["changeColor", "Porthos", "green"], "value": 1},
  {"key": ["changeColor", "Porthos", "green"], "value": 1},
  {"key": ["changeColor", "Athos", "blue"], "value": 1}
]

Reduce 機能は、次のようにマージします。

[
  {"key": ["Aramis", "red"], "value": [{"min": 1}, {"max": 1}, {"count": 1}, {"sum": 1}]},
  {"key": ["Porthos", "green"], "value": [{"min": 1}, {"max": 1}, {"count": 2}, {"sum": 2}]},
  {"key": ["Athos", "blue"], "value": [{"min": 1}, {"max": 1}, {"count": 1}, {"sum": 1}]}
]

2 つ目の例では、map はこのようになります。

[
  {"key": ["cheer", "Aramis"], "value": 1},
  {"key": ["cheer", "Porthos"], "value": 1},
  {"key": ["cheer", "Porthos"], "value": 1},
  {"key": ["cheer", "Athos"], "value": 1}
]

さらに reduce により次のように変化します。

[
  {"key": "Aramis", "value": [{"min": 1}, {"max": 1}, {"count": 1}, {"sum": 1}]},
  {"key": "Porthos", "value": [{"min": 1}, {"max": 1}, {"count": 2}, {"sum": 2}]},
  {"key": "Athos", "value": [{"min": 1}, {"max": 1}, {"count": 1}, {"sum": 1}]}
]