Slide 1

Slide 1 text

1  3プロトコルを実現する connect-go 朱 義宏 / GMO PEPABO inc. 2024.10.23 Fukuoka.go

Slide 2

Slide 2 text

2 ⾃⼰紹介 ホスティング事業部 ロリポップ! for Gamersチーム 2024年 中途⼊社 朱 義宏 Shu Yoshihiro ● 旅⾏が好き(最近は東南アジアに興味あり) ● ボクシングフィットネスジムに通い始めました ● Twitter : @yoshihiro_shu

Slide 3

Slide 3 text

GMOペパボについて 3 https://pepabo.com/

Slide 4

Slide 4 text

4 アジェンダ 1. connect-goについて 2. どう実現しているのか 3. for Gamersのアーキテクチャ

Slide 5

Slide 5 text

Connectについて ‧connect-go: ライブラリとしてのConnect ‧Connect Protocol: RPCプロトコルとしてのConnect 定義 5

Slide 6

Slide 6 text

1. connect-goについて 6

Slide 7

Slide 7 text

RPC(Remote Procedure Call)とは? 7

Slide 8

Slide 8 text

Connectについて RPC(Remote Procedure Call)とは? 8 ローカルからリモートサーバーの関数を実⾏する技術

Slide 9

Slide 9 text

connect-goが対応している RPCの仕様について 9

Slide 10

Slide 10 text

connect-goについて gRPC 10 https://grpc.io/docs/what-is-grpc/introduction/#overview

Slide 11

Slide 11 text

connect-goについて gRPC-Web 11 https://github.com/grpc-ecosystem/grpc-gateway?tab=readme-ov-file#about

Slide 12

Slide 12 text

connect-goについて 12 Connect Protocol

Slide 13

Slide 13 text

connect-goについて 13 それぞれRPCプロトコルとHTTPの対応バージョン gRPC gRPC-Web Connect Protocol HTTP/1.1 ❌ ⭕ ⭕ HTTP/2 ⭕ ⭕ ⭕

Slide 14

Slide 14 text

HTTP/1.1とHTTP/2の違いは? 14

Slide 15

Slide 15 text

connect-goについて HTTP/1.1とHTTP/2の違い 15 HTTP/1.1はテキストベース HTTP/2はバイナリベース https://hpbn.co/http2/#binary-framing-layer

Slide 16

Slide 16 text

connect-goについて HTTP/1.1とHTTP/2の違い 16 HTTP/2ではフレームを分割することで、 1つのTCP接続で複数のリクエストとレスポンスを同時に送受信が可能 https://hpbn.co/http2/#request-and-response-multiplexing

Slide 17

Slide 17 text

17 connect-goについて この複雑な仕様を どう実装しているのか?

Slide 18

Slide 18 text

connect-goについて 疑問点 18 gRPC-Webではプロキシを使うことでHTTP/1.1通信を実現している

Slide 19

Slide 19 text

connect-goについて この複雑な仕様をどう実装しているのか? 19 ドキュメントのチュートリアル的に、ハンドラーひとつで実現できている。。。 https://connectrpc.com/docs/go/getting-started

Slide 20

Slide 20 text

connect-goについて 疑問点 20 connect-goのハンドラーは、 プロキシなしで、HTTP/1.1とHTTP/2、更に3プロトコルどうやって実現しているのか?

Slide 21

Slide 21 text

2. どう実現しているのか 21

Slide 22

Slide 22 text

どのように実現しているのか 22 結論 HTTP Headerの"Content-Type"によって、 それぞれのプロトコルのHandlerを実⾏している

Slide 23

Slide 23 text

connect-goのhttp.Handler 23

Slide 24

Slide 24 text

どのように実現しているのか それぞれのProcedureごとに`http.HandlerFunc`を⽣成している connect-goのhttp.Handler 24

Slide 25

Slide 25 text

どのように実現しているのか 通信⽅式によって、Handlerを変えている connect-goが⽣成するhttp.Handler 25

Slide 26

Slide 26 text

connect-goのServeHTTP 26

Slide 27

Slide 27 text

