Streaming APIにWebSocketに加え、Server-Sent Event(SSE)もサポートしていただきたいです。
Server-Sent Eventの概要としては
です。
MastodonでもStreaming手段の一つとして、Timelineやhashtag、List、Direct Message、更新されたUser Status、の配信に利用しています。
SSEのデメリットとしては
というものが挙げられますが、
Streaming APIにSSEを採用することによるメリットとして、
と考えられます。
検討よろしくお願いします。
SSEはサーバーからのイベント送信のみであるため、そのセッションに対して設定をするようなAPIが必要になると思った
@syuilo 久しくコードを触ってないのでリハビリを兼ねてやってみてもいいですか?(もしかしたら諦めるかもしれない)
再接続が仕様に標準で含まれていて実装されているのは大きいメリットかと。
旧Edgeのサポートなんてあんまりしなくていいと思うし、MisskeyのWebSocketは今のところバイナリデータを含まないのでWebSocketから完全移行しても問題はなさそう(極端な話ですが)。
WS の方がオーバーヘッド的に強そうだし別にどっちも共存していいとは思う。
これは1ユーザの勝手なボヤキなのですが、SSEによるStreaming APIでアンテナの新着とかが配信できると便利そうだなと思いました。
久しくコードを触ってないのでリハビリを兼ねてやってみてもいいですか?
👍 @acid-chicken
ツッコミ歓迎
GET /streaming で流すi クエリで認証トークンを渡す(任意)events クエリで欲しいイベントの種類を指定する, で区切られる/[\d\w]+|-[\d\w-]+/- でない場合、文字列全体をそのままセクションとしてみなす_ が使用可能 (/[\d\w]/)- の場合、後続の文字列全体を base64url エンコーディングされたセクションとしてみなす: で区切られる:all は全てのイベントを表すスペシャルトークン! をつけてもよい! をつけてもよい/^(?:(?:(?:[\d\w]+|-[\d\w-]+)|(?:(?:[\d\w]+|-[\d\w-]+)?(?::(?:[\d\w]+|-[\d\w-]+))+))!?)(?:,!?(?:(?:[\d\w]+|-[\d\w-]+)|(?:(?:[\d\w]+|-[\d\w-]+)?(?::(?:[\d\w]+|-[\d\w-]+))+))!?)*$/ になるが、このバリデーションの前に空白文字 (/\s/g) は除去されるtimeline:local: LTL 投稿イベントが流れてくるtimeline:home,notification: HTL 投稿イベントと全ての通知イベントが流れてくるtimeline,!timeline:global: GTL 以外の全てのタイムライン投稿イベントが流れてくるtimeline:tag:-44OQ44Kt44OQ44Kt57K-57Gz5qmf: #バキバキ精米機 タグタイムライン投稿イベントが流れてくる:all: 全てのイベントが流れてくるdata を擬似的に Data URI のようにみなし、MIME-Type 部分でイベントの種類を表現するdata:application/vnd.misskey.sse+json;event="timeline:local",{...: LTL 投稿イベント特定の子サーバーにストリーミングが集中してきたらサーバーからわざとコネクションを切って再接続を促すことでよりきちんと負荷分散できそうなので、現状の WebSocket エンドポイントが抱える負荷偏重問題の代替策になりうるかもしれない。
Slackの rtm.start みたいに受け取りたいデータを与えると一時URLが発行されるとかでもいいかもしれない
あとリバースプロキシが変にレスポンスをバッファするかもしれないけどそれへの対策はどうするんだろう
nginx は X-Accel-Buffering: no で切れるはず(ただし fastcgi_pass_header "X-Accel-Buffering"; を nginx の .conf 側で予め記述しておく必要あり)。
他はあまり知らない
Slackの
rtm.startみたいに受け取りたいデータを与えると一時URLが発行されるとかでもいいかもしれない
ストリームの管理が Last-Event-ID と URL で二重になってしまうので、初回接続は POST で Last-Event-ID もらってくるとかがむしろ綺麗っぽそう?
初期値として Last-Event-ID を指定できなさそう https://developer.mozilla.org/en-US/docs/Web/API/EventSource
- A last event ID string. This must initially be the empty string.
Apart from url these are not currently exposed on the
EventSourceobject.
— 9.2.2 TheEventSourceinterface • HTML Living Standard
ふーむ
Most helpful comment
@syuilo 久しくコードを触ってないのでリハビリを兼ねてやってみてもいいですか?(もしかしたら諦めるかもしれない)