そもそもこのフィードは何なのか
- フォローしている人の固定ポストを
- ランダムな順番で
表示するフィードです
↓ぜひ見てみてください
https://bsky.app/profile/did:plc:qcwvyds5tixmcwkwrg3hxgxd/feed/pinfeedran
インフラ詳細
デプロイ先はRender、データベースはUpstashのRedisを使っています。
どちらも無料枠がとても良心的で、個人で使うのにはとてもおすすめです。(今のところ一銭もかかってません)
仕組み
アクセスされてからのフローはこんな感じです(カスタムフィード自体の説明は省きます)
- ヘッダーに含まれているJWTからDIDを取得
- Redisからキャッシュを取得
- もしキャッシュが存在すればそこから要求されている部分を切り取って返す
- app.bsky.graph.getFollowsでその人がフォローしている人を取得
- app.bsky.actor.getProfilesでプロフィールを取得
- 固定ポストの情報を抽出し、一次元配列にしてランダムに並べる
- データを返し、一次元配列の状態でそのままRedisに保存(寿命は現状10分にしている)
cursorの値は配列のインデックスをそのまま使っています。多分ほんとはよくないです。
おまけ 今回生み出したくそコード
//ランダムに並べる
posts
.map((v) => ({ ran: Math.random(), value: v }))
.toSorted((a, b) => a.ran - b.ran)
.map((v) => v.value)