blog/content/posts/2024-08-16/index.md

6.4 KiB
Raw Blame History

author draft categories date tags keywords title relpermalink url decription
usbharu false
技術
2024-08-16T17:01:29+09:00
ActivityPub
Kotlin
Spring Framework
ActivityPub
Kotlin
Spring Framework
自作SNSの進捗と近況報告 posts/2024-08-16/ posts/2024-08-16/ 自作SNSの進捗と近況報告

気づいたら8ヶ月ほど放置していました。高校卒業や専門学校入学、卒業旅行など、色々あったのでそのこともちょろっと書きたいと思います。

前回、「ActivityPub実装SNSを作っている。その感想」(https://blog.usbharu.dev/posts/2023-12-24/)でAP実装を作っている話を書きましたが、その時からかなり期間が空いたこともあり、色々状況が変わったのでどうせならここに書いてやろうと久しぶりにVSCodeを立ち上げたわけです。

ActivityPub部分が無くなった

まず、ActivityPub実装SNSじゃなくなりました。というのもHideoutは最初Ktorというほぼ純Kotlin製のマイクロフレームワークで作られていました。最初は、お一人様向けの小規模で、簡素なActivityPub実装を目指していましたが、様々な機能が追加されていくにつれてKtorでは実現が困難、または品質を保証できない様になっていきました。特にMastodon互換APIとしてのOAuth2プロバイダー対応はKtorからSpring Frameworkへの乗り換えを決める決定的な要因となりました。当初、簡素な実装を目指していたことや、そもそもWebアプリケーション開発の知見がなかったこともあり、かなりぐちゃぐちゃになっていました。そこで、ほぼ一から作り直したのですが、ひとまずSNSとしてある程度完成させて、あとからActivityPubに対応させるという方針を取ることにしました。普通に考えたら無茶苦茶なのですが、分散型SNSの基盤部分を作っておき、ActivityPubはその基盤上に構築するという方法で実現しようとしています。

ジョブキューを自作した

次にActivityPubではほぼ必須になるジョブキューを自作しました。以前はKJobというKotlin製軽量ジョブキューのフォークを使用していましたが、開発がストップしていること、ActivityPubで使うには機能が不足していることから自作を決めました。ActivityPubってJSONを送りつけ合って(配送と呼ぶことが多い)連合するんですが、リモートに何らかの原因でJSONを送りつけることができないことがあります。大抵の実装では何度かリトライしてそれでも配送できなければ諦めるっていう方法を取ることが多いです。このとき、リトライの間隔が短いと復旧までの間にリトライし終えてしまいます。でもあまり長いと復旧してからもなかなか配送が完了しませんから、リトライのキューが溜まるし、リモートと不整合が起こる可能性も高くなります。というわけでMastodonなどでは失敗するたびにリトライの間隔を長くする方法を取っているのですが、KJobではこれができませんでした。その他色々使いにくいところが多かったため自作して良かったと思っています。

自作ジョブキューの技術構成

自作ジョブキューの主な使用技術はKotlin、gRPC、MongoDBで、Consumer、Broker、Producerに分かれています。すべての通信をgRPCで行っているためKotlin以外の言語を使った実装に差し替えることも可能で、いつかGolangやRustに書き換えてみたいと思っています。キューの管理はMongoDBに丸投げすることで実装の簡略化を行っており、性能は殆どMongoDBで決まります。逆にMongoDBを酷使する設計のためHideout(同じくMongoDBを酷使する)と相性は良くないかもしれません。

ジョブキューの今後

自作ジョブキュー自体が1ヶ月程度で作られたため、改善の余地ありまくりって感じなんですが、まぁまだHideoutの方の開発がActivityPubに到達してないので良くわかりません。とりあえずリモートインスタンスごとのジョブの成功率を管理して、ダウンを検出したら同一インスタンスに関連するジョブは止める、復活したら順次配送する、といった仕組みは作りたいと思っています。

HTTP-SignatureがRFC9421として固まった

我々を散々苦しめてきたHTTP-SIgnatureがRFC 9421として正式に仕様が決まりました。これによってドラフトが云々といった話やこの記事は過去のものとなりました。まだ全部読めていませんが、翻訳してみたりしてちょっとずつ読み進めています。RFCとして決まったことで対応ライブラリとかがでてきてくれることをちょっとだけ期待したのですが、残念ながらJVM言語では今のところライブラリはありません。しかし、今後は互換性の問題をあまり気にすることなく実装を進めることができます。と言っても、すぐに全部の実装が対応してくれるわけではないので今後数年は過去の形式にも対応する必要があると思います。尤も、そんな時まで自分がActivityPubの世界にいるのかはわかりませんが…

その他、近況報告

前回からいろんなことがありまして、FEに合格したりートPCを買ってもらったり高校を卒業して卒業旅行に行ったり、専門学校に入学して友だちができたりAPに合格したり車の免許を取るために教習所に通い始めたりしました。あと琵琶湖一周しようとして電車止まって失敗したり初めてネッ友とあったりしました。卒業旅行だけちょっとおもしろいのでちょっと紹介しますね。

卒業旅行と言っても高校の友達と行った、とかじゃなくて家族と行ったんですが、名古屋→那覇→東京(色々)とつくば→神戸を3泊4日で行く限界異常旅程旅行でした。それだけ