[Fediverse][Protocol] ActivityPubを深堀してみる

アドベントカレンダーの記事だぜぇ?

当記事は分散SNSアドベントカレンダーの記事として12/7(土)に公開される記事です。

なんかやたらとズバズバログが出てますのん

Kubernetes上でMastodonやMisskeyやPleromaを動かしてる人はPodのログを眺めるとえらく強烈な文字の羅列を見ることになると思います。ところどころ日本語とか混じっていておおよそ察しはつくと思うのですが、tootの送受信処理に関して基本的にJSONデータがガバガバそのまま乗っかって流れていたりします。

Misskey上のログを一気に出してみたときのコンソール画面

実は一昨年ぐらいからその構成がどーしてもどーしても気になって中身を確認してみたりしたことがあるのですが、うまく把握できず・・・Orz
よくActivityPubって言葉が流れるんですが、あれこそActivityPubのデータなんすよね。
というわけで、そもそもActivityPubってなんやねん?と思って調べたのが本記事になります。

なお、俺、RubyもNode.jsもさーっぱりわからん人間ですが、いわゆる「エイゴヨムダケナラデキルヨ」的な人間ですのでまぁ、何とかなるでしょう。

ActivityPubってなんぞ

と思って調べてみた内容がこちらになります。Mastodonでは、確かVersion1.6あたりから共通プロトコルがOstatusからActivityPubに変わったと記憶しています。当時、Ostatusベースだったころは、SNSサーバに障害が発生し、仮に復旧に至れたとしても、他のサーバとの間で交わした情報にずれが生じた場合、そことの交流が回復するまでの最大7日程度時間がかかるというつらい思い出がありました。
しかし、ActivityPubベースに変わってからはその復旧が即時にできるようになり、よりサーバ運営を継続しやすくなったのかなと感じます。

実はOstatusについては全くわからないんですが、ActivityPubやMastodonに関しての情報はぼちぼち探せば見つかるというのがうれしいところです。

上記、Streaming APIはWebsocket以外にもあるようでして、セッション維持をしながら更新データを受け取る方式が備わっていたりするようです。

ActivityStream

で、このActivityPub自体、さらに基幹的な規約としてあるのがActivityStream 2.0のようでして

そもそもがJSONでやり取りしようとした取り決め自体がこのActivityStreamから始まるようです。

ActivityStreamに機能追加したのがActivityPubかな?

ActivityPubになると、どこのサーバに送るのか、だれに送るのかといった設定や、どのTootにBoostしたのかとか、どのTootにMentionしたのかなどの要素を付加しており、この内容に基づき発言がサーバから別のサーバに転送されます。

ユーザーからサーバへ送られる間に、ActivityPubデータが生成され、サーバから実際に飛んでいく時は「object」に包まれて、外側に情報が付与される、いわゆるカプセル化が行われ、サーバ同士の通信でやり取りされます。

通信先サーバがこれを受け取ると、JSONデータから再びObjectの中身をほどき、ユーザごとの処理に回されていくという動作を行っているようで。さて、ここで実際のデータを見てみましょう。

実際ログに流れてたデータはこんな感じ。

上記は実際のTOOTデータを加工したものなんですが、サーバ上のログに流れている文字列は色分けしたようにカプセル化された状態のActivityPubデータが流れていたようです。

Federationはどのように実現するのか

というわけで、SNSサーバ周辺環境の関係を探ってみると、意外にも全体的にActivityPubを使ってるわけではなく、例えばMastodonの場合はあくまで「サーバ to サーバ」に対してのみ利用しています。クライアントとサーバ間のアクセスには、どうやら「Mastodon API」と呼ばれる独自APIを用いて通信しているようです。PleromaだとこのAPIが近似しており、Misskeyは異なるAPIが構成されているということで、SNSソフトウェアの多様性はこうして生まれたのではないかと考えられます。

ある意味Mastodonなどの分散SNSが今でも使われ続けられる理由って、「ソフトウェアを絶妙なレベルで縛ってるようで縛ってない」ということで、多様性を許容した構成をとってるところが大きいのかもしれません。また、下手にビジネスに偏らないAGPL3の存在というのもあるのかもしれません。

WordPressもActivityPub使えるよ

なんとWordpressにもActivityPubのプラグインがあったりします。

ActivityPub plug-in のサイト

ActivityPubプラグインにより、そのブログをフォロー対象にすることが可能になるようです。
マイクロブログに限らず、こうして分散SNSに周辺から働きかけられるツールがあるというのは面白いなぁと正直思います。

まとめ

今回、分散SNSを形作るActivityPubってなんじゃろ?と思ってJSONとにらめっこしながら調べてみました。結果として、ここ最近のREST-APIの隆盛とWebsocketやHTTP/2などのWebに対する新技術、そしてActivityPubというJSONベースの共通規格があって今日のFediverseというものが形成されたのかなというのがおぼろげながら見えました。

正直APIというものに対しては苦手意識のほうが強かったのですが、こうした規格というものがどれ程たくさんの人が考えて作られたのかなーとか思いをはせるにちょうど良い機会になったかなと思います。

次の日は・・・・・・ h3poteto さんが12/9(月)に記事を公開されるようです。どうぞお楽しみに。

蛇足

なお、お仕事先の公式技術ブログに私久々に記事を書くことになりました。当記事と似たような感じで、そちらもアドベントカレンダーのネタとして執筆する予定です。実は結構この記事とダダ被り(っつーか画像とかも流用してるし)なので、果たしてどんなもんかなーとは思うのですが・・・

Follow me!