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
3プロトコルを実現するconnect-go / Fukuoka.go#20
Search
yoshihiro shu
October 23, 2024
1
200
3プロトコルを実現するconnect-go / Fukuoka.go#20
yoshihiro shu
October 23, 2024
Tweet
Share
Featured
See All Featured
What's new in Ruby 2.0
geeforr
343
31k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
Scaling GitHub
holman
458
140k
Being A Developer After 40
akosma
87
590k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Thoughts on Productivity
jonyablonski
67
4.3k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Happy Clients
brianwarren
98
6.7k
GraphQLとの向き合い方2022年版
quramy
43
13k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Agile that works and the tools we love
rasmusluckow
327
21k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
380
Transcript
1 3プロトコルを実現する connect-go 朱 義宏 / GMO PEPABO inc. 2024.10.23 Fukuoka.go
2 ⾃⼰紹介 ホスティング事業部 ロリポップ! for Gamersチーム 2024年 中途⼊社 朱 義宏 Shu Yoshihiro
• 旅⾏が好き(最近は東南アジアに興味あり) • ボクシングフィットネスジムに通い始めました • Twitter : @yoshihiro_shu
GMOペパボについて 3 https://pepabo.com/
4 アジェンダ 1. connect-goについて 2. どう実現しているのか 3. for Gamersのアーキテクチャ
Connectについて ‧connect-go: ライブラリとしてのConnect ‧Connect Protocol: RPCプロトコルとしてのConnect 定義 5
1. connect-goについて 6
RPC(Remote Procedure Call)とは? 7
Connectについて RPC(Remote Procedure Call)とは? 8 ローカルからリモートサーバーの関数を実⾏する技術
connect-goが対応している RPCの仕様について 9
connect-goについて gRPC 10 https://grpc.io/docs/what-is-grpc/introduction/#overview
connect-goについて gRPC-Web 11 https://github.com/grpc-ecosystem/grpc-gateway?tab=readme-ov-file#about
connect-goについて 12 Connect Protocol
connect-goについて 13 それぞれRPCプロトコルとHTTPの対応バージョン gRPC gRPC-Web Connect Protocol HTTP/1.1 ❌ ⭕
⭕ HTTP/2 ⭕ ⭕ ⭕
HTTP/1.1とHTTP/2の違いは? 14
connect-goについて HTTP/1.1とHTTP/2の違い 15 HTTP/1.1はテキストベース HTTP/2はバイナリベース https://hpbn.co/http2/#binary-framing-layer
connect-goについて HTTP/1.1とHTTP/2の違い 16 HTTP/2ではフレームを分割することで、 1つのTCP接続で複数のリクエストとレスポンスを同時に送受信が可能 https://hpbn.co/http2/#request-and-response-multiplexing
17 connect-goについて この複雑な仕様を どう実装しているのか?
connect-goについて 疑問点 18 gRPC-Webではプロキシを使うことでHTTP/1.1通信を実現している
connect-goについて この複雑な仕様をどう実装しているのか? 19 ドキュメントのチュートリアル的に、ハンドラーひとつで実現できている。。。 https://connectrpc.com/docs/go/getting-started
connect-goについて 疑問点 20 connect-goのハンドラーは、 プロキシなしで、HTTP/1.1とHTTP/2、更に3プロトコルどうやって実現しているのか?
2. どう実現しているのか 21
どのように実現しているのか 22 結論 HTTP Headerの"Content-Type"によって、 それぞれのプロトコルのHandlerを実⾏している
connect-goのhttp.Handler 23
どのように実現しているのか それぞれのProcedureごとに`http.HandlerFunc`を⽣成している connect-goのhttp.Handler 24
どのように実現しているのか 通信⽅式によって、Handlerを変えている connect-goが⽣成するhttp.Handler 25
connect-goのServeHTTP 26
どのように実現しているのか HTTP Headerの"Content-Type"から、対応したプロトコルのHandlerを取得 connect-goのServeHTTP 27 https://github.com/connectrpc/connect-go/blob/main/handler.go#L181
どのように実現しているのか "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 ⭕
どのように実現しているのか Procedure関数を実⾏するために、コネクションを確⽴する connect-goのServeHTTP 29 https://github.com/connectrpc/connect-go/blob/main/handler.go#L224
どのように実現しているのか Procedure関数を実⾏し、コネクションを閉じる connect-goのServeHTTP 30 https://github.com/connectrpc/connect-go/blob/main/handler.go#L224
protocolHandler 31
どのように実現しているのか 様々なProtocol, Codec, CompressorをサポートをしているHTTP HandlerのInterface protocolHandler 32 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89
どのように実現しているのか protocolHandlerのInterface 33 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89
どのように実現しているのか サーバー側でクライアントとの通信を⾏い、メッセージの送受信をするオブジェクトを 返す protocolHandler - NewConn 34 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89
どのように実現しているのか リクエストとレスポンスの圧縮形式を決める protocolHandler - NewConn 35 https://github.com/connectrpc/connect-go/blob/main/protocol.go#L89
どのように実現しているのか HTTP Headerの"Content-Type"を取得し、対応した形式の操作するオブジェクトを取 得 protocolHandler - NewConn 36 https://github.com/connectrpc/connect-go/blob/main/protocol_grpc.go#L176
どのように実現しているのか 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 ⭕
3. for Gamersのアーキテクチャ 38
39
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の立ち上げ
for Gamersのアーキテクチャ 技術選定におけるバックエンドの課題 41 ‧API仕様がコード化したい ‧スキーマ駆動開発を⾏いたい ‧サービスの特性上、⼀般的なリソースのCRUDに加えてRPC的な要素が多く、 無理にRestfulなAPIを落とし込まないで良い ‧ブラウザや別サービスアプリケーションと通信がしたい 引⽤:
ロリポップ ! for Gamersの立ち上げ
for Gamersのアーキテクチャ Connectの採⽤ 42 ‧Protocol Buffersを採⽤し、スキーマ駆動開発を実現 ‧1つのHandlerでgRPC, gRPC-Web, Connect Protocolに対応
‧プロキシなしでHTTP/1.1及びHTTP/2通信が可能
Appendix 43
Appendix connectrpc/connect-goのコントリビューターになりました! 44 https://github.com/connectrpc/connect-go/pull/786
45 Thank you!