Liberent-Dev’s blog

株式会社リベル・エンタテインメントのテックブログです。

Matrixプロトコルを試してみよう

こんにちは。
システム開発部のこたつみかんと申します。
夏はガツンとみかんが美味しいので楽しみです。

はじめに

さて、オンラインゲームにおいて、プレイヤー同士、またはファンとのコミュニケーションが取れることは非常に重要な要素となりました。
この手のサービスはゲーム外で賄うことが多く、最近はDiscordのシェアが非常に高いですが、代替手段を検討することは技術的な観点からも有効です。

現在Discordの代替サービスとして、Matrixに注目しています。

本記事では、分散型リアルタイム通信プロトコルであるMatrixと、そのクライアント実装であるElement、サーバー実装であるSynapse(次回以降予定)について簡単に紹介します。

今回はクライアント実装までをご紹介しますので、どなたも簡単に試してみることができると思います。

ゲームにおけるコミュニケーションの例

Matrixについてお話しする前に、ゲームにおいて通信を使ったコミュニケーションといえば皆さんはどのようなものを思い浮かべるでしょうか。
以下に少し例を挙げてみます。

プレイヤー情報の表示

通信をあまり使わないコミュニケーションの例です。
遅延を気にしなくてよく、通信量も少ないため以前よりよく使われています。
プレイヤー情報をあらかじめ記録しておき、必要に応じて取り出して表示することでそれぞれの個性が出せます。

ゲーム内チャット・掲示板・通話

ジャンルを問わず普及しました。
もはや必須機能と言っても過言ではありません。
また通信の発達とともに即時性が求められるようになりました。
特に戦闘中の仲間とのやり取りなどは遅延がひどいと致命的です。

観戦、実況

動画サイトの普及とともに急激に伸びてきた分野です。
人気が出れば出るほど広帯域、高負荷への対策が必要になります。
また、視聴者とのコミュニケーションの手段があるとさらに楽しくなります。

Discordのようなサービスは主に後者の目的で利用されています。

Matrixとは

Matrixは分散型のリアルタイム通信プロトコルです。
公式サイトであるmatrix.orgではさまざまな情報を公開していますので、興味の出てきた方はご覧になることをおすすめします。

基本的な通信の仕組み

Matrixはアプリケーション層のプロトコルで、その通信はRESTful APIで行われます。
クライアントは接続するサーバーを指定して通信を行います。
このサーバーのことをホームサーバーと呼びます。
ホームサーバーに自分を登録することになるため、クライアントのアカウントは@account:homeserverとなります。

クライアントからは「events」と呼ばれるJSONオブジェクトが送出されます。
全ての通信はこのeventsのやり取りです。

クライアント-サーバー間の通信はClient-Server APIにより行われます。

分散型

分散型の通信というとMastodonを思い出す方もいるかと思いますが、Matrixも同様にどこかのサーバーに接続すれば他のサーバーと連携しており、どのサーバーの誰とでも会話が可能です。

仕組みとしてはクライアントとホームサーバー間の通信ログを他のホームサーバーと同期することで実現しており、結果としてルームの全ログを参加している全てのサーバーが保持することとなります。
この同期は「Federation」と呼ばれ、Server-Server API により行われます。

相互接続性

Matrix独自の大きな特徴がその相互接続性です。

「Bridge」という仕組みを使った複数の通信システムとの相互接続が可能であり、様々なサービスをまたいだコミュニケーションが取れます。
現在公式ではSlack、IRCXMPP、Gitterへのブリッジがメンテナンスされており、さらにコミュニティによってDiscord、Facebook、Hangoutsなどへのブリッジが提供されています。

通信の秘匿性

すべての通信はHTTPSで行われます。
End to Endでの暗号化により、ユーザー間の通信内容をサーバーが知ることはできません。

採用実績

プロトコルがオープン標準でオープンソースのリファレンス実装が提供されていることからオープンソースと親和性のある欧州での採用例が多く、フランス政府やドイツ政府の独自のインスタントメッセージングツールとして利用されています。
また、Mozillaのように開発コミュニティでのコミュニケーション手段をIRC(Internet Relay Chat)から切り替えた例もあります。

他サービスとの違い

Mastodon

