OTOBANK Engineering Blog

オトバンクはコンテンツが大好きなエンジニアを募集しています!

Guzzleにキャッシュやリトライは任せちゃおう

曇天が続きますね。 @kalibora です。

今日は小ネタを書かせていただきます。

PHPer のみなさんは HTTP クライアントは Guzzle を使うことが多いと思います。

昔は curl をそのまま使うことも多かったと思いますが、今はあまりそういう状況も少なくなってきたのではないでしょうか。

さて、そんな Guzzle ですが、 Middleware を使っている方はどれくらいいますでしょうか。

Middleware は Guzzle を機能強化する仕組みなんですが、僕が使って便利だなと思ったものを2つばかり紹介したいと思います。

1. kevinrob/guzzle-cache-middleware

kevinrob/guzzle-cache-middleware - Packagist

RFC 7234 に準拠した HTTP Cache の機能を追加するミドルウェアです。

むしろこれを入れないと、いくらAPIなどのサーバー側で Cache-Control ヘッダを返そうが何しようが Guzzle 側ではキャッシュしません。

これを入れれば、レスポンスヘッダーに max-age があると、その間APIにアクセスしないでキャッシュしたレスポンスを使いますし、ETag などがあって 304 が返ってくれば、それもまたキャッシュしたレスポンスを使いまわしてくれます。

キャッシュストレージとキャッシュ戦略(Cache Strategy)とを自分で選ぶことができるので、だいたいどんなケースにも対応できるんじゃないでしょうか。

選択可能なキャッシュストレージ

  1. Psr16CacheStorage
  2. Psr6CacheStorage
  3. DoctrineCacheStorage
    • Doctrine\Common\Cache\Cache を使う
  4. CompressedDoctrineCacheStorage
    • Doctrine\Common\Cache\Cache を使うが、値の保存に gzcompress で圧縮を行う
  5. LaravelCacheStorage
    • Laravel用
    • Illuminate\Contracts\Cache\Repository を使う
  6. FlysystemStorage
  7. WordPressObjectCacheStorage
    • wordpress用
    • 内部で wp_cache_get などのグローバルなWP関数を使う
  8. VolatileRuntimeStorage
    • arrayを使うので、デバッグや開発時の用途かな

キャッシュ戦略

  1. PublicCacheStrategy
    • 共有キャッシュ(複数のユーザーで使い回せるもの)をキャッシュする
  2. PrivateCacheStrategy
    • プライベートキャッシュ(特定の一人のユーザーのためのキャッシュ)をキャッシュする
  3. GreedyCacheStrategy
    • 自分で設定したTTLでキャッシュする
  4. NullCacheStrategy
    • 何もキャッシュしない

2. RetryMiddleware または caseyamcl/guzzle_retry_middleware

下記の2つはどちらも通信に失敗した場合にリトライしてくれるミドルウェアです。

サーバーとの通信は不安定なので必ず成功するわけでもないですし、単純にリトライしたら成功するケースも多いかと思います。

その場合、自前でリトライ処理を書いてしまうと、インフラ的なコードがアプリケーション層に漏れ出る形になってソースコードが読みづらくなるので、こういうものに任せてしまったほうが楽ですね。

この2つのミドルウェアの違いは

  • \GuzzleHttp\RetryMiddleware
    • リトライするかどうかの判断は自前(クロージャー)で設定
      • 例えばステータスコードで判断したり、リトライ回数で判断したりすることができる
    • リトライ時のsleep時間は自前でも設定できる
      • デフォルトはリトライ回数に応じてべき乗で増える(1, 2, 4, 8, 16 ...)
  • \GuzzleRetry\GuzzleRetryMiddleware
    • リトライするかどうかの判断は自動(ただし設定である程度変更できる)
      • 下記の条件に当てはまるとリトライしない
        • max_retry_attempts (デフォルトは10)で設定した最大リトライ回数を超えた
        • retry_only_if_retry_after_header の設定で必須にしているのに Retry-After ヘッダーがない
        • retry_on_status (デフォルトは 429, 503)で設定したステータスコードではない
        • 接続がタイムアウトしたが、 retry_on_timeout(デフォルトは false) の設定がされていない
        • タイムアウト以外の接続時の例外
    • リトライ時のsleep時間は下記のように決定される
      • default_retry_multiplier (デフォルトは1.5)* リトライ回数(1.5, 3, 4,5, ...)
      • Retry-After ヘッダーがあればその値を使う

