Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Cookpad summer internship 2019 - API
Search
Ken Wagatsuma
August 21, 2019
Programming
0
10k
Cookpad summer internship 2019 - API
A lecture slide for
https://internship.cookpad.com/2019/summer/
(Day 3 ).
Ken Wagatsuma
August 21, 2019
Tweet
Share
More Decks by Ken Wagatsuma
See All by Ken Wagatsuma
Pregel Graph Compute Engines - Supersteps Exampls
kenju
1
200
Kafka on Kubernetes with Strimzi
kenju
1
140
AWS DynamoDB Accelerator (DAX) 101
kenju
3
6.9k
Moden browser introduction
kenju
1
360
Introduction to Design Patterns
kenju
0
66
GraphQL Asia 2019 "Re-architecture of a decade-old app with BFF/GraphQL"
kenju
0
8.8k
Introduction to TypeScript
kenju
0
670
Introduction to Programmatic Ad
kenju
0
220
社内管理システムのための技術選定
kenju
0
740
Other Decks in Programming
See All in Programming
Contemporary Test Cases
maaretp
0
140
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
860
cmp.Or に感動した
otakakot
2
150
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
900
Macとオーディオ再生 2024/11/02
yusukeito
0
370
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
610
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
azuki
2
120
as(型アサーション)を書く前にできること
marokanatani
10
2.6k
Arm移行タイムアタック
qnighy
0
320
弊社の「意識チョット低いアーキテクチャ」10選
texmeijin
5
24k
Jakarta EE meets AI
ivargrimstad
0
610
型付き API リクエストを実現するいくつかの手法とその選択 / Typed API Request
euxn23
8
2.2k
Featured
See All Featured
Visualization
eitanlees
145
15k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Side Projects
sachag
452
42k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
120
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
What's in a price? How to price your products and services
michaelherold
243
12k
It's Worth the Effort
3n
183
27k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
Site-Speed That Sticks
csswizardry
0
24
A Modern Web Designer's Workflow
chriscoyier
693
190k
Transcript
Cookpad Internship 2019 10 Day Tech: API Kenju Wagatsuma KOBA789
Yoshiaki Yamada
今日は API です • 講師 ◦ @kenju_wagatsuma • TA ◦
@KOBA789 ◦ @ymd
講師: @kenju_wagatsuma • 我妻 謙樹(Kenju Wagatsuma) • メディアプロダクト開発部マーケティングサービス開発グ ループ •
広告配信サーバー・入稿システム・リアルタイムログ基盤等 広告にまつわるシステムの保守運用
広告関連システム概要 Operation Team Data Warehouse Ad Creative Optimization Ad Campaign
Ordering Service Ad Delivery Service Targeting Service Delivery Metadata Mobile Client Ad Creatives log
Linux OS Docker, Terraform, Jenkins DevOps Nginx, Fluentd, ELB Infra
Ruby Rails TypeScript React.js GraphQL Apollo Ruby Rails Go AWS ElastiCache AWS DynamoDB Service Mesh Envoy Python AWS APIGateway AWS Lambda Tableau Application SQL AWS Redshift AWS Athena Ruby Python AWS Kinesis AWS DynamoDB AWS Lambda Batch Layer Streaming Layer Ad creative admin service Ad delivery service Logging Machine Learning 広告関連システム選定技術一覧
TA: @KOBA789 • 平成7年8月9日生まれで789 • ビッグデータをいい感じにする仕事(それ以外もやる) • データベース・トランザクション・分散システム • 代表作:
Prism(分散ログストレージ) • よく書く: Java, Rust, TypeScript
TA: @ymd • 山田 良明 • 研究開発部エンジニア • LambdaとDynamoDBを使ってスマートスピーカー 向けサービスを開発しています
Timeline • 1000-1130 講義パート A(基礎編) • 1130-1300 Handson • 1300-1400
ランチ • 1300-1400 講義パート B(応用編) • 1400-1830 Exercise ※ 休憩は各位適宜取得してください
tl;dr • Backend-For Frontend(以下:BFF) を Node.js / GraphQL / TypeScript
を使って開発します • 現場の実際の開発にかなり近い開発体験を経験することが できます
NOTE • ハンズオン編は zoom で画面共有します ◦ WiFi 接続速度によって柔軟に対応しましょう • 後日インフラの日に触れる技術要素は
Blackbox で行きま すので心配しないでください ◦ e.x. hako, SAM, DynamoDB, facebook/dataloader, etc.
講義パート A(基礎編)
講義パート A(基礎編)でやること • 基礎技術詳解をします ◦ BFF ◦ GraphQL
Keywords • Microservices • レガシーと新システムの両立 • Ruby/Rails だけでない、幅広い技術選定 • Serverless
BFF
BFF at Cookpad https://techlife.cookpad.com/entry/2019-orcha-bff
What’s BFF? • Pattern: Backends For Frontends by Sam Newman,
the author of “Building Microservices” • Definition: “Single-purpose Edge Services for UIs and external parties” https://samnewman.io/patterns/architectural/bff/
One of “API-Gateway” Patterns https://microservices.io/patterns/apigateway.html BFF は API-Gateway Patterns と呼ばれる設計パ
ターンの一種。 ※ RESTful API / GraphQL は実装の詳細である。 GraphQL だけが BFF では ない点に注意。
Legacy New BFR Backend for Resource Frontend Resource Resource Legacy
Usecase New Usecase
Legacy New RESTful API, GraphQL Schema BFR Backend for Resource
BFF Backend for Frontend Frontend Resource Resource Legacy Usecase New Usecase
GraphQL
About GraphQL • API のためのクエリ言語の仕様 • Facebook で 2012 年から開発され、2015
年に OSS 化、そ の後 GraphQL Foundation が設立されるなどコミュニティも 拡大 • JavaScript や Ruby を始めとした実装多数
BFF x GraphQL 以下の Backend Resources を Client に対 して隠蔽する設計パターン
• RDBMS/NoSQL などの Datasource • 新規システム • 既存システム • 3rd-Party API https://www.howtographql.com/basics/3-big-picture/
schema.graphql • 型とクエリ操作を定義した宣言ファイル • 手動で書く場合、DSL から自動生成する場合(e.g. graphql-ruby)、型定義から自動生成する場合(e.g. graphql-codegen)などのパターンが有る
Query • データを取得するための操作を定義 • 欲しいデータの、欲しいフィールドを宣言的に書く ▪ 利点 • Over-fetching /
Under-fetching を防ぐ • クライアント開発において欲しいデータを宣言的 に書けることで保守性が向上
Mutation • データの作成・削除・更新など副作用をもたらす操作を定義 • RESTful API で言うところの POST/DELETE/PUT/PATCH に相当することが多い
Introspection • GraphQL server に対して、どのような型システムやクエリ操 作を提供しているかを問い合わせるための、GraphQL の仕 様 • デバッグや
docs 生成、ツール作成時等に多様 • スキーマ、型、フィールド情報などが取得できる
具体例 実際の API を利用して具体例を見せます • schema.graphql • GraphQL Playground •
Query Example
Handson
Handson でやること • アプリのシステム概要を紹介します • ハンズオン演習内容を発表します
pantry Koresuki (Likes) BFF (GraphQL) Schema pantry AWS API Gateway
Mobile Client AuthoCenter AWS Lambda AWS DynamoDB voyager user backend
System Architecture
クライアント側仕様 • シンプルな mini Cookpad を実装します ◦ レシピ一覧 ◦ レシピ詳細
◦ いいね一覧
クライアント側仕様 • Cookpad 本体アプリも利用している同等の Backend Service を利用します ◦ “pantry” と呼ばれる
• 「いいね」機能はフルスクラッチで実装します ◦ AWS サービス群を利用した Serverless 構成
List Detail Likes
pantry Koresuki (Likes) BFF (GraphQL) Schema pantry AWS API Gateway
Mobile Client AuthoCenter AWS Lambda AWS DynamoDB voyager user backend BFF & Koresuki を 実装します
前提条件 以下の新システムを開発する • BFF Application ◦ pantry & Koresuki へのリクエスト
• Koresuki Application ◦ 「いいね」機能の実装
制約条件 以下の既存システムは実装を加えることができない • pantry ◦ pantry が提供する API を使うしか無い •
AuthoCenter ◦ 認証フローを拡張することはできない
“Simple” !== “Easy” • Likes の状態はどうやって保存する? • pantry と Koresuki
の結果をどう JOIN する? • GraphQL のキャッシュが必要になったらどうしたらよい? • 認証 (Authorization) に失敗したときは何を表示する? • pantry が死んだ時の retry 戦略はどうする? • Koresuki はどうスケールさせる? • NoSQL におけるインデックスはどう貼る? • 非機能要件をどこまで実装できる? • ID Token の検証が Bottleneck になった時、どこを改善する? • etc.
関連システムの解説
Systems • Pantry • AuthoCenter • AWS API Gateway •
AWS Lambda • AWS DynamoDB
Pantry • Cookpad レシピサービスのリソースを HTTP で操作するた めの API Server •
May 2013~ から開発スタートされた Rails app • レシピ一覧、レシピ詳細、カテゴリ一覧、殿堂入りレシピ、検 索、人気順、... etc.
Pantry • 実際の Cookpad で利用されている「本物」です • Summer Internship 用に、インフラ定義だけ変えた Staging
版を deploy しています
AuthCenter • OAuth2 認可を行うための Web application • RFC 6749 (The
OAuth 2.0 Authorization Framework) に 則った基本に加え、固有の拡張がいくつか存在する • アクセストークンの発行, アクセストークンの検証
AuthoCenter(通称:大嘘センター) • @KOBA789 謹製, Rust 製 • Summer Internship 用に作られた
AuthCenter を模した Web application • 任意の user_id を渡すと ID Token が発行される
ID Token • JSON Web Token (JWT) を署名したもの ◦ RFC7519
• 署名方法 ◦ JSON Web Signature (JWS) RFC7515 ◦ JSON Web Key (JWK) RFC7517
ID Token header body signature . . Base64 Encode された
JSON Web Token (JWT) { “iss”: “https://….”, “sub”: “16672509”, .... } ※ JWS で JWT を署名した形式
AWS API Gateway • HTTP な RESTful API のためのマネージドサービス •
Canary Release や認証機能等 API 開発には欠かせない機 能提供の他、CloudWatch と連携した Logging/Monitoring/Alerting などが有用
AWS Lambda • サーバー環境のセットアップなしに、任意のプログラムを実 行できるマネージドサービス • ビジネスロジックの開発に集中することができる • Java/Go/PowerShell/Node.js/C#/Python/Ruby の言語を
Native でサポート
AWS DynamoDB • Amazon で高可用性・拡張性を兼ね備 えた分散 KVS として開発された Dynamo の商用版
• ショッピングカート機能のバックエンド などに利用
Handson
Handson • 以下の内容に沿って解説していきます ◦ ghe.ckpd.co/pages/tech/2019-summer-internship/api
講義パート B: 応用編
講義パート B: 応用編でやること • ハンズオン応用編の内容を紹介します • ハンズオン応用編を進めるにあたって必要な技術を解説し ます
Keywords • More GraphQL Specification • Error Handling w/ GraphQL
• Relay Cursor Connection • Kill N+1
More GraphQL Specification https://ghe.ckpd.co/pages/tech/2019-summer-internship/bff/graphql_tips • Null / Non-Null •
Interface • Union • Scalar • Enum • Directive
Error Handling w/ GraphQL • HTTP Status = 200 OK
のまま、“errors” にエラーの Stack traces を含める ◦ https://graphql.github.io/graphql-spec/June2018/#sec-Errors • あくまで Best Practices(apollo-server や graphql-ruby など 多くのツールが従っている)
Error Handling w/ GraphQL • 理由 ◦ 例)pantry へのリクエストがエラーになったからって、他 の
Backend Resources からのレスポンスなど全ての フィールドが エラーになると、GraphQL を BFF としてら 使う旨味が半減 ◦ 返せるものは返す
例) 前提条件 • “name” field が Non-Null • id=1002 のデータは、”name”
field が Null 結果 • id=1001, 1003 の結果は返却され る • “errors” field に id=1002 のデー タが取得できない理由を格納。ど う処理するかはクライアント次第
Relay Cursor Connection • https://facebook.github.io/relay/graphql/connections.htm • Pagination に関する Practice の一つ
• GraphQL Framework の一つであり、Facebook が主だって 開発している Relay で実装されている • Connection/Edge/Node/PageInfo
Example) • edges ◦ edge (node + cursor) の配列
• cursor ◦ カーソル。一連の Edges にアクセス する際の現在位置を表現 ◦ String に serialize 可能な型 • node ◦ Pagination で返却したいデータ • pageInfo ◦ hasNextPage & endCursor ◦ hasPreviousPage & startCursor
graphql/dataloader • Caching ◦ 同じ Request Parameters のレスポンス結果は、リクエス トごとにキャッシュして再利用 •
Batching ◦ Promise (JavaScript の標準 API)を利用して resolver を遅延評価、同じリクエストは一括処理(batch)する
実践パート B: Exercise
総括
総括 • 総括 by TA • 総括 by 講師
Thank you!