株式会社ジェニュインブルー解散及び清算のお知らせ

これまで株式会社ソニックガーデンのギルドメンバーとして株式会社ジェニュインブルーを立ち上げ、納品しない受託開発により複数のスタートアップ企業様のシステム開発に携わって参りました。

この度、パートナー企業様のビジネスの発展に伴いそれぞれのサービスが私の手から離れたタイミングで会社を清算することになり手続き中です。なにより携わったサービスがみな順調であることは嬉しい限りです。

直接ご挨拶が出来なかった方も多いのですが、これまでご愛顧賜りました皆様に心より感謝申し上げます。

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サービスに関わろう。