2025/08/07 19:32 Spatio-temporal indexing the Bluesky firehose

ロボ子、BlueSkyのAuroraマップに空間フィードが追加されたってニュースはもうチェックしたかのじゃ?

はい、博士。Joel Gustafson氏がAuroraに空間フィードを追加したそうですね。マップ上でリアルタイムに投稿が見れるようになったとか。

そうそう!WebGPUとUMAPを使って構築されたAuroraじゃから、空間フィードの追加で、Webクライアントがマップ領域内の投稿URIを頻繁にクエリする必要が出てきたみたいじゃな。

なるほど。そこで、バックエンドサービスとしてfirehose consumerをクラウドにデプロイしたんですね。JetstreamエンドポイントからWebSocket経由で投稿のストリームを受信する役割を担うと。

その通り!受信した投稿を、空間クエリをサポートする方法でインデックス化する必要があるのがミソじゃ。ユーザーのマップ座標を持つローカルSQLiteデータベースにアクセスするんじゃ。

2次元空間でのフィルタリングと時間でのソートを同時に行うのが難しかったようですね。3次元SQLite R-treeも検討されたみたいですが、軸でのソートをサポートしていないと。

そうなんじゃ。TimescaleDBも検討されたみたいじゃが、ホストされたPostgresデータベースのコストを避けたかったみたいじゃな。そこで、「quadtree of ring buffers」というカスタムデータ構造を使うことにしたんじゃ。

quadtreeですか。ユーザーの位置情報に基づいてquadtreeを構築し、各ノードが容量kを超えるまで分割するんですね。そして、各ノードに最新のk件の投稿を格納するためのリングバッファを追加すると。

その通り!投稿の挿入は、適切なリーフバケットまでツリーを下り、各ノードのバッファに投稿をプッシュするだけ。クエリは、クエリ領域と交差するすべてのquadtreeノードをトラバースし、最小ヒープに上位k件の結果を収集するんじゃ。

なるほど、効率的なんですね。quadtree-of-ring-buffersはZigでインメモリデータ構造として実装され、NodeJSにネイティブNAPIモジュールとして公開されたんですね。

fly.ioに月額約10ドルでデプロイできたみたいじゃ。Blueskyは現在、1秒あたり約100件の投稿を生成しているらしいぞ。

インデックスは約1,000万件の最新の投稿をキャッシュし、総メモリ使用量は1GB未満。Aurora Webクライアントからの空間クエリはQtCache内で約1〜3msで完了するんですね。素晴らしいパフォーマンスです。

じゃろじゃろ?Auroraは[https://aurora.ndimensional.xyz](https://aurora.ndimensional.xyz)で確認できるから、ロボ子も見てみるといいぞ。

はい、博士。ところで、この技術を応用して、例えば猫の位置情報をリアルタイムで表示するアプリとか作れませんかね?

猫の位置情報とな?それは面白い!でも、猫にGPSを取り付けるのが大変じゃな。それに、猫は気まぐれだから、すぐに圏外に行ってしまうかもしれんぞ。まるで私みたいじゃ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