といった感じです。

Retry-After ヘッダーを吐くサーバーと通信するなら後者、そうでないなら前者といった使い分けでしょうか。

外部サービスのAPIクライアントのSDKを使っている場合でも、内部的には Guzzle を使用しているケースも多く、 そういった場合でもミドルウェアを設定すればいいので便利ですね。

(ちなみに私は Zendesk API を使用するケースで \GuzzleRetry\GuzzleRetryMiddleware にお世話になりました)

といった感じで、今日はこの辺でまた。

実家を出たので心置きなくスマートホーム化を試みた話

こんにちは、そして初めまして岩Dです。

声優の小野大輔さんを好きすぎるという訳ではないですが(いや、好きではあります)ひょんな事から岩Dと呼ばれています。
小野大輔さんと言えば、悪魔で執事も良いですが、最近だと調査兵団団長も良いですよね。でも一番好きなのは、水樹奈々さんの DISCOTHEQUE という曲の MV で踊る彼です。

ちなみに、小野大輔さんには弊社コンテンツでもいくつか朗読を担当頂いておりますので、是非ご一聴くださいませ。
https://audiobook.jp/search?q=%E5%B0%8F%E9%87%8E%E5%A4%A7%E8%BC%94

さて、前置きが長くなりましたが、オトバンクでは毎週弊社エンジニア全員が集まる場で社内勉強会をしております。 engineering.otobank.co.jp

そんな社内勉強会から今回紹介するのは、ねっしーさんが発表した『実家を出たので心置きなくスマートホーム化を試みた話』になります。

www.slideshare.net

実家を出てどうしてもやりたかった事

今年の2月に実家を出たねっしーさんですが、実家を出てどうしてもやりたかったことがあったそうで、それが..

f:id:siwadate:20190624192947p:plain

スマートホーム化して、家電の操作を楽にしたり、日々のなんとなく感じているストレスを解消するために様々なモノを導入したそうです。
(※なお、導入に際して、賃貸なので基本的には現状回復が必須で、今後の初期投資と考えて予算は特に際限は設けずに好きにやる!をモットーに進めました)

導入したモノ

そんな中今回導入、紹介してくれたのは、以下の3点になります。

  • Google Home (Google Nest Hub)
  • Nature Remo
  • Sesame Mini

Google Home

ご存知 Google Home は、Google が提供するスマートスピーカーになります。

f:id:siwadate:20190625123228j:plain

音声入力で様々な事が出来る Google Home ですが、ねっしーさんはこの様な用途で使っているそうです。

  • 天気の確認
  • タイマー
  • 時刻確認
  • 音楽、動画再生
  • テレビのオンオフ
  • 予定の確認

使っている感想としては、 90/100 点の評価で、 「(Nest Hub の様な)ディスプレイ付きのスマートスピーカーは本当に良い。もっとスマートスピーカーに依存したら各部屋に1つずつ欲しくなってしまう」と絶賛していました。
ただ、まだまだサードパーティアプリの開発があまり進んでいない様で、そこが残念だと感じている様です。

ちなみに、弊社も Google Home 向けにコンテンツを提供しているので、スマートスピーカー持ってるけど使い道に困っている!という方は是非一度お試しください。偶然なことにねっしーさんがメインで開発したコンテンツになります(すっとぼけ)。
https://pages.audiobook.jp/lp/google-home/
(※Google Home Mini プレゼントキャンペーンは終了しております)

Nature Remo

Nature Remo (以下Remo)は、家電をインターネットに繋げて手軽にスマートホームを実現するスマートリモコンです。

f:id:siwadate:20190625123220j:plain

この Remo は、赤外線リモコンを一括管理したり、スマートスピーカーと連携することで音声入力での家電操作、内蔵している各種センサーにより自動でエアコンを付けて室温管理をしたりなどができるそうです。

こんなに色々とできる Remoですが、使った評価としては 40/100 点とかなり低めな判定でした。
理由としては、Remo から対象機器に対して赤外線の届く範囲でしか操作出来ないので、各部屋ごとにこれを設置しないと有効に活用ができない事と、何より一番使いたいと思っていた照明に非対応だった事が要因だった様です。なので、「テレビつけて」くらいしか今の所うまく使えていないそうです。意外な盲点でしたね。

