こんにちは。Takitaです。
Googleにいち早くインデックスしてもらうのはSEOを考えると重要です。このブログでは毎日sitemapを作成した後に検索エンジンに対して通知を飛ばしていますが、投稿したブログがインデックスされるまでに少し時間がかかってしまいます。ブログを投稿後にPubSubHubbubにPOSTリクエストをすればより早くインデックスしてもらいやすくなるため、今回対応してみました。
PubSubHubbub (パブサブハブバブ) とは、更新情報を Google にリアルタイムで通知することができるプロトコルです。略して、PuSH (プッシュ) とも呼ばれます。Pub は Publisher (配信)、Sub は Subscriber (購読) を意味しており、その間に Hub というサービス (中間サーバ) があるため、このような名前になっています。配信側がコンテンツを更新すると、Hub が購読側に通知を行います。購読側は更新情報をすぐに知ることができるため、リアルタイムの情報配信が実現できる仕組みになっています。
https://murashun.jp/blog/20150915-01.html
PubSubHubbubについて調べたのですが、引用させていただいた上記の記事が一番わかりやすかったので、目を通しておくと良いです。
今回実装するのはこのブログなので、記事が公開されたタイミングでPubSubHubbubに対して投稿した記事のURLをPOSTします。
URLをPOSTするだけなので自前で実装できそうですが、車輪の再発明になりそうなのでGemを探してみました。
Star数も多くPubSubHubbubが鉄板なようです。
pubsubhubbubはマストドンの人が作ってるGemで、フィードなどがある場合は使い勝手が良さそうです。
今回はPubSubHubbubとnagareboshiを比較して以下の3点の理由からnagareboshiを採用しました。
Nagareboshi::Sender.publish("http://example.com/")
でOKEventMachine.run
ですが、 Nagareboshi::Sender.publish
の方が個人的にわかりやすい(EventMachineってなんやねんと思う)nagareboshiでPubSubHubbubにPOSTする対応をした以下のコミットを簡単に説明します。
https://github.com/tackeyy/blog/commit/764a67f8b06424d17678fa4efab8901ea8b3eaf8
Gemfile
+# PubSubHubbub
+gem 'nagareboshi'
config/initializers/nagareboshi.rb
+Nagareboshi.configure do |config|
+ config.send = Rails.env.production?
+end
app/models/post.rb
+ after_create :post_pubsubhubbub
+ private
+
+ def post_pubsubhubbub
+ return if wip?
+ # modelではRailsのヘルパーが使えないので *_path じゃなくてべた書き
+ Nagareboshi::Sender.publish("#{Settings.url}/blog/#{friendly_id}")
+ end
PubSubHubbubにPOSTが成功したら204が返るので2xx系じゃなければエラーとしたり、Slack通知したりすれば良いと思います。(個人のSlackチーム作ってないし、エラーだと投稿できずにだるいのでいったん未対応です)
[1] pry(#<Post>)> Nagareboshi::Sender.publish("http://example.com/")
=> #<Net::HTTPNoContent 204 No Content readbody=true>
以上です。
上記の対応を行った後に記事を投稿して30分経っても、インデックスが確認できず・・・
以下のように site:url
でインデックスされているかの確認ができます。
site:http://tackeyy.com/blog/how-to-make-github-issue-and-pull_request-template