Liberent-Dev’s blog

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

Matrixプロトコルを試してみよう -サーバー編-

はじめに

こんにちは。
システム開発部のこたつみかんと申します。

前回からだいぶ時間が経ってしまいましたが、今回はMatrixプロトコルのサーバー側実装を動かしてみます。
さまざまな理由でMatrixを取り巻く環境は大きく変わり、国内でも徐々に注目されるようになりました。
思ったより簡単にできますので、この機会にぜひ試してみてください。

Matrixのサーバー実装

現在Matrixのサーバー実装としてよく挙げられるものは以下の3つです。

  • Synapse
    • リファレンス実装です
    • 枯れているため動作も安定しており、このような記事ではよく紹介されます
    • Python3で開発されています
  • Conduit
    • 軽量なサーバー実装です
    • 2023年4月現在ベータ版です
    • 1クライアント1サーバーのような構成を意図しているため、システム要件は低いですが負荷への耐性が高いわけではありません
    • ドイツ連邦教育省の支援を受けています
    • Rustで開発されています
  • Dendrite
    • 第二世代のリファレンス実装として開発されています
    • 2023年4月現在ベータ版です
    • Goで開発されています

正式リリースされているのはSynapseのみという状況ですが、どのプロジェクトも活発に開発されています。

環境を構築してみる

それでは実際に環境を構築してみましょう。
現在はどの実装もDockerでの導入を紹介されるケースが多いのですが、動作の仕組みを確認するという意味で通常のインストールを行ってみます。
今回は軽量でご家庭での利用にも適したConduitを選んでみました。
公式の導入手順に沿ってDebian 11への導入を行っています。
なお、matrix-docker-ansible-deployも便利そうだったので試しに使ってみましたが、導入中にエラーが出て進行不能となってしまったため、残念ながら今回はご紹介できませんでした。

サーバー名を決める

導入中にサーバー名を設定する場面がありますので、インストール前にサーバー名を決めておいてください。
決まったらDNSにレコードを追加しておくのを忘れずに。

Conduitをインストールする

ConduitはLinuxで動作します。
パッケージは公式からdebが提供されています。
x86に加えてarmv7、armv8用もありますので、Raspberry Piのようなシングルボードコンピューターへの導入も可能です。
なお現在のビルドはDebian 11向けとなっていますので、glibcのバージョンが古い場合は自前でコンパイルが必要となります。

サービスを動かす準備をする

インストールが終了したら、サービスを動かすための準備をします。
まずは外部とのやり取りを行うため、ファイアウォールなどでポート番号443と8448を開放する設定を行います。

次にconduitを動かすためのconduitユーザーを作成します。

$ sudo adduser --system conduit --no-create-home

続いてsystemdへの登録を行います。
/etc/systemd/system/conduit.service を作成し、以下の通り設定を行います。

[Unit]
Description=Conduit Matrix Server
After=network.target


[Service]
Environment="CONDUIT_CONFIG=/etc/matrix-conduit/conduit.toml"
User=conduit
Group=nogroup
Restart=always
ExecStart=/usr/sbin/matrix-conduit


[Install]
WantedBy=multi-user.target

設定したら、

$ sudo systemctl daemon-reload

で反映させます。

Conduitの設定を行う

Conduit側の設定を行います。
設定ファイルは /etc/matrix-conduit/conduit.toml に作成します。

[global]
# The server_name is the pretty name of this server. It is used as a suffix for user
# and room ids. Examples: matrix.org, conduit.rs


# The Conduit server needs all /_matrix/ requests to be reachable at
# https://your.server.name/ on port 443 (client-server) and 8448 (federation).


# If that's not possible for you, you can create /.well-known files to redirect
# requests. See
# https://matrix.org/docs/spec/client_server/latest#get-well-known-matrix-client
# and
# https://matrix.org/docs/spec/server_server/r0.1.4#get-well-known-matrix-server
# for more information


# YOU NEED TO EDIT THIS
server_name = “サーバー名"


# This is the only directory where Conduit will save its data
database_path = "/var/lib/matrix-conduit/"
database_backend = "rocksdb"


# The port Conduit will be running on. You need to set up a reverse proxy in
# your web server (e.g. apache or nginx), so all requests to /_matrix on port
# 443 and 8448 will be forwarded to the Conduit instance running on this port
# Docker users: Don't change this, you'll need to map an external port to this.
port = 6167


# Max size for uploads
max_request_size = 20_000_000 # in bytes


# Enables registration. If set to false, no users can register on this server.
allow_registration = true


allow_federation = true


trusted_servers = ["matrix.org"]


#max_concurrent_requests = 100 # How many requests Conduit sends to other servers at the same time
#log = "warn,state_res=warn,rocket=off,_=off,sled=off"


