読者です 読者をやめる 読者になる 読者になる

猫の魔法

主にruby系の技術メモを記載

個人的メモ:Rails AntiPatterns(5)

CHAPTER 5 Services

  • ここで言うサービスとはサービスクラスのそれというよりAPIやウェブサイトと言った外部が提供or外部に提供する物の総称の事。

AntiPattern: Fire and Forget

  • 外部のAPIを呼ぶ際に、「例外返却される可能性があるメソッド」の例外を取得しないことによって発生する問題。
  • 本来であれば無視したい例外を無視出来なくる。

Solution: Know what Exceptions to Look Out For

  • とりあえず全部rescueして、何もしないというのが一番簡単
    • だがその場合、本当の例外も全部消えてしまう。
  • どのような例外が発生するか調べて、rescueする必要がある例外を配列の定数に持つ
    • 必要な例外のみを無視出来る。万が一見落としがあったとしても配列にその例外を追加するだけで足りる。
  • 例外が調べられないような場合は分かっている最低限の例外だけをrescueする。
    • このような場合は、未知の例外が発生を追えるように、ロギングする事が大切。

AntiPattern: Sluggish Service

  • 応答が遅い外部サービスによりアプリケーション全体が上手く動かなくなる問題

Solution: Set You Timeouts

  • Net::HTTPライブラリを使っている場合、デフォルトタイムアウトが60秒なので、これを短くすることで、アプリケーション全体の問題から局所的な問題へと置き換えることが出来る。
    • ようは待ち続けてコネクションプールが枯渇するというような致命的な問題をさけられるよという話だと思った。

Solution: Move the Task to the Background

  • 処理を非同期にしてしまう。
  • バックグランド処理をする仕組みとしてdelayed_jobを使うのがよい

AntiPattern: Pitiful Page Parsing

  • APIみたいのが提供されておらず、サイトのHTMLを解析するような処理が必要な場合、正規表現でそれを実装すると容易に壊れてしまう問題

Solution: Use a Gem

  • Nokogiriというgemを使って解析するとよい
    • XPath,CSS3セレクタを介してHTMLとXMLを検索するパーサー
    • rails使うと標準でインストールされるが、このような仕組みだとは知らなかった。もう少し詳しく調査したい

AntiPattern: Successful Failure

  • API等で外部に応答するシステムの場合、エラーの際にその応答にエラーコードを返すようなシステム(エラーが発生したかどうかは応答をパースする必要がある)

Solution: Obey the HTTP Codes

  • エラーの場合は適切なHTTPレスポンスコードを返すようにする。
    • RESTfulなAPIだとこれはその通りという感じ。
  • 画面であってもエラーの際に正しいレスポンスコードを返すのは重要。例えば認証エラー等は401を返すべき。

AntiPattern:Kraken Code Baseの手前まで読了

関連

個人的メモ:Rails AntiPatterns(一覧) - 猫の魔法