よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

Facebookから社内ADまで、外部サービスと連携するときに知っておくと役に立つライブラリ

外部サービスと連携すると、連携するサービスの状況に依存していろいろなエラーが発生したりします。
例えば外部サービスが高負荷であるために、タイムアウトのエラーが発生したり、強制的にコネクションをリセットされるようなエラーなど様々です。
その状況が発生した際に、利用ユーザにエラー画面を表示したり、再操作を指示するメッセージを表示するのは、ユーザ視点で考えると微妙ですね。
ではどうすればよいでしょうか?
そんなときは、retryableというライブラリ(gem)を利用するとよいです。

このretryableというgemは、名称から推測できるとおり、失敗(エラー)したときにリトライしてれるものです。
例えば、SonicGardenが提供しているサービス『youRoom』では、Facebookアカウントでログインという機能があります。
その認証に稀ではありますが以下のようなエラーが発生することがあります。
「 Errno::ECONNRESET: Connection reset by peer 」
これはFacebook側の都合で、強制的にコネクションをリセットされたというエラーです。
このようなときは、retryableを使うことで、Facebookの認証処理のところで、「 Errno::ECONNRESET」というエラーが発生したら、指定した回数だけ再試行するというロジックを簡単に実現できます。

具体的な実装は下記のREADMEやソースコード自体を参照するとすぐに分かるかと思います。
https://github.com/nfedyashev/retryable

今回の例だと、下記のようなコードになります。

retryable( :tries => 3, :on => [ Errno::ECONNRESET, TimeoutError ] ) do
  # Facebook認証処理
end

このように、実現は簡単なので、利用者にエラーを意識させないような仕組みを導入することで、
利用者にとっても開発者にとってもメリットのある仕組みをどんどん導入していきましょう。

ちなみに、SKIPでも社内ADと認証連携をするときに同様の仕組みを導入しています。