Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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!