2025/04/26 17:12 HTTP Feeds: a minimal specification for polling events over HTTP

やっほー、ロボ子!今日はHTTPフィードについて話すのじゃ。

HTTPフィードですか、博士。それはHTTPを使ってイベントをポーリングするためのもの、と理解してよろしいでしょうか?

その通り!HTTP GETエンドポイントからイベントの時系列順シーケンスが取得できるのじゃ。しかもCloudEvents形式でシリアライズされてるから、扱いやすいぞ。

`application/cloudevents-batch+json`メディアタイプを使うバッチ応答なのですね。`lastEventId`クエリパラメータでリアルタイムフィードサブスクリプションもサポートする、と。

そうそう!KafkaやRabbitMQみたいなメッセージブローカーなしで、システムを非同期的に分離できるのがミソじゃ。

ポーリングについてですが、単純なポーリングと長いポーリングがあるのですね。`timeout`クエリパラメータでサーバーが応答を待つ最大期間を指定できるのは便利そうです。

長いポーリングは、サーバーが新しいイベントを効率的に処理する必要があるから、内部イベント通知とか変更データキャプチャトリガーを実装する必要があるのじゃ。データベースへの高頻度ポーリングでも良いけど。

イベントIDは、後続のイベントをスクロールするために`lastEventId`として使用されるのですね。イベントが削除された場合でも、サーバーは元の位置を尊重する必要がある、と。

イベントIDには時間順のUUIDとか、データベースシーケンスが使えるぞ。HTTPフィードは、不変のドメインイベントを公開するAPIとして使えるのじゃ。

集約フィードというものもあるのですね。これは可変オブジェクトのデータコレクションを提供するAPI、と。

そう!集約フィードには、すべての集約が少なくとも1回は含まれていないといけないぞ。コンシューマーは、新しいデータや更新されたデータを受信したときに、ローカル読み取りモデルを構築できるのじゃ。

コンパクションは、フィードを小さく保つために、同じ`subject`の古いフィードアイテムを削除する処理のことですね。削除は、規制要件などで集約を削除する必要がある場合に使われる、と。

集約が削除された場合、サーバーは削除する`subject`とデータコンテンツなしで`DELETE`エントリを追加する必要があるのじゃ。クライアントは、この集約を削除するか、削除を処理する必要があるぞ。

認証は、HTTP認証で保護できるのですね。Basic認証とBearer認証が一般的、と。キャッシュも重要で、サーバーは適切な応答ヘッダーを設定できるのですね。

HTTPフィード、なかなか奥が深いじゃろ?ところでロボ子、HTTPって何の略か知ってるか?

はい、Hypertext Transfer Protocolの略です。

ブー!ハレンチ!トランス状態!プロポーズ!…って、違うか!

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