OTOBANK Engineering Blog

オトバンクはコンテンツが大好きなエンジニアを募集しています!

勉強会紹介: Mastodonについて

こんにちは。スマホ向けアプリを担当している けいま と申します。以後お見知りおきを。

オトバンクでは毎週、弊社エンジニア全員が集まる場で社内勉強会をしております。 engineering.otobank.co.jp

今回は同じくアプリエンジニアの s4kr4 さんが発表した "Mastodonについて" を紹介します。


Mastodonについて

f:id:p-side:20190708180859p:plain

2016年公開のミニブログシステム。TweetDeckに似たUIを持っています。 短文投稿をすることが目的のシステムです。 ユーザーをフォローすることによりタイムラインが形成でき、リプライやDMでコミュニケーションを取ることが出来ます。

ちなみに「マストドン」は絶滅した動物(象の祖先)の名前とのこと。

特徴

Mastodonは特定(単一)の企業が運営しているサービスではありません。 ソースコードやデプロイ方法が公開されており、誰でもサーバーを建てることが出来ます。

国内では mstdn.jp や Pixiv運営の pawoo.net、Qiitaが運営しているqiitadon.com などがあります。 かつてドワンゴが運営していた friends.nico もありましたが閉鎖されました...

アカウントを作成する際はどのインスタンスに所属するかを決める必要があります。 それはSlackのworkspeceに似ているかも知れません。

どこでアカウントを作っても、異なるインスタンス間でのコミュニケーションもできるようになっています。

技術要素

nginxがWebサーバーとして採用されている。 HTTPS転送やメディアファイルへのリクエストにキャッシュ要求ヘッダを追加するなど。

サーバー処理としてRailsが採用されており、Mastodonの主要部です。 ストリーミング以外のAPI提供をしています。

StreamingAPIの提供にNode.jsを採用しています。

データベースにはPostgreSQLを採用しています。

フロントエンドはReactで記述されています。

画像やユーザーアイコン、カスタム絵文字の保持にAWS S3かOpenstack Swiftが使えるようになっています。 (なおOpenstack SwiftはS3よりもちょっと安いらしい)

ジョブハンドラにsidekiqが採用されており、非同期処理のキューイングやリトライ処理で使われます。 小規模サーバーでユーザーが増えたときに重くなる原因になることが多いようで、 登壇者のアカウントを作成したサーバーにおいても、ユーザーが増えて重くなったので鯖主がsidekiqの対応をしていたようです。

ActivityPub

ActivityPubは、W3Cで標準化された非中央集権型のソーシャルネットワークプロトコルです。

異なるインスタンス間でどうやってコミュニケーションを取るのか?を定義するもので、Mastodonはその実装の1つです。

概念としては以下の2つがあります。

outbox: 自分が起こしたアクティビティ(トゥート, ブースト, フォロー)が集積されているコレクション inbox: 自分が受け取ったアクティビティが集積されているコレクション

outboxのアクティビティが一定のルールに応じて他のインスタンスユーザーのinboxに送信されます。 リプライを例に説明すると、 リプライを送ったユーザーのリプライがoutboxに蓄積され、リプライのActivityが相手のinboxに届き、 リプライされた側のユーザーがリプライを受けたことを気づくことができる

質疑応答のコーナー

  • sidekiqってRuby製?
    • Yes
  • 運用難しいって聞いたけど?
    • スケールさせるのが難しいらしい

まとめと雑感

Mastodonは私(keima)もTwitterからの避難地としてアカウントをひとつ持っています。 (現在はからあげクン新商品のレビューアカウントですが・・・)

私はMastodonそのものよりもActivityPub実装に関心があり(そのくせ自分で実装する根性はないのですが・・・)、 より広く使われるようになる未来が来ることを願っています。

個人的には既存サービスのインターフェースとしてActivityPub実装がなされるようになるかと期待したのですが、 そのようなムーブメントは起きず、ActivityPubを実装したシステムが産まれるに留まったのは物足りなく思いました(それだけでも凄いことですが)。

現在においてメールアドレスを人格ごとに1つ以上持つ(例えば個人のGmailアドレスとは別に会社のメールアドレスをもつ)ように、 ActivityPubプロトコルで人格ごとに発信をする未来が理想ですが、流石に夢見すぎかなと我ながら思ったりもしました。

というわけで今回はこの辺で。また来週 ノシ