Misskey & Webテクノロジー最前線

分散型SNS「Misskey」⁠それを支える技術スタック

本連載は分散型マイクロブログ用ソフトウェアMisskeyの開発に関する紹介と、関連するWeb技術について解説を行っていきます。第1回はMisskey、ひいては分散型SNSの簡単な紹介とその内部実装の概略を説明します。

はじめまして!

はじめまして、Misskey(みすきー)のプロジェクトリーダーをしている、しゅいろ@syuiloです!

この度連載の機会をいただきましたので、ちょっと仰々しい気もしますが「Misskey & Webテクノロジー最前線」と題して、今後Misskeyやそれに関わる最新のWeb技術について解説をしていく予定です。

今回はMisskey、ひいては分散型SNSの簡単な紹介とその内部実装の概略を説明します。

対象読者は、後半の実装解説の部分においてはある程度のWeb開発の知識がある人を想定しています。

Misskeyとは⁠そして分散型とは

Misskeyは、オープンソースの分散型マイクロブログサービスを実現するソフトウェアです。

図1

注意「Misskey」はソフトウェアの名前であり、具体的なサービスの名前ではありません。ただし実際には「Misskeyを使用したサービス」のことを単に「Misskey」と呼ぶユーザーも多いです。

2014年から開発していて、来年で10周年になります。下手の横好きかもしれませんが、Misskeyの開発は私のライフワークと言っても過言ではありません。

昨今のTwitter情勢の変化に伴い、Misskeyの認知度、ユーザー数ともにかなり増加傾向にあります。また、開発者も当初は私だけでしたが、今では複数のメンバーによってメンテナンスが行われています。

Misskeyは「Twitter風」のサービスのためのソフトウェアですが、SlackやDiscordのようなリアクション機能、柔軟にカスタマイズできるUI、後述する分散型であることなどが特徴になっています。

他にも、AiScriptという独自のスクリプト言語を使用してMisskey内で様々なコンテンツやウィジェット、プラグインなどを作ることもできるという他にはなかなかない機能もあります。詳しくは以下のサイトを見てみてください。

インスタンス

2023年3月追記:インスタンスという名称は、分かりやすさや他のソフトウェアと名称を合わせるために『サーバー』に統一されました。適宜読み替えてください。

