pblog

pplog.net を作っている @ppworks こと越川直人(Koshikawa Naoto)のブログ

Webサービスはヨシヨシしないとスネる

ちょっと最近構ってあげられていなかったんですね。そしたら、どうもpush通知が死んでいた模様。つまり、pplogはスネていた。

ios8関連かなーと静観していたのですが、昨日ようやく本腰で調査しました。

まずは、ポエんでみる

pplogは、herokuで運用しており、ログはAddonのpapertrailに流しております。なのでpapertrailを眺めながらポエんでみました(ポエむとはポエムを投稿すること)。すると、こんなログが

pplog app/web.1:  Too many channels (100), max 10

おやこのログは、、、

そう、このログはPusherですね。Too many channels時のエラーだ!記憶ではmax 100だったはずなので、いつの間にか仕様が変わっていたようです。

ドキュメントを見ると、

REST API Reference | Pusher

Array of one or more channel names - limited to 10 channels

確かに、書いてありますね。実はpplogでは地味ぃ〜にpusherを使っているんですね。そうです、デスクトップ通知です。各ユーザーのchannelに対して、ポエムの投稿通知をpusher経由で送っているのです。

つまり、100channelごとにpusherに通知ところを10channelに変えるべきなんですね。この時点でもはや原因が特定出来ました。本気で調べれば瞬殺じゃん。ほんとすみません。

pusherってiosandroidのpush通知関係無いよね?

そうなんです。関係無いです。

なぜpusherのエラー直すと、iosandroidのpush通知が直ったのか

ポエムの投稿通知をafter_commitでまとめて行っていたから。after_commitを使う理由は、worker(つまり別プロセス)で投稿のidを取得したいからです。

イメージとしてはこんな感じです。

    def notify(trigger)
      notify_email(trigger)
      notify_pusher(trigger)
      notify_apns(trigger)
      notify_gcm(trigger)
    end
def notify_pusher
   # channelの分だけPusher.triggerする
 Pusher.trigger(...
end

after_commitといえば、exceptionをシカトします。なので、after_commitは使いドコロはあるんですが要注意して使わないといけないです。んー。

つまり、notify_pusher内でToo many channels~エラーが起きてしまうと、以降の通知が動作しませんでした。さらにafter_commit内のPusher::Errorのため、bugsnagなどでも補足されない。

再発防止

after_commit内でのエラーを補足してbugsnagとかにちゃんと投げる。

で多分行けると思います。ツッコミ歓迎です。。。

結論

購読数が10人を超えるユーザーがポエムを投稿した場合、iosのpush通知、androidのpush通知が実行されていませんでした。ごめんね( ˘ω˘)"

ちゃんとWebサービスはヨシヨシしないとスネるのです。ちゃんと構ってあげよう。