Slide 1

Slide 1 text

All rights reserved by Postman Inc Postmanの中の人が APIテクノロジー視点で Momento を語る 川崎庸市 Postman株式会社 Presentation slides for もめんと Meetup #8

Slide 2

Slide 2 text

テクノロジーエバンジェリスト Postman 株式会社 川崎 庸市 @yokawasa @postman_japan

Slide 3

Slide 3 text

今日のプレゼンはこちらを真似てライブリアクションアプリ でやらせていただきます。内部でMomento Topics活用 https://www.gomomento.com/blog/building-an-interactive-live-reaction- app-with-next-js-and-momento リアクションはこちらから

Slide 4

Slide 4 text

スマホゲーム Postman: API-First Journey @postman_japan

Slide 5

Slide 5 text

スマホゲーム Postman: API-First Journey @postman_japan モノリスから脱出し API を集め API-First の旅へ バグ API 500 Internal Server Error

Slide 6

Slide 6 text

スマホゲーム Postman: API-First Journey @postman_japan 私たちが情熱を傾ける API、ソフトウェア開 発、ゲームを組み合わせて、新しいゲーム 体験を Postman で作ってみました! このゲームを遊べるシーン Eメールで済ませるべきだっ た退屈な会議中 オンラインで処理すべき書類 手続きに並んでいる間 コードがビルドされるのを待 つ間 電気自動車の充電を待つ間

Slide 7

Slide 7 text

2023年 API アーキテクチャスタイルの利用率 RESTが支配的。ただし 2021年 92% → 2023年 86%と徐々に減少傾向。続いて Webhook。SOAP利用率は昨年と比べ 34% → 26%と減退、GraphQLがその利用率を抜いた。その後に Websockets、gRPC、MQTTが続く。 REST Webhook GraphQL SOAP Websockets gPRC MQTT AMQP SSE EDI EDA https://www.postman.com/state-of-api/api-technologies Postman 2023 State of the API Report

Slide 8

Slide 8 text

2023年 API Spec(仕様) の利用・認知度 JSONスキーマが断トツ。続いて Swagger/OpenAPI 2.0 → OpenAPI 3.X → GraphQL。APIアーキテクチャ利用率との 関連性が高い。 JSON Schema Swagger 2.0 OpenAPI 3.X GraphQL WSDL AsyncAPI Protobuf Avro API Blueprint RAML RDF/SPARQ Thrift 聞いたことがない 知ってはいるけど 使っていない 使っている 使っている & 気に入ってる https://www.postman.com/state-of-api/api-technologies Postman 2023 State of the API Report

Slide 9

Slide 9 text

それではAPIテクノロジー視点で Momentoサービスをみていくよ

Slide 10

Slide 10 text

Momentoサービス https://docs.momentohq.com/ja/ Momento

Slide 11

Slide 11 text

