ちょっと最近構ってあげられていなかったんですね。そしたら、どうもpush通知が死んでいた模様。つまり、pplogはスネていた。
最近 pplog の通知が飛んでこなくなってしまった
— ぺこちゃん (@ryopeko) 2014年10月16日
@ken_c_lo #pplog で購読してる人たちのポエム更新push通知がトドカナイ疑惑
— イカID: 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などでも補足されない。
@willnet さんからのコメント頂きました。ありがとうございます。
Rails 4.2 からは config で設定すると、after_commit のエラーをシカトしなくなるみたいですよ( ˘ω˘) https://github.com/rails/rails/pull/16537/files
トランザクション完了後のエラーを発生させるとなると、適切な補足が必要だなーと感じます。opt-inなのもそういう理由だからかなと思います。
今回の件で、ActiveRecordのcallbackのうち、after_roollback/after_callbackは慎重な扱いが必要だと実感しました。
再発防止
after_commit
内でのエラーを補足してbugsnagとかにちゃんと投げる。
で多分行けると思います。ツッコミ歓迎です。。。
結論
購読数が10人を超えるユーザーがポエムを投稿した場合、iosのpush通知、androidのpush通知が実行されていませんでした。ごめんね( ˘ω˘)"
push通知直ったよ。ごめんね( ˘ω˘)"
— ポエム (@pplog_net) 2014年11月1日
ヨシヨシとは
ちゃんとWebサービスはヨシヨシしないとスネるのです。ちゃんと構ってあげよう。
では、ヨシヨシとは何か。構ってあげることです。気にかける、とも言えるでしょう。
Webサービスのヨシヨシには、
- 自身がユーザーとして使う
- 常に最新のgem群を使う
- ログを眺める
- GAを見る
- 褒める
みたいなことが挙げられます。自分のWebサービスがなかったとしても、Web業界で働いていると何かしら自分が関わるサービスがあるはずです。そのサービスをヨシヨシしましょう、可愛がりましょう。Webサービスは生き物です。性格にもよりますが、適切な距離感で気にかけてあげることはとても大事だと思います。こうしたことは、仕事でも心がけたいですね。そう、愛せるWebサービスに関わろう。