アーキテクチャ概要
misskey-cf は、Misskey のサーバー部分を Cloudflare Workers 向けに書き直したものです。Web クライアント(Vue)・API・データベースのスキーマは upstream と同じものを使い、それ以外の基盤を Cloudflare のサービスに置き換えています。
- upstream との対応表 — upstream の部品ごとの置き換え先
- 処理の流れ — API 呼び出し・投稿・ストリーミングなどのシーケンス図
- チャート — チャートを都度集計する理由
upstream との違い(ひと目で)
| upstream | misskey-cf | |
|---|---|---|
| 実行環境 | Node.js プロセス 1 種類 | Worker 5 つ(役割ごとに分割) |
| データベース | PostgreSQL | PostgreSQL(同じスキーマ。Hyperdrive 経由) |
| Redis | キャッシュ・タイムライン・通知・pub/sub | 使わない(Durable Objects・KV・PostgreSQL で置き換え) |
| ジョブキュー | BullMQ | Cloudflare Queues |
| ファイル保存 | ローカル / S3 | R2 |
| 画像・動画処理 | sharp / ffmpeg(同じプロセス) | Containers(sharp + ffmpeg) |
| 全文検索 | Meilisearch など(任意) | 使わない(SQL LIKE) |
| Web クライアント | upstream の Vue | upstream の Vue をそのままビルドして配信 |
Worker の構成
公開されているのは gateway だけです。ほかの Worker は Service binding・Durable Objects・Queues 経由でのみ呼ばれます。
| Worker | 役割 | 持っている Durable Objects |
|---|---|---|
| gateway | 唯一の公開 Worker(misskey-cf.sameharu.dev)。Web クライアントの配信、HTML とページごとのサーバー描画、それ以外は api へ中継 | なし |
| api | 全 API エンドポイント、ストリーミングの認証、ActivityPub の送受信、ドライブ、メール、Web Push、各 Queue の処理、定期処理(Cron) | PollTimer、OnceGuard、Reversi、RateLimiter |
| timeline | 投稿をフォロワーのタイムラインとストリーミングへ配る(Queue mk-timeline-fanout の処理) | TimelineShard、NotificationBox、OpsStats |
| stream | ユーザーごとの WebSocket 接続、オンライン状況、ノートの更新通知 | StreamHub、StreamPresence、NoteWatch |
| media | サムネイル・webpublic・blurhash の生成、メディアプロキシ、通知バッジ | MediaContainer(Container) |
バインディング名・Queue・Durable Object の詳細とデプロイ順は Cloudflare bindings を参照してください。
使っている Cloudflare のサービス
| サービス | 用途 |
|---|---|
| Workers | 5 つの Worker |
| Static Assets | upstream の Web クライアント(gateway) |
| Durable Objects | タイムライン、通知、WebSocket、オンライン状況、レート制限、タイマーなど(Redis と遅延ジョブの置き換え) |
| Queues | ActivityPub の送受信、タイムライン配信、Webhook、バックグラウンドジョブ(BullMQ の置き換え) |
| Hyperdrive | PostgreSQL への接続 |
| R2 | ドライブのファイル |
| KV | meta と絵文字一覧のキャッシュ |
| Containers | sharp + ffmpeg |
| Email Service | メール送信 |
| Cron Triggers | 毎時の定期処理 |