認証 ● API KeyとToken認証の2種類 ○ API KeyはMomentoコンソールで発行 ○ Tokenはコードで権限、有効期限指定して生成 ● 中身はbase endpointとJSON Web Token (JWT) Momento const permissions = { permissions: [ {role: CacheRole.ReadWrite, cache: {name: 'myCache'}}, { role: TopicRole.PublishSubscribe, cache: 'myCache', topic: 'myTopic', }, { role: TopicRole.SubscribeOnly, cache: 'myCache', topic: 'myTopic', }, ], }; const [scopedToken, scopedRefreshToken] = await generateApiKey(mainAuthClient, permissions, 3600); 権限と有効期限を指定したトークン生成 JWTの中を覗く { "endpoint": "cell-ap-northeast-1-1.prod.a.momentohq.com", "api_key": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ5b2thd2FzYUBnbWFpbC5jb20i LCJ2ZXIiOjEsInAiOiJFazBLRVFvUENBRWFDUW9IYlhsRFlXTm9aU0l BQ2dnS0JSZ0NFZ0FpQUFva0VpSUlBUm9RQ2c1MGFHVXRaM0ps WVhRdGQyRnNiQ29NQ2dwb2FXZG9iR2xuYUhSekNnZ1NCZ2dDR WdBaUFBPT0iLCJleHAiOjE3MDMyMDEyOTR9.Ws9j8GZ9WnYgwt7 XWHfu1h5XaM2H2iUoT3GPTKTrW-Y" } Base64 decode { "sub": "[email protected]", "ver": 1, "p": "Ek0KEQoPCAEaCQoHbXlDYWNoZSIACggKBggCEgAiAAokEiIIARo QXg50aGUtZ3JlYXQtd2FsbCoMCgpoaWdobGlnaHRzCggSBggCEg AiAX==", "exp": 1703201294 } Base64 URL decode JWT payload

Slide 12

Slide 12 text

Client/Serverモデル + 2種類のAPIアーキテクチャ ● gRPC ● REST (JSON API over HTTP) Momento

Slide 13

Slide 13 text

gRPC ● Googleが開発したRPCフレームワーク ● transportにHTTP/2を使うので高いスループットや高速双方向ストリーミングが可能 ● データのシリアライズにProtocol Buffersが使える (protobuf縛りではない) ● IDL(インターフェース定義言語)として.protoファイルとしてAPI仕様を定義し、サーバー&クライ アントに必要なソースコードのひな形を生成する What is gRPC? https://grpc.io/docs/what-is-grpc/introduction/ Momento

Slide 14

Slide 14 text

特徴 gRPC REST プロトコル HTTP/2 典型的にはHTTP/1.1。HTTP/2も使えるけど HTTP/2の双方向のストリーミング通信の利用は できない データフォーマット バイナリ(主にProtocol Buffers) テキストベース(JSON, XMLなど) パフォーマンス 高速、より効率的(HTTP/2の利点とバイナリ 形式のおかげ) 比較的遅い(テキストベースのデータとHTTP/1.1 の限界のため) ストリーミング リクエスト・レスポンス型、双方向ストリーミン グをサポート 一般にリクエスト/レスポンスモデルに限定 敷居の高さ ブラウザサポート限定的 周辺エコシステムがRESTほどそろってない ブラウザサポート広範 広範囲なツール、ライブラリサポート I/F 定義 Protocol Buffersを使用して厳格に定義 よりルーズでドキュメントに依存することが多い

Slide 15

Slide 15 text

SDKが実現する驚くほどシンプルな利用体験 ● 全てのサービス管理・データ操作処理の通信でgRPC ● 多言語でSDKが用意されていて、これを使うことでgRPCを意識する必要はない。面倒なこと(認証、 フレームワーク、通信の回復性機能(Timeout、Retries、backoffなど)のベースラインの処理)は すべてSDKがやってくれる ○ https://www.gomomento.com/blog/shockingly-simple-cache-clients-that-do-the-hard-work-for-you ● 利用シナリオに応じたプリビルドな設定パターンも用意されてる ○ https://docs.momentohq.com/cache/develop/basics/client-configuration-objects 興味があればこちらも是非 ● I/F定義 (.proto) ○ https://github.com/momentohq/client-protos/tree/main/proto ● SDKチューニングの話 ○ https://www.gomomento.com/blog/shockingly-simple-tuning-the-momento-javascript-cache-client Momento

Slide 16

Slide 16 text

REST / HTTP API ● Momento Cache(CRUD)、Topicsのpublish用処理にHTTP APIが提供されてる ● SDKが使えない制約のある環境ではHTTP APIが有効 ● Postman パブリックワークスペース にMomento CacheとTopics (Publish)用のOpenAPI仕様や Postman コレクションが用意されてる Momento https://www.postman.com/gomomento/workspace/http-api/overview

Slide 17

Slide 17 text

エンドポイント : 例)cell-ap-northeast-1-1.prod.a.momentohq.com Momento Control Plane control. gRPC Disposable Token発行 token. gRPC Cache, Topics用 cache. gRPC Vector Index用 vector. gRPC HTTP API用 (cache, topics) api. REST * control, token, cache, vectorは client-sdk-javascript - auth.tsから判断 https://github.com/momentohq/client-sdk-javascript/blob/46bad7e3a0aa9e5f9bf4141a5023cff0ced016d3/pack ages/core/src/internal/utils/auth.ts#L44-L53

Slide 18

Slide 18 text

エンドポイントから推察される構成図(あってる?) Momento HTTP GW cache GW vector GW token GW Control GW Control plane Data plane Cache Topics Vector Index Auth gRPC Clients gRPC proto req HTTP Clients

Slide 19

Slide 19 text

RDA vs. EDA リクエスト駆動アーキテクチャ(RDA) と イベント駆動アーキテクチャ (EDA) RDA(リクエスト駆動) EDA(イベント駆動) 通信 同期 synchronous 非同期 asynchronous データ リクエスト・レスポンス メッセージ 操作 GET, PUT, POST, etc publish/subscribe broker プロトコル HTTP MQTT, AMQP, Kafka, etc. API仕様 OpenAPI、GraphQL Schema、RAML AsyncAPI publisher broker subscriber subscriber subscriber channel topic EDA構成コンポーネント

Slide 20

Slide 20 text

API アーキテクチャの種類 1 … 1 1 … N 同期 非同期 RDA EDA EDA Webhook

Slide 21