Matrixの分散型のシステムはMastodonと近い部分です。
サービスとしては以下のように役割が違いますので、使い分けが可能です。

Discord

こちらはMastodonと違い、サービスの形としては両方ともプライベートなインスタントメッセージングサービスです。

Discordは内部の仕組みが一部紹介されてはいますが、1社提供のプロプライエタリなサービスです。
インフラを意識する必要なく使え、DiscordAPIを使った開発も可能で自由度は比較的高いですが、自分でサーバーを立てることはできません。
Matrixはオープンソースであるため技術情報は全て公開されており、開発の自由度は非常に高いです。
加えてリファレンス実装で自分のサーバーも立てられるので、誰でもサービス提供者になることが可能ですが、サービスの運用も自ら行う必要があります。

環境やケースに応じて適したものを利用するのが良いかと思います。

クライアントのリファレンス実装 Element

Matrixのクライアント側リファレンス実装として、Elementがあります。
WindowsMacOSXLinuxiOSAndroidのアプリとWebブラウザに対応しており、幅広いプラットフォームからの利用が可能です。

今回はWindowsで試用してみます。

インストール

Element公式Webサイトの「Get Started」から入手できます。
「Desktop」の「Windows (64bit)」をダウンロードしたら、インストーラーに従って、インストールします。

インストール後の起動画面がこちらです。
ElementはDiscordと同様にElectronを使用しているアプリで、この画面自体はWebブラウザ版と全く同じです。

アカウント作成

起動できましたら次はアカウントの作成です。
「アカウントを作成」を選ぶと以下の画面になります。
デフォルトのホームサーバーは「matrix.org」です。
特に接続するホームサーバーがなければこのまま進めます。

また、OpenIDでの接続に対応していますので、認証情報を入力して新規登録を行わなくてもアカウントの作成は可能です。
今回は説明の都合上、認証情報を入力します。

ホームサーバーの運営方針を確認し、問題なければ「同意」を選びます。

確認のためのメールが送られます。

メール内のVerifyを選ぶとアカウントの作成が完了します。

使ってみる

では早速使ってみましょう。
サインインします。

サインインすると暗号鍵のバックアップ方法について確認が入ります。
今回はセキュリティーキーを生成します。
生成されたものは適宜保存してください。

お待たせしました。
こちらがホーム画面です。
まず基本となる公開ルームを使ってみましょう。

「公開ルームを探索」を選びます。

こちらはmatrix.org内のルームです。
「プレビュー」が表示されているところは参加前に内部を閲覧可能なルームです。
matrixについての公式ルームである「Matrix HQ」をプレビューしてみましょう。

こちらがプレビュー画面です。
DiscordやSlackを使っていた方々には見慣れた画面かと思います。
問題なさそうであれば参加ボタンを押します。

参加しました。
これで発言できます。

自分でルームを作成することも可能です。
では非公開のルームを作成してみましょう。
ホームの右側にあるプラスを選び、「新しいルーム」を選びます。

名称を決めて暗号化を有効にするかを選び、ルームを作成します。
高度な設定を表示すると他のホームサーバーと連携しないルームの設定もできます。

空のルームができたので他のユーザーと共有します。
ユーザー名を指定して招待します。

招待された方はこのように表示されます。
同意するとルームに入れます。

投稿が出来ました。
それぞれの投稿に対してはリアクションの絵文字を返すことができます。
また、ルーム内ではビデオ会議を開催できます。
こちらはDiscordと同様にWebRTCを利用しています。

次はダイレクトメッセージを使ってみます。
「ホーム」の右側にあるプラスを押し、「チャットを開始」を選びます。

送りたいユーザー名を記入して「続行」を選びます。

ダイレクトメッセージのやり取りができました。

まとめ

Elementの使い勝手はいかがだったでしょうか。
Matrixは、リアルタイム通信が身近になった今こそ知っておくべきプロトコルです。
ぜひ一度試してみてください。
次の機会には、サーバー側のリファレンス実装Synapseについて説明する予定です。


リベル・エンタテインメントでは、このような最新技術などの取り組みに興味のある方を募集しています。 もしご興味を持たれましたら下記サイトにアクセスしてみてください。 https://liberent.co.jp/recruit/