Sesame Mini

Sesame Mini (以下Sesame)は家のドアのサムターン部分に取り付けるタイプの電子錠です。「オープンセサミ!」のアレですね。

f:id:siwadate:20190625123227j:plainf:id:siwadate:20190624195800p:plain

これは、Bluetooth でスマートフォンと連携する事で使える電子錠になります。 取り付けが簡単で、国内のほぼ全てのサムターンに対応可能なのだそうです(もし取り付けができなかった場合は、サポートに連絡すればアタッチメントを無料で作成・送付してくれるそうです。すごい!)。
また、スマートスピーカーとの連携や、Web API での開発でカスタマイズしたりなどもできる様です。

用途としては、物理鍵の代用だけでなく、特定の人に対してキーシェアをしてパーティなどの時に家の出入りを便利にしたり、住人の出入り閲覧などができるので子供が帰ってきた事を外出先で確認できたり、また最近ではオフィスやレンタルルームでの鍵として使われる事もあるそうです。

そんな Sesame ですが、ねっしーさんの評価はなんと 120/100 点ととても満足している様です!
「便利すぎてもう物理鍵には戻れない」とのこと。鍵をカバンの中から探さなくて良かったり、家を出て駅に向かうまでで施錠ができたり、外出先で施錠確認がでたり、鍵を持たずに外出できたりなどがとても良いポイントなのだそうです。

ただ、スマートフォンを無くしたり家に忘れたり、充電がなくなった場合はどうするのか?という問題については、その時は物理鍵を外に隠しておいたり、電池が切れたら自動で解錠する様な設定をすれば家に入れない問題はクリアできるので大丈夫とのこと。

まとめ

今回、スマートホーム化を進めた事で電源の数が足りなくなる問題や、工事のために免許が必要だったり、同居人がそこまで乗り気じゃない?等障害はあったものの、ねっしーさんはそれらを跳ね除けなんとかスマートホーム化の第一歩を踏み出せた様です。

このプレゼンの中で、「以前実家にいた頃、母にプレゼントで購入した Google Home mini を使ってくれなかった経緯があった事もあり、同居人に(こういう新しい試みを)浸透させるにはまず自分が使って便利さを示せたらうまく使ってくれるのではないか」と言っていた事が印象に残りました。
私も、家電が大好きで新しい家電を同居人に納得してもらって買うために、家電の良さ等のプレゼンをしたりしているのでその辺り共感できました。

そして、そんなねっしーさんの次の野望はルンバを導入する事だそうです。
また環境が整った時にスマートホームがどうなっているかの話を聴きたいですね。

それでは。

勉強会LTはじめました(はじめてました)

今年のフジロックは4日間テント泊にしようと目論んでいる @kalibora です。こんにちは。

さてさて、開発部やそれに類する開発チームで、週1くらいの頻度でミーティングしている組織は多いのではないかと思いますが、 みなさま、どんなアジェンダでミーティングしているのでしょうか?

  • ビジネスとは少し離れた技術的な観点での問題点の話し合い
  • 設計に関する議論
  • 最近の障害の共有

などなど、色々あるかと思います。

弊社ではその開発ミーティングの冒頭15分〜30分間ほど、勉強会と題して開発メンバーの持ち回りでLTのようなことをやっております。

どういった内容のLTをしているかと言うと、特にお題は設けず、ざっくばらん。各メンバーに任せる。としたので 本当にざっくばらんです。一例を挙げると下記のようなお題がありました。

f:id:kalibora:20190624165144p:plain

えーっと、、ユークリッドの互除法からSplatoonまで!幅広く取り揃えております。

このあたりは本当に各メンバーの色が出て面白いところです。

  • そのメンバーが何に興味があるのかを知ることが出来る
  • 自分と興味が被っていなければ、普段とはぜんぜん違う勉強になる
  • 遊びに関するものでも、なぜそれにハマっているのか?ハマる仕組みはなんなのか?などビジネスのヒントになる

と、当初思ってなかったようなメリットもあったので、わりとゆる〜い雰囲気でLTやってみるのも良いのではないかと思っております。

はい。そしてせっかくなので、

「その資料や内容などもブログで公開していけるといいよね〜。」

なんていう流れになったので、今後はこのブログ上で公開していこうと思います。

どうぞみなさま、お手柔らかに。