Slide 21 text

EDA抜きでアーキテクチャは語れない クラウド、マイクロサービス、IoTの普及に伴い多様なデータ連携方式が求められ、EDAの採用が急速に 拡大。まさに、EDA抜きではアーキテクチャは語れない Service B Gateway Service A Service C Service D External Service F External Service G Clients 同期通信 非同期通信

Slide 22

Slide 22 text

Momento Topics: 驚くほど利用敷居が低いPub/Subサービス Momento ● 高度なインフラ抽象化 + シンプルな利用体験(SDK、HTTP API) ○ シャード管理、ノード管理不要で、シームレスに自動拡張で、高いスケーラビリティ・スループッ トを実現するPub/Subサービスを、驚くほど利用敷居を下げて提供 ● Webhook (軽量なイベント駆動HTTPコールバック) によるデータ連携 ○ TopicへのメッセージpublishイベントでWebhook URLにHTTP Post https://speakerdeck.com/yoshiitaka/11shi-dian-momento-gai-yao-and-zui-xin-qing-bao?slide=18

Slide 23

Slide 23 text

API アーキテクチャの種類とMomentoのカバレッジ 1 … 1 1 … N 同期 非同期 RDA EDA EDA Webhook Memento Cache Momento Memento Vector Index Memento Topics Memento Topics

Slide 24

Slide 24 text

感想 以下のことから、MomentoのAPI志向 + ユーザー志向が垣間見れた ● インフラは高度に抽象化され、対話先はAPIエンドポイントだけ ● gRPCでC/S通信高速化 (Blazing fast) 、だけど複雑な処理はSDKにラップ ● 制約のある環境のためにHTTP APIもサポート ● Topicメッセージのデータ連携も疎結合ワールドに優しいWebhookで

Slide 25

Slide 25 text

続いて、APIテクノロジー視点で Postmanをちょこっと

Slide 26

Slide 26 text

さまざまなAPIプロトコルをサポート Postman

Slide 27

Slide 27 text

GraphQL query GetAllAlbums ($genre: Genre) { albums (genre: $genre) { title artist { name } tracks { title number } genre } } Artist Service Tracks Service Genre Service Aggregated Response Request GraphQL GraphQLはAPIのために作られたクエリ言語。IDL(インターフェース定義言語)と してGraphQL SchemaでAPI仕様を定義する。複数のデータソースからの取得 を1つのAPIリクエストで構成可能。 Clients Mobile, Desktop, Browser, etc. Postman

Slide 28

Slide 28 text

GraphQL 利用イメージ Postman Schema explorer Query editor Query variables You can also use the Query button dropdown to browse and select queries to execute Query buttonDropdown URL bar

Slide 29

Slide 29 text

gRPC ● Googleが開発したRPCフレームワーク ● transportにHTTP/2を使うので高いスループットや高速双方向ストリーミングが可能 ● データのシリアライズにProtocol Buffersが使える (protobuf縛りではない) ● IDL(インターフェース定義言語)として.protoファイルとしてAPI仕様を定義し、サーバー&クライ アントに必要なソースコードのひな形を生成する What is gRPC? https://grpc.io/docs/what-is-grpc/introduction/ Postman

Slide 30

Slide 30 text

gRPC 利用イメージ Postman

Slide 31

Slide 31 text

WebSocket / Socket.IO ● WebSocket(WS)は、ブラウザとサーバーの間で持続的な接続を介して双方向通信を行 う ための通信規格/プロトコル。一旦接続が確立されると、接続を切断したり、リクエストを追 加することなく双方向通信が可能 ● Socket.IOはWebSocketを使用して、Webクライアント・サーバー間のリアルタイム、双方 向、イベントベースの通信を可能にする最も人気のあるライブラリの1つ クライアント (ブラウザ) サーバー Handshake (HTTP upgrade) 接続確立 双方向メッセージ 接続オープン+永続化 どちらから送信しても OK <適するサービス> リアルタイムでデータ更新・同期を要する サービス。Web会議、IoT制御、マルチプレ イヤーゲーム、など Postman

Slide 32

Slide 32 text

WebSocket / Socket.IO 利用イメージ Postman

Slide 33

Slide 33 text

MQTT MQTT は、Publish / Subscribe モデルに基づく軽量のメッセージング プロトコ ル。低帯域幅、不安定なネットワーク環境の IoTアプリケーション向けに設計され ている MQTT Broker Sensors IoT Device Sensors IoT Device Mobile Device Cloud Servers 温度センサー 湿度センサー Publish: “20°” (Topic: “temp”) Subscribe to temp Subscribe to mosit Publish: “50%” (Topic: “moist”) Postman

