Site icon image usounds

v usoundsの日常や技術的なメモを残すブログです

Blueskyのカスタムフィードの仕組みを一から自分で考える #02

カスタムフィードの目的

動かす仕組みが理解できたので、さて何に手を出そうと思っていたところ、別SNSで何かか起こったようでBlueskyのユーザーさんが増えて投稿量が増加。その結果、今までのカスタムフィードでは投稿量が多く用途別に細分化さえる流れになりました。

元々Blueskyのカスタムフィードそのものを検索する仕組みに乏しく、草の根活動でどうにかしていて。誰かに紹介するにも大変、作るのもあれ似たようなやつあったっけ?を探すのも大変でした。外部サイトさんでカスタムフィードのまとめを作られている方もいますが、外部サイトさんではFF14用のカテゴリを作っていただくわけにもいかない。でも、個別の案内サイトを作る規模でもない。

もしかして、フィードを紹介するフィードを作れば良いのでは?しかも自動で。ということでやりたいことは下記となりました。

  1. フィードを紹介する投稿からフィードを自動生成したい
  2. 自動生成を取り逃がした投稿も追加できるようにしたい
  3. このフィードへの掲載を望まない作成者の意図を汲みたい
  4. フィードの作成者のみが、このフィードへの追加・削除ができるようにしたい
  5. これらをBlueskyの仕組みだけで実現したい

アーキテクチャの検討

2はFirehoseの仕組み上、サーバー止まっている間のものを俎上処理ができないので、必須要件。これはBlueskyで最も有名なチャットBOTである「どのきのこに属するの?」の仕組みで簡単にできるはず。

チャットボット的な機能も欲しいし明らかにDBレス(Contrailsとか)では無理なので、今回は素直に公式のサンプルのアーキテクチャをそのまま流用しすればよい。

カスタムフィードを表示するところにロジックを埋めるのは厳しそうなので、素直にデータベースには諸々の処理結果のみを書き込むようにします。Firehoseは全世界の投稿、リポスト、いいね、投稿削除のイベントが飛んできます。意外とイベントを受け取るのは負荷低めなものの、それをDBに書き込むのは別の話。IO発生するし、なにより溜め込んだものを使うのも大変。絞り込んだモノを保存するようにします。

Image in a image block

subscription.tsの「async handleEvent(evt: RepoEvent)」がPDS(Rly)から連携イベントを受け取った時に呼ばれるメソッド。

「ops.posts.creates」に連携された投稿そのものが入っているので、1件ずつバラして、投稿の本文から「フィードを紹介する投稿」を判別するように出来ますね。(できそうだと言っておきながら、公式のサンプルで「alf」の文字列に引っ掛けているのでそこに手を入れる)