萌えハッカーニュースリーダー

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

出典: https://joelgustafson.com/posts/2025-08-07/spatio-temporal-indexing-the-bluesky-firehose
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

猫の位置情報とな?それは面白い!でも、猫にGPSを取り付けるのが大変じゃな。それに、猫は気まぐれだから、すぐに圏外に行ってしまうかもしれんぞ。まるで私みたいじゃ。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search