address = "127.0.0.1" # This makes sure Conduit can only be reached using the reverse proxy
#address = "0.0.0.0" # If Conduit is running in a container, make sure the reverse proxy (ie. Traefik) can reach it.

設定ファイルを編集したらパーミッションを設定します。

$ sudo chown -R root:root /etc/matrix-conduit
$ sudo chmod 755 /etc/matrix-conduit
$ sudo mkdir -p /var/lib/matrix-conduit/
$ sudo chown -R conduit:nogroup /var/lib/matrix-conduit/
$ sudo chmod 700 /var/lib/matrix-conduit/

リバースプロキシを設定する

Conduit自体はlocalhostの6167ポートで動いていますので、外部から到達できるようになんらかのWebサーバーでリバースプロキシを作ります。
今回はCaddyを使ってみます。
Caddyは設定が簡単でかつ証明書処理がデフォルトで自動化されており、HTTPS対応のサイトをすぐに準備できます。
/etc/caddy/Caddyfile に以下の設定を記載します。

サーバー名, サーバー名:8448 {
        reverse_proxy /_matrix/* 127.0.0.1:6167
}

記載したら設定を反映させます。

$ sudo systemctl enable caddy

動かしてみよう

これで設定は終わりです。
動かしてみましょう。

$ sudo systemctl start conduit

Elementで接続してみます。
指定したサーバー名を記入して、続行するを押してみましょう。
接続できました。

他のサービスとのBridgeやその他のオプションに対応するためにはさらに設定が必要なのですが、テキストメッセージのやり取りを行うだけであればこれで環境の構築は完了となります。

まとめ

いかがだったでしょうか。
思ったより簡単に動かすことができたかと思います。
大型連休中ですので、この機会にぜひmatrixを試してみてください。


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

ASP.NET Coreを初めて触りつつMemory Packを試してみた2

こんにちは!
システム開発部のK.Mです。

前置き

前々回前回のMemoryPackの記事にて、MemoryPackを色々触ってみましたが、まだ少しやり残したことがありましたので、やり残した分の内容となっております。

速度確認

公式では数倍違うという記載になっておりましたが、実際のところどれ位違うのかをMessagePackとMemoryPackで速度計測してみました。

下記の3ケースで後述しているデータ構造体40万件をサーバから送り、クライアント(Unity)にてデシリアライズ処理をする箇所にて計測しています。

  • MessagePack(未圧縮:約20MBのデータサイズ)
  • MemoryPack(未圧縮:約14MBのデータサイズ)
  • MessagePack(LZ4圧縮:約4MBのデータサイズ)
    • 念のため参考用

MemoryPackの圧縮がLZ4がデフォルトで記事作成している現在未対応になっているので、対応されるのを期待したいところです!

  • https://neue.cc/2022/11/04_memorypack.html

    MemoryPackの実装と統合された効率的な圧縮については、現在BrotliEncode/Decodeのための補助クラスを標準で用意しています。しかし、性能を考えるとLZ4やZStandardを使えたほうが良いため、将来的にはそれらの実装も提供する予定です。

続きを読む

ASP.NET Coreを初めて触りつつMemory Packを試してみた for Unity

こんにちは!
システム開発部のK.Mです。

前置き

liberent-dev.hatenablog.com

前回のMemoryPackの記事にて、APIとwebにてMemoryPackを使用したシリアライズ・デシリアライズの実装をしました。

今回はAPIをそのまま使用して、UnityにてMemoryPackデータをデシリアライズしてコンソールや画面上に表示するということをやっていきます。

前回同様、サーバ・バックエンドは触ったことはあるけど、Unity/C#は初めて使う人を想定しております。

開発環境

Unityのインストール

MemoryPackがUnityのバージョン2021.3以上のものが対象になっているため、2021.3以上のものをインストールしていきます。

Unityを直接インストールせずに、UnityHubというものをインストールしたうえで2021.3以上のものをUnityHubから指定してインストールする手順となります。

  1. Unityのダウンロードページへアクセスします。
  2. Mac用のダウンロードのリンクを選択します。(Mac以外であれば、各OS用のリンクを選択してください。)
  3. UnityHubSetup.dmgがダウンロードされるので、ダウンロード後に実行します。
  4. セットアップ画面が表示されるので[Agree]を選択します。
  5. 処理中画面が出たのち、少し待つとApplicationsへドラッグ&ドロップする画面が表示されるので、UnityHubアイコンをApplicationsへドラッグ&ドロップします。
  6. コピー中画面が表示されるので、少し待つとApplicationsにUnityHubがインストールされます。
  7. UnityHubをインストールする画面を閉じます。
  8. Launchpadを開いて、UnityHubがインストールされていることを確認、選択して起動します。
    (もし起動時に下記のような開いても良いかの確認ダイアログが出た場合は[開く]を選択してください)
  9. UnityHub起動後にUnityのアカウントにログインをする画面が表示されるため、Unityアカウントを作成します。
    UnityHub画面の[アカウントを作成]のリンクか、こちらからUnityIDを作成してください。
  10. UnityID作成後、UnityHubにてサインインします。
  11. サインイン後に初回起動時にエディターインストール画面が表示されるので2021.3以上のバージョンになっているのを確認して、[Unityエディターをインストール]ボタンを選択しインストールを行います。
  12. 初回起動のインストール画面からインストールをすると、Androidビルドに必要なものがインストールされていないので、下記の操作して別途インストールする必要があります。
    1. エディター一覧の右側にある歯車ボタンを選択し、モジュールを加えるを選択します。
    2. 追加するモジュール一覧画面が表示されるので、Android Build Supportにチェックを入れて次へを選択します。
    3. 利用規約画面が表示されるので同意部分のチェックボタンをONにして[インストール]ボタンを選択するとインストールが開始されるので、終了するまで待ちます。
    4. インストール完了後、UnityHubのエディター一覧にてAndroidの表示があればOKです。

上記でUnity関連のインストールが完了となります。

続きを読む

ASP.NET Coreを初めて触りつつMemory Packを試してみた

あけましておめでとうございます。
システム開発部のK.Mです。

今回の経緯

前回のアイ★チュウ最適化の話の中で、MemoryPackという新しいシリアライザーがリリースされていたのを知ったため、これを試してみようと思ったのがキッカケとなります。

しかしながら、MemoryPackを使うとなると、サーバをC#で実装する必要があります。

  • C#を本格的に触ったことがない
  • CやC++でVisualStudioを触っていた時期もあったが、VisualStudio2000とかもっと前の物だった
  • .NETを使ってのサーバ構築をやったことが無かった

上記の理由で少し不安に感じていたのですが、いざ触ってみたらあっさりとローカル環境が動いたので、同じようにMemoryPackが気になるけど、C#を触ったことのないサーバ・バックエンドのエンジニアに向けて入門編としてお届け出来ればと考えております。

開発環境

Visual Studioのインストール

MacであればこちらからVisual Studio for Macをダウンロード・インストールしてください。
Windowsは、上記リンクの先にあるVisual Studio Communityをダウンロード・インストールしてください。

この後記載してある、操作周りの説明はMacでの操作になりますので、Windowsでは若干異なる可能性があります。

続きを読む

アイ★チュウ最適化の話

こんにちは!
システム開発部のK.Mです。

先月の11月10日にNintendo Switch版「アイ★チュウ」が発売されました!

前回が好評だったため、今回もアイ★チュウの話をお届けします。
今回ですが、Android/iOS時代に発生した運用・開発時のアプリ制作の技術的な内容となりますので、少しとっつきにくいお話かもしれません。


こんにちは。
システム開発部のT.Iです。

祝:アイ★チュウswitch版発売!
2022年11月10日に発売されました。

本記事ではAndroid/iOS版のアイ★チュウ運営時に、マスターデータ1の一つ「リソースリスト」の内部処理で発生した問題と、その際にどのように改善したかを振り返ります。

基本的にアイ★チュウを運用していた当時(数年前)のお話となります。

リソースリスト内容

  • AssetBundle、サウンド、ADVスクリプト等ダウンロード対象のリソース情報が記述されたリスト
  • データ数は各OS(iOS,Android)21,000個程
    • 全体で約47,000件
  • データ構造

リソースリストデータ:改修前

  • csvjson形式シリアライズする2
  • アプリのjsonライブラリにはLitJsonを使用3
  • データサイズ
    • json生データ 1814 KB
    • 暗号化&圧縮 125 KB
  • アプリ内実装
    • 復号化の後、LitJsonでDictionary<string,DataClass>にデシリアライズして使用

リソースリスト運用 経過

  1. アイ★チュウ運営数年間はリソースリスト制御に問題は無く低スペック端末でも動いていた。
  2. 日々の更新で画像データなどが増えていきリソースリストは増大。
  3. 社内チェックの際に「タイトルから遷移が重くなってるかも・・・?」という声がちらほら。
  4. ある日の更新から「この前の更新からタイトルから遷移できず落ちる」との お問い合わせが発生。
  5. 調査したところリソースリストの展開とデシリアライズでメモリが足りず落ちている模様。
    (落ちなかったとしてもデシリアライズに数秒要しUXは良くない状況)

改修作業開始

改修内容


  1. マスターデータ:アプリ内から参照する共通の数値やデータ
  2. 正確にはシリアライズしたデータを暗号化&圧縮したデータを使用
    • サイズ軽減のためkeyは1文字
  3. 当時はUnityがjsonを正式対応する前
続きを読む