まず基本的な用語として、インスタンスというものがあります(⁠⁠サーバー」と呼ばれることもあります⁠⁠。

インスタンスは、⁠Misskeyを使った個々のWebサービス」を指します。ブログ作成ソフトウェアWordPressに例えると分かりやすいかもしれません。WordPressがMisskeyに相当し、実際にWordPressを使って作られた個々のWebサイトがMisskeyのインスタンスに相当します。プログラミング風に言えば、Misskeyはクラスで、Misskeyのインスタンスはそのままクラスのインスタンスです。

図2

そのため、ユーザーはまず自分の好みのインスタンスを選び、そこにアカウントを作成します。基本的にどのインスタンスを選んでも、後述のようにMisskeyは分散型なため他のインスタンスのユーザーとやり取りすることができます。

Misskeyを実際に試してみたい方は、joinmisskeyなどでインスタンスを探せます。なお、Misskey最大のインスタンスはmisskey.ioで、筆者のアカウントもここにあります。

もちろん、自身でインスタンスを作成し運営する選択肢もあります。

分散型とは何か

分散型とは、前述したそれぞれのインスタンスが、相互にコミュニケーション可能になっていることです。

例えば、AというインスタンスのユーザーがBというインスタンスのユーザーをフォローしたり、インスタンスBがインスタンスCにいるユーザーの投稿にリアクションしたりすることができます。

インスタンスとインスタンスが繋がることをFederation(=連合)と言い、さらにこれら個々のインスタンスで構成されたネットワーク全体のことを俗にFediverseと呼称します(Federation + Universeの合成語⁠⁠。

このFediverseにおいて特定のユーザーを指し示すときは、Twitterのように@aliceといったアットマークで始まるユーザー名だけでなく、メールアドレスのようにそのユーザーが属するインスタンスのドメインも併記する必要があり、例えば@alice@mi.example.comのようにして表されます。ユーザー名はインスタンス間で一意ではないため、ドメインの併記は基本的に必須です。

なお、⁠自身の所属するインスタンス内にいるユーザー」のことをローカルユーザーと呼び、⁠他のインスタンスにいるユーザー」のことをリモートユーザーと呼びます。このローカル/リモートという区分けはユーザー以外にも適用される概念で、例えば「ローカル投稿(=自インスタンスの投稿⁠⁠リモート投稿(=他インスタンスの投稿⁠⁠」などと言います。

FediverseとActivityPub

どのように分散型を実現しているかですが、MisskeyはActivityPub(略称=AP)と呼ばれる分散型SNSのためのW3Cによって標準化されたプロトコルを実装してインスタンス間で相互に通信を行っています。このように述べると難しく感じるかもしれませんが、やっていることとしては決められたルールに則ってサーバー間でJSONを普通のHTTPリクエストとして投げ合っているだけです。

図3

具体的なケースで言うと、@alice@mi.example.comに対して@bob@mi2.example.com@carol@mi3.example.comがフォロワーにいるとします(各々ドメインが異なる=所属するインスタンスが異なることに注意⁠⁠。この状態でaliceが投稿を行ったときは、mi.example.comからmi2.example.com、mi3.example.comに対してHTTPリクエストが送信され、各インスタンスに投稿内容が伝わり、bobやcarolのタイムラインにaliceの投稿が表示されることになります。

この「他インスタンスへのHTTPリクエスト送信」アクティビティの配送(deliver)と呼びます。ここで「1000人異なるインスタンスのフォロワーがいれば、1回の投稿で1000回配送が発生するのか」と思った人もいるかもしれません—⁠—答えはイエスです。同じインスタンスのフォロワーへの配送は、Shared Inboxという仕組みを用いて1回で済ますことができますが、1000人それぞれのインスタンスが異なれば、当然その分だけリクエストを行う必要があります。

このようにアクティビティの配送はMisskeyにおいて大きなウェイトを占める処理です。そのため、ジョブキューを使って配送が管理されます。このジョブキューについては改めて解説する予定です。

また、プロトコルが標準化されているので、このプロトコルを実装しさえすればどのようなソフトウェアでもMisskeyとやり取りすることができます。実際にActivityPubを実装した他のソフトウェアとしてはMastodonやPleromaなどがあります。ただし、ActivityPubは基本的な部分しか規定しておらず、そこから拡張された個々のソフトウェアの機能は必ずしも互換性があるわけではありません。例えば、リアクション機能はActivityPubにあるものではなく基本的にMisskeyにしか存在しません。

Misskeyの技術スタックの変遷

あるソフトウェアを開発するのに利用される一連の技術、ライブラリ、ソフトウェアのことを技術スタックと言いますが、Misskeyは開発がもうすぐ10年目になることもあり、変遷の歴史を辿ってきました。

常に新陳代謝をしているため、⁠10年前に作られたソフトウェア」というわけでは全くなく、むしろ現在使用しているのはどれもモダンな技術です。何度も一から書き直したりもしているため、10年前のコードなんて影も形もありません。昨年も、Nest.jsの導入に伴いバックエンドを大幅に書き直していたりします。

図4

Misskeyの開発をスタートした時点(2014年)では、筆者がまだ高校生であり技術力にも乏しかったため、バックエンドのプログラミング言語はPHP、データベースはオリジナル、フロントエンドはjQueryという、だいぶ初歩的なものでした。

次にデータベースがMySQLになり、フロントエンドがRiot.jsになり、MySQLをMongoDBにしてみたり……と、次第に近代的な(?)構成に変わっていきます。

そして最終的には、PostgreSQL + Fastify + Vue.js + Node.jsという技術スタックに落ち着き、現在に至ります。なお、バックエンド/フロントエンドともにTypeScriptです。

この分野では、こういった技術スタックの組み合わせ方で有名なものがいくつかあります。例えばMongoDB + Express + Angular + Node.js—⁠——それぞれ頭文字を取ってMEANといったものがあります(ちょっとこれは古い例ですけどね⁠⁠。それに倣えばMisskeyはPFVNといったところでしょうが、発音は謎ですね。

また開発環境についても、メモ帳→サクラエディタ→Brackets→Atom→VSCodeと変化しています。Misskey開発の歴史は筆者の歴史でもあるわけです。

新しいもの好き

先ほど「新陳代謝」とも言いましたが、Misskey開発の特徴のひとつとして、昔から最新のWeb技術を貪欲に取り入れるというものがあります。例えば最近だとContainer Queriesと呼ばれるCSSの新機能を採用して、クライアントのパフォーマンス向上を狙っています。⁠貪欲に」というのは、たとえその時点で対応しているブラウザが少なくても採用するということです[1]

最新の技術なので、もちろんブラウザのバージョンが少し古いだけでも動作しません。しかし最新の技術を取り入れることによるメリット(他にはない機能を提供できたり、パフォーマンスを向上できたり)のほうを重視しています。そのこともあってか、たまに「MisskeyはしゅいろさんのWeb技術実験場」なんて言われたりもします。

主な技術とその紹介

Misskeyがオープンソースであり、誰でも簡単にインスタンスを作成できるようにするため、使用する技術もすべてオープンソースのものにしています。細かなライブラリも含めれば数は非常に多いため、ここでは重要だと思われるものをピックアップして紹介します。

なお、以下で紹介する各技術は今後の連載でも取り上げて深掘りする予定です。

TypeScript

TypeScript: JavaScript With Syntax For Types.

TypeScriptはJavaScriptに型を導入した言語で、Misskeyではバックエンド/フロントエンド共に採用しています。

TypeScriptを直接解釈できるランタイムはほとんどないため、実際に動かす際はJavaScriptにコンパイルして使用します。

この「JavaScriptにコンパイルして使用する言語」のことをaltJs(=Alternative JavaScript、JavaScript代替の意)と呼んだりします。altJsで有名なものとしては他にCoffeeScriptなどがあり、登場時は一世を風靡しました(が、JavaScriptの進化やTypeScriptの登場に伴い、CoffeeScriptは現在ほとんど使われていません⁠⁠。

Node.js

Node.js® is an open-source, cross-platform JavaScript runtime environment.

Node.jsはJavaScriptのサーバーサイドランタイム(JavaScript実行環境)を提供するもので、Misskeyのバックエンドです。

V8と呼ばれるGoogle Chromeで使われているのと同じJavaScriptエンジンで動いているため、高速に動作するのが特徴です。

最近では、DenoBunといった後発のプロジェクトもいくつか出ていますが、Misskeyは今のところNode.jsを使用しています。

MisskeyではソースコードをTypeScriptを用いて記述していますが、Node.jsはJavaScriptしか解釈できないため、ビルド時にソースコードをJavaScriptにコンパイルしています。

PostgreSQL

PostgreSQL: The World's Most Advanced Open Source Relational Database

PostgreSQLはリレーショナルデータベースで、通称ポスグレと略されます。Node.jsが脳なら、PostgreSQLは心臓といったところでしょうか。MySQLではなくPostgreSQLを選んだ理由としては、PostgreSQLは配列やJSONなどのサポートがあり、MySQLよりも高機能でMisskeyで活用しやすいと考えたためです。

以前はMongoDBを使用していたことは前述しましたが、NoSQLから従来のリレーショナルなデータベースに移行したのはよりスキーマに則ったデータ管理をしたくなったためです。

Redis

The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.

Redisは、Key/Value型のインメモリデータベースです。Misskeyでは、主に揮発性の情報(キャッシュなど)を保存したり、ジョブキューのタスクを管理したり、Misskeyプロセス間での通信のハブとして使用したりしています。

処理が集中しボトルネックになりがちなデータベースの負担を軽減するため、Redisのさらなる活用を今後予定しています。

Bull

Premium Queue package for handling distributed jobs and messages in NodeJS.

Bullはジョブキューと呼ばれるソフトウェアで、Node.js+Redis上で動きます。アクティビティの配送など、細かいタスクを複数のサーバーに割り当てて実行する役割を持ちます。こういった役割を持つソフトウェアとしてはRubyのSidekiqが有名で、こちらは聞いたことがある人もいるかもしれません。

このジョブキューの処理は「タスクを捌く」と言われ、何らかの原因でタスクの捌きが滞ることを「キューが詰まる」などと言ったりします。

Nest.js

A progressive Node.js framework for building efficient, reliable and scalable server-side applications.

Nest.jsはバックエンドのフレームワークで、Misskeyは主にDependency Injection(DI)と呼ばれる設計手法を実現するために使用しています。導入したのが昨年なので割と最近で期待の新人です。

この分野はNext.js、Nuxt.jsなど似た名前のフレームワークが多いのでなかなか紛らわしいです。

Fastify

Fast and low overhead web framework, for Node.js

FastifyはバックエンドのWebフレームワークで、HTTPリクエストを受け付ける役割を持ちます。この分野では他にexpressなどが有名ですが、expressは長い間開発が停滞しており、未だにHTTP/2のサポートもないなどの問題がありました。そのためMisskeyでは早い段階からexpressの使用はやめています。

MisskeyのNode.js時代に限っても、express→koa→fastifyと遷移しています。

Vue.js

An approachable, performant and versatile framework for building web user interfaces.

Vue.js(読み:ビュー)はフロントエンドのUIフレームワークで、Misskeyでは最新のVue 3を使用しています。Vue 3では、Composition APIの導入でより柔軟にコンポーネントを記述できるようになっています。

全体的なフレームワークの完成度としてはライバルであるReactのほうが優れている気もしますが、データのリアクティビティの実現方法はVueのほうが使用感が優れていると感じます。

Vite

Next generation frontend tooling. It's fast!

Vite(読み:ヴィート)はフロントエンドのビルドツールです。以前はこの用途ではwebpackを使用していましたが、Viteのほうが後発でよりモダンだっため乗り換えました。

webpack同様、単にアプリケーションのビルドだけでなく、Hot Module Replacement(HMR)といった開発を便利にする機能も備えていて、Misskeyの開発でも活用しています。

Vueの作者と同じEvan Youが始めたプロジェクトで、もちろんVueとの相性も良いです。

Misskeyの今後

Misskeyの今後について触れておきます。

Misskeyはまだまだ試したい技術があるため、今後はさらに開発を加速させ、進化を続けたいと考えています。一例を挙げるとOAuth2の導入などがあります。

そのためには、ドキュメントの整備、ソフトウェアとしての安定性、メンテナンスの行いやすさ(開発のしやすさ)を上げていく必要があり、現在それらに取り組んでいます。

また、より多くのユーザーに利用してもらうためには、プロジェクトだけでなくインスタンス運営の面でもマネタイズし易くする必要があり、先日リリースしたMisskey v13ではロール機能の導入なども行っています。

ロードマップも公開していますので、興味があれば見てみてください。

まとめ

この連載初回では、Misskey、ひいては分散型SNSの紹介と仕組みを掘り下げ、その使用技術について簡単な説明を行いました。

Web技術は群雄割拠の様相を呈しており、なかなかキャッチアップも大変に感じるかもしれませんが、今後の連載で少しずつ解説していく予定ですのでご期待ください。

また冒頭でも触れましたが、最近はTwitterを取り巻く情勢が大きく変化しつつあり、先行きの不安からMisskeyやMastodonの利用が非常に増えています。分散型SNSはこれからますます発展していくと予想されるため、ぜひお好きなMisskeyやMastodonインスタンスでFediverseを体験してみてください。

図5

そして宣伝のようになってしまい恐縮ですが、Misskeyでは随時プロジェクトへの寄付を受け付けています。Misskeyはフリーソフト(この呼び方ってちょっと古くさい感じがしますね)であり、収益を寄付にのみ頼っているため、ご興味があればぜひご検討をお願いします!


次回は今回紹介した技術の中から一つピックアップして、詳細な解説を例を交えながら行う予定です。

またMisskeyの開発に伴い、Misskey HubやAiScriptといったサイドプロジェクトも生まれているので、そちらの紹介も機会があれば行いたいと思います。

Stay tuned!

おすすめ記事

記事・ニュース一覧