自宅でPubsubhubbubのPub,Sub,Hub一式を動かしてみた

とりあえず自宅のMacPubsubhubbubが動いたのでメモ

環境

Pubsubhubbubのソースをチェックアウト

GoogleCodeでホストされているリポジトリからPubsubhubbubのソース一式をチェックアウト

$ svn checkout http://pubsubhubbub.googlecode.com/svn/trunk/ pubsubhubbub-read-only

Hub,Publisher,Subscriberを起動する

Pubsubhubbubには以下のようなディレクトリがあり、それぞれHub,Publisher,Subscriberのリファレンス実装がGAEアプリ(Python)として実装されている。

    • hub/
    • publisher/
    • subscriber/

以下のようにターミナルを3つ立ち上げて、それぞれのディレクトリ配下で以下のとおりアプリを起動する。

まずHub

$ dev_appserver.py hub

Running application pubsubhubbub on port 8080: http://localhost:8080とかってメッセージが表示されればHubの起動は成功。

つぎにPublisher

$ dev_appserver.py --port=8081 publisher

GAEアプリケーションはデフォルトだと8080ポートを使用するので、明示的に--port=8081としてHubとポートが競合するのを避けている。

最後にSubscriber

$ dev_appserver.py --port=8082 subscriber 

これも同じようにポートの競合が起きないよう--port=8082を指定してに起動する。

Hubサーバのページをブラウザで開いてみる

http://localhost:8080/にブラウザでアクセスしてみる。
以下のように表示された。

実際にGAEでホストされているのとほぼ同じ画面だ。

Subscriber:フィードを購読する

上記ページを下にスクロールすると、以下のようにデバッグ用のリンクが現れる。

このリンクの"Subscribe"のリンクを開くとSubscriberを登録するフォームが現れる。
以下のようにフォームを入力し"Do it"のボタンをクリック

ブラウザ上に何も変化が無いので不安になるが、
Hubのコンソールに以下のように表示されていれば、Subscriberの登録はOK

INFO     2009-09-02 17:49:10,836 main.py:1393] Subscription action verified: subscribe
INFO     2009-09-02 17:49:10,846 dev_appserver.py:3029] "POST /subscribe HTTP/1.1" 204 -

ちなみにsubscriberのコンソールには以下のように出力されており、Hubから購読確認のリクエストが飛んできていたことが確認できる。

INFO     2009-09-02 17:49:10,818 dev_appserver.py:3029] "GET /subscriber.1?hub.verify_token=hoge&hub.challenge=Jf7d7Gd5rzluchT_Flmh3nHaAfEKCoNz6_nASQRCRJSMCrlO6vet0OE6mLHGZ1j6ctYFDp0wXXpYA-Ej6qu_PBKF7PthTHudiW6w8BYYS9kvRVyvUBzsLsz5qZXsf9FS&hub.topic=http%3A%2F%2Flocalhost%3A8081%2Ffeed&hub.mode=subscribe&hub.lease_seconds=2592000 HTTP/1.1" 200 -

Subscriberが登録できたら、http://localhost:8082/をブラウザで開いてみる。
Publisherでフィードの更新が発生したらこのページにフィードがすぐさま反映されるはずだが、まだPublishしてないので、何も表示されていないはず。

とりあえず、このページは開いておく。

Publisher:フィードを生成しHubに更新を通知する

subscriberの準備ができたので、Publisherで新しいエントリをパブリッシュしてみる。
http://localhost:8081/をブラウザで開く。
すると、簡単なメッセージ入力フォームが表示されるので適当に入力して"submit"をクリック

下のほうの"Previous message"ってところに、入力した内容が表示されればメッセージの登録完了。

次に、Hubに対してフィードが更新されたことを通知する。
http://localhost:8080/のページを開いて、画面下部の"Publish"のリンクを開く。
すると、PublishするフィードをHubに通知するためのフォームが現れるので、以下のように入力して"Publish"


Hub:Publisherの更新通知を受け取りSubscriberに通知する

本来なら、この時点でHubがフィードを収集して、それぞれのSubscriberに更新を通知するはずだけど、開発サーバ上であるためか、いくつか手作業で処理を実行する必要があった。

手動によるタスクの実行

http://localhost:8080/_ah/admin/ページを開き。開発サーバのコンソールを表示。
そして"Task Queues"を表示する。
http://gyazo.com/9d90a1f7e0c635d89258dad03df669af.png
上記のように"feed-pulls"のキューに1件のタスクが登録されているので、"feed-pulls"のリンクを開いて、"run"でタスクを実行する。
すると、次は"event-delivery"というキューにタスクが登録されるので、これも同じように実行。

これで、更新通知としてSubscriberにフィードの内容がPOSTされる。

Subscriber:受信したフィードの確認

で、先に開いておいたSubscriberのページhttp://localhost:8082/を確認すると、以下のようにPublisherからのフィードが受信できていることが確認できる。

手動でタスクを動かさないといけないのであんまり「リアルタイム感」が無いけど、とりあえずPubsushubbubの一式が動くの確認できた。

疑問

  • 開発サーバではTask Queueは手動で処理するしかないのかなぁ?