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だったはずなので、いつの間にか仕様が変わっていたようです。

ドキュメントを見ると、

HTTP API reference | Pusher

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通知が実行されていませんでした。ごめんね( ˘ω˘)"

ヨシヨシとは

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

では、ヨシヨシとは何か。構ってあげることです。気にかける、とも言えるでしょう。

Webサービスのヨシヨシには、

  • 自身がユーザーとして使う
  • 常に最新のgem群を使う
  • ログを眺める
  • GAを見る
  • 褒める

みたいなことが挙げられます。自分のWebサービスがなかったとしても、Web業界で働いていると何かしら自分が関わるサービスがあるはずです。そのサービスをヨシヨシしましょう、可愛がりましょう。Webサービスは生き物です。性格にもよりますが、適切な距離感で気にかけてあげることはとても大事だと思います。こうしたことは、仕事でも心がけたいですね。そう、愛せるWebサービスに関わろう。