Slide 34

Slide 34 text

MQTT 利用イメージ Postman

Slide 35

Slide 35 text

PostmanにおけるWebhook 2つのユースケースが存在する 1. カスタムWebhookを作成して、Postmanのデータを外部サービスと連携 ● Postmanコレクションの更新内容をカスタムWebhookに送信 ● モニターの結果をカスタムWebhookに送信 ● チーム活動フィードをカスタムWebhookに送信 2. コレクション用Webhookからコレクションを起動 ● Postman APIでコレクションごとのWebhookを作成し、外部から叩くことが可能 https://learning.postman.com/docs/integrations/webhooks/ https://learning.postman.com/docs/collections/running-collections/collection-webhooks/ Postman

Slide 36

Slide 36 text

多様なAPI 仕様フォーマットをサポート ● 様々なデータソースをPostmanコレクションとして取り込むことがが可能 ● 様々なAPI仕様を活用したAPI設計が可能 Postman

Slide 37

Slide 37 text

様々なデータソースからのインポートが可能 Postman コレクション GitHub GitLab Importing data into Postman https://learning.postman.com/docs/getting-started/importing-and-exporting/importing-data/ Bitbucket Azure Code Repository Azure API Management AWS API Gateway New Relic cURL Commands OpenAPI Postman Collection コード管理サービ ス APIゲートウェイ サービス APMサービス インポート RAML WSDL GraphQL API定義

Slide 38

Slide 38 text

APIビルダーを活用したさまざまなAPI仕様による設計 OpenAPI Postman Collection RAML WSDL GraphQL ProtoBuf チームによるAPI設計を支援するAPIビルダーで、さまざまなAPI仕様によるAPI設計が可能 APIビルダーの主要機能 ● API設計 ○ スキーマ定義(インポートも可能) ○ API定義のバリデーション ○ 定義からサーバーコード生成 ○ テスト、ドキュメント生成 ○ コレクション生成 ● チーム開発支援 ○ チーム間のAPI共有 ○ コメント、Changelog ● APIバージョン管理 ○ コードリポジトリ(GitHub, GitLab, Bitbucket, and Azure)と同期 Postman

Slide 39

Slide 39 text

ご清聴いただき、ありがとうございました。

Slide 40

Slide 40 text

All rights reserved by Postman Inc APPENDIX

Slide 41

Slide 41 text

OpenAPI Spec (OAS) OpenAPI 3.1( 2021年2月リリース)は、RESTful APIのためのAPI記述形式で、HTTP API機能を人間と コンピュータが理解できるようにするためのプログラム言語に依存しない仕様形式。 info OpenAPI Specification 3.1 servers paths webhooks components security tags externalDocs 記述形式:JSON、YAML

Slide 42

Slide 42 text

Postmanコレクション仕様 Postmanコレクションの記述形式。コレクションに含まれるAPIリクエストのAPIエンドポイント、リクエスト、 レスポンス、テストなどの情報やAPI 呼び出しのシーケンスを定義できます info items event variable auth protocolPofileBehavior 記述形式:JSON Postman Collection v2.1 ● OAS、PostmanコレクションどちらもAPIのpath、パラメー タ、リクエスト、レスポンス情報などのAPIに関する記述は可 能 ● OASとPostmanコレクションの大きな違い→ APIライフサイ クルに関する情報 ○ ドキュメント ■ コレクション・フォルダーごと ○ テスト ■ リクエスト前後のスクリプト定義 ○ ワークフロー ■ API呼び出しのシーケンス定義 ○ サンプル情報 ■ Open APIよりも堅牢かつ正確。またモック(サーバー) に活用可能

Slide 43

Slide 43 text

Async API The Linux Foundation参加のAsyncAPI initiativeが推進するイベント駆動型の アーキテクチャを定義、文書化、および管理するための仕様。主に、リアルタイム API、イベント駆動型のアーキテクチャ、非同期通信を扱うアプリケーションやシステ ムのインターフェースを記述するために使用される。 Async APIの主要な特徴と概要: ● イベント駆動アーキテクチャのサポート: WebSockets、AMQP、MQTT、 Kafkaなどの複数のメッセージングプロトコルに対応し、イベント駆動型の通 信を効果的に記述できる。 ● YAMLまたはJSONフォーマット: 仕様はYAMLまたはJSONフォーマットで記 述され、読みやすく、書きやすい ● Swagger/OpenAPIとの親和性: SwaggerやOpenAPIといった同期APIを 記述するための仕様と親和性が高く、APIの定義方法に一貫性を持たせるこ とができる https://www.asyncapi.com/blog/understanding-asyncapis https://github.com/asyncapi