こんにちは、サイオステクノロジー技術部 武井です。ここ数日に渡って、de:code 2019の「ほぼ」リアルタイムレポートをお届けしております。
今回はこちらです。
スピーカーは、「しばやん雑記」で有名な芝村達郎氏、基調講演でも登壇されたチャックこと井上章氏でした。
本セッションは以下のような方に向いていると思われます。
Azureで仮想マシンを立てずにリアルタイム通信を実現したいけど、どのサービスを使えばいいのか教えて欲しい!!
セッションの資料は後ほど公開されますので、私の方では、私の独断と偏見で「これはいい!!」と思った技術を、私の体験談も交えてご紹介させていただきたいと思っております。
はじめに
今までのリアルタイムWeb通信は、主にポーリングで実現をしていました。クライアントから一定間隔でサーバーの状態を見に行き、直前のアクセスに比べて変化が発生したら、イベントを発火するというものです。
しかしながら、これはユーザー数が少ないときは問題ないのですが、多くなるとポーリングがシステムに大きな負荷を与えます。
そこで、現在のリアルタイムWeb通信は、イベントドリブンに行われるのが主流であり、リアルタイムWeb通信を実現するためには以下の3つが必要になります。(と理解しました)
- イベントソース
- イベントハンドラ
- クライアントへプッシュする手段
イベントソースが発生し、それをイベントハンドラが受け取り、クライアントへPushするというのが基本的なリアルタイムWeb通信です。
「イベントソース」は、例えばユーザーのボタン操作で何かをPostした、ファイルが追加された、データベスにレコードが追加されたなどになります。
「イベントハンドラ」は、イベントソースからのイベント発火を受け取り何かのアクションを実施するものです。
「クライアントへPushする手段」は、文字通り、イベントを受け取り、クライアントへ通知する方法になります。
今回のセッションで、上記の3つについて、たくさんの内容が語られていましたが、私が特に気になる部分をピックアップしたいと思います。
イベントソース
Azureで言えば、Azure Queue Storage、Blobなどが有名です。今回のセッションでは、Cosmos DBのChange Feedによるイベントソースが挙げられていました。
これ、実はBuildのセッションでも挙げられていましたね。
Cosmos DBのChange Feedとは、端的に言ってしまうと、Cosmos DBに対して行われた追加、削除、更新のイベントをトリガーにして、Azure Functionsを起動するといった技術です。
これが実現できますと、かなりいろいろなことができるかと思います。例えば、キャッシュのパージなど追加のときだけでなく削除のときもイベントが発生するものの場合、Cosmos DBへの追加、削除だけで、イベントを発生させることが可能です。
便利ですね。かなり応用範囲が広がりそうです。
イベントハンドラー
やはり現在では、Azure Functionsがメインのようです。様々なトリガー(BlobやQueue、Cosmos DBのChange Feed)などが用意されていますし、大量の負荷が発生した場合のスケールアウトも考える必要はありません。
クライアントへPushする手段
本セッションの内容はこれがメインでした。Azure SignalR Serviceです。
一昔前であれば、仮想マシンを立ち上げて、node.jsでWebSocketサーバーを立てて、、、というのが主流だったかと思います。
しかしこれでは、やはりサーバーのメンテナンスを考えなければいけませんし、WebSocketサーバー自体に対する負荷が増えた場合のスケールアウトもしくはスケッルアップを考えなければいけません。これは非常に手間です。
Azure SignalR ServiceはWebSocketによるリアルタイムWeb通信を実現する完全なマネージド・サービスです。
便利な時代になりましたね。アプリケーション開発者は、インフラのことを考えずにコードだけに集中できるようになりました(^o^)
以下は、Azure SignalR Serviceを使った構成例です。
Azure Blob StorageのStatic web hostingと組み合わせると、ホント、サーバーが全く不要なシステムになりますね。すごい(^o^)
まとめ
Azure FunctionsやAzure SignalR Service、Static web hostingなどを組み合わせれば、全くサーバーが不要なリアルタイムWeb通信が可能になります。これによってアプリケーション開発者はインフラのことを全く考えず、コーディングだけに専念することができます。とてもいい時代になりました。サーバーレスはこれからのアプリケーション開発の主流になると思います。