ちょっと最近構ってあげられていなかったんですね。そしたら、どうもpush通知が死んでいた模様。つまり、pplogはスネていた。
最近 pplog の通知が飛んでこなくなってしまった
— 複数DB (@ryopeko) 2014, 10月 16
@ken_c_lo #pplog で購読してる人たちのポエム更新push通知がトドカナイ疑惑
— Toshiwo (@toshiwo) 2014, 10月 28
ios8関連かなーと静観していたのですが、昨日ようやく本腰で調査しました。
まずは、ポエんでみる
pplogは、herokuで運用しており、ログはAddonのpapertrailに流しております。なのでpapertrailを眺めながらポエんでみました(ポエむとはポエムを投稿すること)。すると、こんなログが
pplog app/web.1: Too many channels (100), max 10
おやこのログは、、、
そう、このログはPusherですね。Too many channels時のエラーだ!記憶ではmax 100だったはずなので、いつの間にか仕様が変わっていたようです。
ドキュメントを見ると、
Array of one or more channel names - limited to 10 channels
確かに、書いてありますね。実はpplogでは地味ぃ〜にpusherを使っているんですね。そうです、デスクトップ通知です。各ユーザーのchannelに対して、ポエムの投稿通知をpusher経由で送っているのです。
つまり、100channelごとにpusherに通知ところを10channelに変えるべきなんですね。この時点でもはや原因が特定出来ました。本気で調べれば瞬殺じゃん。ほんとすみません。
pusherってiosとandroidのpush通知関係無いよね?
そうなんです。関係無いです。
なぜpusherのエラー直すと、iosとandroidの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通知が実行されていませんでした。ごめんね( ˘ω˘)"
push通知直ったよ。ごめんね( ˘ω˘)"
— pplog (@pplog_net) 2014, 11月 1
ちゃんとWebサービスはヨシヨシしないとスネるのです。ちゃんと構ってあげよう。