しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Visual Studio 2015 リリース記念イベントで使ったプレゼント応募アプリを支える技術

先日、Visual Studio 2015 リリース記念イベントがニコ生で放送されました。

既に Azure 界の抱かれたい男 No.1 かつ、ブログにまとめる速度 No.1 がブログにまとめてくれてます。

Visual Studio 2015 RTM & リリース記念イベント | ブチザッキ

イベントでは Surface 3 LTE や MADOSMA が当たるという、かなり太っ腹なプレゼント企画がありました。

ニコ生中にチャックさんが何回か以下のような画面を出していたと思います。

今回、このプレゼント応募アプリを作ったので、それを支える技術ということで中身の解説を簡単に行っておこうと思います。大雑把な仕組みは以下のような流れです。

  1. ASP.NET 5 アプリから Web Apps 上の Web API を叩く
  2. Web API から Event Hubs へデータを JSON で送信
  3. Stream Analytics が Event Hubs からデータを受信し、1 秒のタンブリングウィンドウで集計
  4. 集計結果を Power BI へリアルタイム出力

重要な部分は Event Hubs / Stream Analytics / Power BI になるので、個別に見ておきます。

Event Hubs

Stream Analytics でリアルタイムな処理を行う場合には Event Hubs 一択になります。使い方は NuGet から WindowsAzure.ServiceBus をインストールして、EventHubClient を作成し Send メソッドを呼ぶだけです。

var client = EventHubClient.CreateFromConnectionString(ConnectionString, EventHubPath);

var data = JsonConvert.SerializeObject(entry);

await client.SendAsync(new EventData(Encoding.UTF8.GetBytes(data)));

送信するデータの形式は Stream Analytics で設定可能ですが、大体は UTF-8 な JSON でいいと思います。

Stream Analytics

Stream Analytics は SQL ライクな言語でストリームデータに対して処理が書けるんですが、ちょっと慣れるまでは不思議な感覚だと思います。

考え方としては Rx 的なので、SQL ライクな言語より Rx で書きたい感じがします。

SELECT
    Location,
    DATEADD(hour, 9, System.TimeStamp) AS Time,
    COUNT(*) AS Count
INTO
    PowerBI
FROM
    Input
GROUP BY
    Location,
    TUMBLINGWINDOW(second, 1)

今回のアプリで実際に使ったクエリは以上になります。基本的には日付は全て UTC で扱って、出力段階で UTC+9 にするのが良いと思いました。

タンブリングウィンドウを使うと指定した時間単位で集計を行えるようになるので、この場合は 1 秒間隔での応募数を集計するようにしてあります。RPS や DAU などを簡単に集計出来そうです。

Power BI

最後に Stream Analytics の出力として Power BI を使って、グラフィカルな表示を行います。Power BI は組織アカウントが必要になるので、Azure Active Directory でユーザーを作るなど手間が少しかかりました。

極々稀に更新される「Azureの小ネタ(改)」というブログで組織アカウントの作り方が紹介されているので、悔し涙を流しながら参考にして作りました。

Power BI のデータセットは Stream Analytics が最低でも 1 件のデータを処理しないと作られないので、その点だけ注意しておきたいですね。

そして最終的に出来上がった画面が上のようなものになります。

元々は Excel の Power Map で作っていたのを Stream Analytics と Power BI に作り替えましたが、作業時間は 1 時間ほどでした。このお手軽感がたまりません。