Published on

PubSubHubbub🍼👶🏻改め、WebSubを初心者向けに解説❗️Rubyでの実装例も紹介❗️

Authors

この記事は ex-crowdworks Advent Calendar 2024の13日目の記事です。

はじめに

今年、株式会社クラウドワークスを退職した@nisyuuです。これまで食べてきた中で最も美味かったラーメンは、かいすい本店の王府麺です。 エンジニアとしてクラウドワークステック(旧クラウドテック)というフリーランスと企業をマッチングするエージェントサービスを開発していました。

アドカレで技術記事が少ないとの心の声をいただき、僭越ながら技術記事を投稿させていただきます。 よろしくお願いします。

WebSubとは何か

WebSubは、元々「PubSubHubbub」という名称で開発されたプロトコルで、AtomやRSSなどのウェブフィードをリアルタイムに配信するための仕組みです。このプロトコルの実装により、フィードが更新された際に、読者は即座にその情報を受け取ることが可能となります。「Publisher」「Subscriber」「Hub」の3つの要素から構成されることが特徴です。

WebSubの構造

  1. Publisher (公開者)
  • フィードを作成し、更新するエンティティです。Publisherは、作成したフィードをHubに送信しま
  1. Subscriber (読者)
  • 特定のフィードを読み込むためにHubに購読を求めるエンティティです
  1. Hub (ハブ)
  • フィードの更新を管理し、Subscriberに通知を送信するサービスです

WebSubの動作流れ

  1. Publisherは新しいフィードを作成し、Hubに送信します
  2. SubscriberはHubに特定のフィードを訂購するようにリクエストを出します
  3. フィードが更新されるとHubはSubscriberに通知を送信します

この一連のプロセスにより、Subscriberはフィードの更新をポーリングで確認する必要がなくなり、リアルタイムに更新情報を受け取ることが可能です。これは、ブログの更新やニュース記事、ポッドキャストなど、頻繁に更新されるコンテンツの配信に特に有用です。

WebSubのメリット

  1. リアルタイム性
  • フィードの更新情報が即座に配信されるため、ユーザーは最新の情報を迅速に得ることができます
  1. 効率性
  • Subscriberはポーリングの必要がなくなるため、サーバーリソースの消費を削減できます
  1. 簡単な実装
  • WebSubは既存のHTTPプロトコルを使用するため、追加の技術的要件が少なく、比較的容易に導入できます
  1. 標準化
  • W3C推奨のプロトコルとして広くサポートされており、さまざまなプラットフォームやサービスで利用可能です

デメリット

  • Hubへの依存

    • 更新の通知はHubを通じて行われるため、Hubの可用性や性能に依存します。例えば、Hubがダウンすると通知が遅延したり受信できなくなったりする可能性があります。
  • セキュリティ

    • WebSubの実装には認証や暗号化が求められる場合があり、適切に設定しないとデータの改ざんや不正アクセスのリスクがあります

WebSubの実装例

当システムでは、掲載案件が作成・更新・削除される際に、Google WebSub Hubに案件一覧のフィード情報を送信することで、リアルタイムに更新を共有しています。

WebSubの活用事例

ニュースサイトの更新通知

大手ニュースサイトでは、記事が公開または更新されるたびにWebSubを使用して購読者にリアルタイムで通知を送っています。これにより、読者は迅速に最新情報を得ることができます。

ブログプラットフォーム

ブログ作成サービスでは、ユーザーが新しい投稿を公開した際にWebSubを利用して購読者に通知を送信しています。これにより、コンテンツ配信が効率化されています。

ポッドキャストの配信

ポッドキャストプラットフォームでは、新しいエピソードが公開されるたびにWebSubを使用してリスナーに通知を送信しています。これにより、リスナーは新しいコンテンツを見逃すことがなくなります。

開発者向けAPIの利用

APIを提供するサービスでは、データが更新されるたびにWebSubを使用してクライアントに通知を送信しています。これにより、クライアントは効率的に最新データを取得できます。

Rails を使った WebSub の実装例

以下は、Rubyを用いて Publisher として WebSub を実装するシンプルな例です。

require 'net/http'
require 'uri'

class WebSubPublisher
  HUB_URL = 'https://pubsubhubbub.appspot.com/' # 使用するHubのURL

  def self.publish(feed_url)
    uri = URI.parse(HUB_URL)
    response = Net::HTTP.post_form(uri, {
      'hub.mode' => 'publish',
      'hub.url'  => feed_url
    })

    if response.is_a?(Net::HTTPSuccess)
      puts 'Feed successfully published to WebSub Hub'
    else
      puts 'Failed to publish feed'
    end
  end
end

# フィードのURLをHubに送信
feed_url = 'https://example.com/feed'
WebSubPublisher.publish(feed_url)

このコードでは、Net::HTTPを使用してHubに対してフィードの更新を通知しています。HUB_URLは利用するHubのURLで、GoogleのWebSub Hubを使用しています。publishメソッドにフィードのURLを渡すことで、Hubに更新を伝達します。

おわりに

ミィ!