どのように実現しているのか HTTP Headerの"Content-Type"から、対応したプロトコルのHandlerを取得 connect-goのServeHTTP 27 https://github.com/connectrpc/connect-go/blob/main/handler.go#L181

Slide 28

Slide 28 text

どのように実現しているのか "Content-Type"と対応するプロトコル connect-goのServeHTTP 28 gRPC gRPC-Web Connect Protocol application/grpc application/grpc+json application/grpc+proto ⭕ application/grpc-web application/grpc-web+proto application/grpc-web+json ⭕ application/proto application/json ⭕ application/connect+proto application/connect+json ⭕

Slide 29

Slide 29 text

どのように実現しているのか Procedure関数を実⾏するために、コネクションを確⽴する connect-goのServeHTTP 29 https://github.com/connectrpc/connect-go/blob/main/handler.go#L224

Slide 30

Slide 30 text

どのように実現しているのか Procedure関数を実⾏し、コネクションを閉じる connect-goのServeHTTP 30 https://github.com/connectrpc/connect-go/blob/main/handler.go#L224

Slide 31

Slide 31 text

protocolHandler 31

Slide 32

Slide 32 text

どのように実現しているのか 様々なProtocol, Codec, CompressorをサポートをしているHTTP HandlerのInterface protocolHandler 32 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89

Slide 33

Slide 33 text

どのように実現しているのか protocolHandlerのInterface 33 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89

Slide 34

Slide 34 text

どのように実現しているのか サーバー側でクライアントとの通信を⾏い、メッセージの送受信をするオブジェクトを 返す protocolHandler - NewConn 34 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89

Slide 35

Slide 35 text

どのように実現しているのか リクエストとレスポンスの圧縮形式を決める protocolHandler - NewConn 35 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89

Slide 36

Slide 36 text

どのように実現しているのか HTTP Headerの"Content-Type"を取得し、対応した形式の操作するオブジェクトを取 得 protocolHandler - NewConn 36 https://github.com/connectrpc/connect-go/blob/main/protocol_grpc.go#L176

Slide 37

Slide 37 text

どのように実現しているのか protocolHandler - NewConn 37 "Content-Type"と対応するシリアライズ形式 Protocol Buffers JSON application/proto ⭕ application/grpc application/grpc-web ⭕ application/json ⭕ application/grpc+proto application/grpc-web+proto application/connect+proto ⭕ application/grpc+json application/grpc-web+json application/connect+json ⭕

Slide 38

Slide 38 text

3. for Gamersのアーキテクチャ 38

Slide 39

Slide 39 text

39

Slide 40

Slide 40 text

MySQL Frontend (Type script) Backend (Go) アプリケーション DB (Amazon RDS) コントロールパネル Kubernetes Cluster (オンプレミス ) オンプレミスデータセンター Baremetal #1 (Ubuntu/LXD) Baremetal #n (Ubuntu/LXD) LXD Cluster Ceph Cluster VM #1 VM #2 VM #n for Gamersのアーキテクチャ 引⽤: ロリポップ ! for Gamersの立ち上げ

Slide 41

Slide 41 text

for Gamersのアーキテクチャ 技術選定におけるバックエンドの課題 41 ‧API仕様がコード化したい ‧スキーマ駆動開発を⾏いたい ‧サービスの特性上、⼀般的なリソースのCRUDに加えてRPC的な要素が多く、  無理にRestfulなAPIを落とし込まないで良い ‧ブラウザや別サービスアプリケーションと通信がしたい 引⽤: ロリポップ ! for Gamersの立ち上げ

Slide 42

Slide 42 text

for Gamersのアーキテクチャ Connectの採⽤ 42 ‧Protocol Buffersを採⽤し、スキーマ駆動開発を実現 ‧1つのHandlerでgRPC, gRPC-Web, Connect Protocolに対応 ‧プロキシなしでHTTP/1.1及びHTTP/2通信が可能

Slide 43

Slide 43 text

Appendix 43

Slide 44

Slide 44 text

Appendix connectrpc/connect-goのコントリビューターになりました! 44 https://github.com/connectrpc/connect-go/pull/786

Slide 45

Slide 45 text

45 Thank you!