1

superfeedr で pubsubhubbub (pshb) フィードを購読しようとしています。pshb プロトコルの仕組みは次のとおりです。

  1. ハブに POST を送信して、フィードの購読を要求し、コールバックを提供します。
  2. ハブはコールバックに GET を送信して、サブスクライブする意図を確認します
  3. あなたは「はい」と答えます 私は購読したいです
  4. ハブはサブスクリプションの確認で応答します

サーバーを開発マシンでローカルに実行しています。フィードを正常にサブスクライブできるコードがあり、Rails コンソールで直接実行してテストします。現在、Feed ActiveRecord モデルを作成しており、新しい Feed レコードが作成されるたびに自動的にサブスクライブしたいと考えています。FeedモデルにActiveRecordコールバックを追加しました

after_create :subscribe_feed

アクティブなレコードを作成すると、正しい HTTP 要求が送信され、長いハング (ログに何も起こらない約 5 秒) が発生し、コールバックに到達できなかったという pshub サーバーからの応答が返されます。 .

ここにログがあります(参照ポイントのために私が追加した番号)

(1)   (0.1ms)  begin transaction
(2)  SQL (4.4ms)  INSERT INTO "feeds" ("created_at", "updated_at", "url") VALUES (?, ?, ?)  [["created_at", Fri, 15 Nov 2013 23:08:39 UTC +00:00], ["updated_at", Fri, 15 Nov 2013 23:08:39 UTC +00:00], ["url", "http://push-pub.appspot.com/feed"]]

(3) pshb subscribe parameters: {:headers=>{"Accept"=>"application/json"}, :body=>{"hub.mode"=>"subscribe", "hub.verify"=>"sync", "hub.callback"=>"http://...myserver.../pub_sub/callback", "hub.topic"=>"http://push-pub.appspot.com/feed", "hub.verify_token"=>"superfeedtest", "format"=>"json"}}

(4) # ABOUT 5 SECOND WAIT

(5) Subscribe Response: #<HTTParty::Response:0x7fd2180cd978 parsed_response="Your callback couldn't be reached.\n", @response=#<Net::HTTPUnprocessableEntity 422 Unprocessable Entity readbody=true>, @headers={"server"=>["nginx/0.8.52"], "date"=>["Fri, 15 Nov 2013 23:08:44 GMT"], "content-type"=>["text/plain; charset=utf-8"], "connection"=>["close"], "status"=>["422 Unprocessable Entity"], "x-runtime"=>["10057"], "content-length"=>["35"], "set-cookie"=>["_superfeedr_session=BAh7BzoMdXNlcl9pZGkC%2BIY6D3Nlc3Npb25faWQiJTBiMDExZGYzNzU4Mjk0MTMxNjc4NmE0OTg3MDhlMjJk--85d29756ae4b5ae9464630741372af7656f3894b; path=/; HttpOnly"], "cache-control"=>["no-cache"], "pubsubhubbub-version"=>["0.3"]}>

(6)   (7.2ms)  commit transaction
Redirected to http://67.180.177.165/feeds/28
Completed 302 Found in 10695ms (ActiveRecord: 11.6ms)

(7) Started GET "/pub_sub/callback?hub.challenge=437c4b3b47aa1dbf4072a2d8abb5c39a&hub.lease_seconds=315360000&hub.mode=subscribe&hub.topic=http%3A%2F%2Fpush-pub.appspot.com%2Ffeed&hub.verify_token=superfeedtest" for 173.255.193.75 at 2013-11-15 15:08:50 -0800

応答の後、コミット トランザクションが発生し (6)、検証を求める phsb サーバーからの GET が受信されることがわかります (7)。ハブはコールバックに到達できますが、何らかの理由で、タイムアウトになるまでハブから GET を受信しませんか?

私はレールに慣れていないので、どのように機能するかはわかりませんが、ActiveRecord の作成中にリクエストの同時実行で何かが起こっていると推測しています。サブスクリプションは単独で機能しますが、after_create で設定したため、ActiveRecord の作成中は機能しません。

ActiveRecord エントリが作成されたときに、サード パーティ サーバーへの HTTP リクエストを処理する正しい方法は何ですか?

注** superfeedr api では、検証インテントが非同期で発生するように指定できます。非同期に指定すると、代わりに成功の応答が返されますが、サブスクリプションはまだスーパーフィードのハブに作成されていないようです。この問題について直接 superfeedr に連絡しますが、一般的に、非同期オプションを持たない API でこの状況を処理する方法を知りたいです。

4

1 に答える 1