Goにおける API Client実装パターン / API Client implementation pattern in Go

Df3136f800e7ed9931ed5f9f1afad935?s=47 mtskhs
October 28, 2019

Goにおける API Client実装パターン / API Client implementation pattern in Go

Go Conference 2019 Autumn における登壇資料(Level:Beginner)です。

- マイクロサービスアーキテクチャによる開発が普及してきている現在、REST APIにおけるHTTPリクエスト処理が求められる場面は多い。その際、APIリクエストに関する重要な概念を理解し、Clientとして適切に実装することが求められる。

- 本発表では、マイクロサービス間のデータ連携システムを開発・運用した経験を持つ発表者が、HTTPリクエスト処理に関する「重要な概念とGoにおける実装パターン」や「よくある実装パターン」について述べる。

- Goにおけるテストについては、 [AgileTestingDays2018に参加して、Goにおけるテストノウハウを整理した](https://qiita.com/matsu0228/items/c9f69b036f0ab47b617e) 記事もおすすめです。

Df3136f800e7ed9931ed5f9f1afad935?s=128

mtskhs

October 28, 2019
Tweet

Transcript

  1. 2.

    About me 松木久幸 @mtskhs Backend Engineer Gopher Dojo 1期生 2

    Service • EC @ NTT Resonant • スポーツAI解説アプリ(SpoLive) @ NTT Communications Interest • Agile (シリコンバレーで3ヶ月働いて 体感した自律型組織のススメ) https://speakerdeck.com/matsu0228/organizationtheory-of-engineering • Agile Testing Days 2018 レポート https://speakerdeck.com/matsu0228/report-of-agiletestingdays2018
  2. 6.

    Bad Example of API Client 考えるべきこと 6 • エラーコード(200 OK以外)が返

    却されたら? • ネットワークが一時的に切断され たら? • 利用するAPIが複雑化(認証が追 加される・リクエストの種類増える 等)したら? • `net/http` を使えば簡単?!
  3. 7.

    Contents 1. 重要な概念とGoにおける実装 1.1. エラー時のリトライ処理 1.2. 冪等性の担保 1.3. RequestOptionsを用いた汎用的な設計 2.

    よくある実装パターン 2.1. JSON decode pattern 2.2. 認証 2.3. Test設計 7 Sample Code : https://github.com/matsu0228/apiClientExample-GoConference2019Autumn
  4. 12.

    Idempotency - 冪等性の担保 よくある事例 • 100件のPOST通信のうち90件は成功・10件失敗した場合、 すでに処理済みのものを再度POSTしたら、処理済エラーが返却され てバッチがコケる • サービスAへの処理は成功したが、サービスBへの処理は失敗した

    (RDBでいうトランザクション) 解決策 • 手元で、処理IDと処理ステータスをもたせる ◦ 成功した90件: 処理済 / 失敗の10件: 未処理のまま ◦ サービスAは成功 / Bは未処理 (リトライ or Aの取り消し) 12
  5. 13.

    Highly scalable design - 汎用的な実装 • request生成時に考えること ◦ ドメインは初期設定 +

    リクエスト毎にURL Path設定 ◦ 各リクエストに、共通のHeader追加 ◦ リクエストごとに、固有のHeader追加 13
  6. 17.

    Contents 1. 重要な概念とGoにおける実装 1.1. エラー時のリトライ処理 1.2. 冪等性の担保 1.3. RequestOptionsを用いた汎用的な設計 2.

    よくある実装パターン 2.1. JSON decode pattern 2.2. 認証 2.3. Test設計 17 Sample Code : https://github.com/matsu0228/apiClientExample-GoConference2019Autumn
  7. 26.

    Testing strategy 26 refer from: https://deeeet.com/writing/2016/10/25/go-interface-testing/ “Symmetric API Testing” •

    レスポンス結果をローカルディスクに保存 • テストに上記ファイルを利用して試験(httptestレスポンスとして設定する等)