SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新規システムにおける技術選定

〜GoとgRPCを採用した話〜



虎の穴ラボ 藤原 佳顕

1
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
アジェンダ

● 概要

● 新しいシステムを作った話

● 実際に採用した技術〜GoとgRPC〜

○ 実際の構成

○ 良かった点/失敗した点

● まとめ

2
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
自己紹介

3
● 名前

○ 藤原佳顕(@nuhera, @zonuko)

● 仕事

○ FantiaとかCreatiaとか社内アプリとか

● 好み

○ Clojure、Rust

● 趣味

○ 格闘ゲーム

■ Melty Blood、Guilty Gear

○ STG(ダライアスとか)も好き

○ 最近は女神転生Vずっとやってました

Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

4
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話



5
Fantiaにアフィリエイト機能作らない?
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● 技術選定の前提

○ 自分のタスクに対する裁量はかなり大きい範囲で認められている

■ 何でもOKではない

■ 作るものに最適か、会社の方針にあっているかを踏まえた上で自分の使
いたいものを選択できる

■ プログラミング言語、インフラなど基本的にすべて裁量がある

作ろうとしているモノに対して最適なものを採用するのが腕の見せ所!

6
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● 今回作る機能の要件

○ ある種の履歴管理機能

■ =>DB上のレコードは膨大になる可能性がある

○ 機能の使用に利用者申請が必要

■ =>利用者管理機能が必要

○ 連携箇所を考えるとなるべく高速に

■ =>レスポンスに1sとかはNG

7
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● 検討候補

○ 言語、フレームワーク

■ Ruby on Rails

● 虎の穴ラボで一番良く使われる


■ Go

● マイクロサービスとする場合ユースケースに合致


● 会社の方針としても推したい技術


■ Rust

● 社内システムで採用したことあり


● 他個人的に使っていた

8
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● 検討候補

○ アーキテクチャ

■ モノリシック

● 予想されるデータの量的には採用しづらいが検討余地はあり 

■ REST API

● 定番。慣れてはいるがきれいに作るのが難しい 

■ GraphQL

● Rustと共に個人的に利用実績あり(社内システム) 

■ gRPC

● 基本的にサーバー間通信の想定だったので候補に 

● また、Goを選んだ場合に相性が良さそう 

9
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● 検討候補

○ DB関連

■ MySQL(8)

● 社内の知見的に一択だった

● あくまで社内のものな点に注意。自分の経験からは選ばない

■ RDBにまつわるツール

● 言語が決まってから

■ Redis

● 速度要件的に使える場所でキャッシュとして使いたい

10
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● 検討候補

○ クラウド関連

■ GCP

● 組み込み先のシステムはGCP上で稼働

■ AWS

● 社内的には最も使われている

11
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● その他ライブラリなど 

○ Goを使う場合はある程度ライブラリの選定が必要 

■ ORM or クエリビルダー 

● GORM

○ スターが一番多い

● SQLBoiler

○ マイグレーションしたDBからORMのコードを起こせるのが良さそう 

■ DBマイグレーション 

● ORMとくっついていないので何でも良い 

● golang-migrate/migrate 

○ Go言語製でシンプルなDBマイグレーションツール 

12
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

13
ちゃんとメンテできるように!

リリースは簡単に!

技術方針としてはGoとgRPCがい
いな・・・
速度重視でクラウドは同じ+
リージョン近いほうがいいので
は?
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● 提案した技術をベースに社内で相談

○ はじめに組み込み先サービスの主担当+アーキテクチャの担当

■ 自分が推したいものを持っておくのが大事

● 今回はGo、gRPC、AWS

■ この時点で一旦決定

○ 決定したものをCTOに共有

■ 今回はここでAWS⇨GCPに変わった

● 前述の通りなるべく同じクラウド、同じリージョンにするため

14
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

15
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● 最終的に選んだ技術

○ サービスは分割

■ データ量がやはり懸念。データが膨大になって障害になったことがあるた
め

○ Go

■ 会社の方針と自分が上げた候補で合致したもの

■ ライブラリ:GORM、golang-migrate

● できるだけシンプルかつ、今後の発展も期待できそうなもの

16
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
新しいシステムを作った話

● 最終的に選んだ技術

○ gRPC

■ 今回はサーバー間通信が主だったのでRESTやGraphQLより向いているだ
ろうと判断

■ 速度も期待できる

○ GCP(CloudRun)

■ FantiaはGCP

■ CloudRun自体は別件で利用実績があったかつ、gRPCに対応していた

■ AWSとの速度比較などしていないが、安全のためこちらを選択

17
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
実際に採用した技術〜GoとgRPC〜

18
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
実際の構成

● システム全体像

19
Fantia(クライアント:Rails)


アフィリエイト(APIサーバー: Go)


Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
実際の構成

● ディレクトリ構成

20
● api 

○ gRPCの定義ファイル(*.proto)とそこから生成されるファイルの置き場

● cmd

○ エントリポイントのソース置き場(main.goとそれにまつわるもの)

● db

○ migrations: go-migrateで作ったDBマイグレーションファイル置き場

○ model: GORMで定義されたORM用ソース置き場。ビジネスロジックはこちら

○ seed: 初期データ投入用ソース置き場

● handler

○ APIのエンドポイント

○ gRPCで自動生成されたソースを具体的な実装に落とし込んだもの
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
実際の構成

● apiディレクトリ配下の例 

21
syntax = "proto3";
package samplepb;
// コード生成時のGoとRubyのパッケージ名
option go_package = "api/grpc-gen/samplepb";
option ruby_package = "Grpcs::Samplepb";
// 名前の通り一つのサービスを表す(service)
service Sample {
// rpcで定義されるのが実質的なインターフェース
// 言語から見るとinterfaceやメソッドといった形
rpc PingPong (Ping) returns (Pong) {}
}
// messageではinterface等でやり取りされるデータが定義される
// 要は構造体のようなもの これがシリアライズされてバイナリで送られる
message Ping {
string msg = 1;
}
message Pong {
string msg = 1;
}
(sample.proto)

Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
実際の構成

● apiディレクトリ配下の例 

22
// For semantics around ctx use and closing/ending streaming RPCs, please refer to
https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type SampleClient interface {
PingPong(ctx context.Context, in *Ping, opts ...grpc.CallOption) (*Pong, error)
}
type Ping struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
}
(sample_grpc.pb.go)SampleClientインターフェースをhandler配下で実装すればAPIが出来上がる

(sample.pb.go)Pongも同様な形で構造体が生成される


Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
実際の構成

● Ruby側もprotoファイルからソース生成できる 

23
# Generated by the protocol buffer compiler. DO NOT EDIT!
# Source: sample.proto for package 'Grpcs.SamplePb'
require 'grpc'
require 'sample_pb'
module Grpcs
module SamplePb
module Sample
class Service
# 略
rpc :PingPong, ::Grpcs::SamplePb::Ping, ::Grpcs::SamplePb::Pong
end
Stub = Service.rpc_stub_class
end
end
end
require 'google/protobuf'
Google::Protobuf::DescriptorPool.generated_pool.build do
add_file("sample.proto", :syntax => :proto3) do
add_message "samplepb.Ping" do
optional :msg, :string, 1
end
add_message "samplepb.Pong" do
optional :msg, :string, 1
end
end
end
(sample_pb.rb)

(sample__services_pb.rb)

Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
良かった点

24
● 速度を目的に導入したgRPCの開発体験が良かった

○ 当然速度も満足できるレベル

○ protoファイルから自動生成されるコードをサービス間のインターフェースとして使える

○ API側は多少実装が必要だが、クライアント側は自動生成コードを実行するだけでAPI実行が
できてしまう

■ エンドポイントの指定とかは必要

■ 先の例だとDSLで定義されていた`rpc :PingPong`

● 実際の呼び出しサンプルは以下

@service = Grpcs::SamplePb::Sample::Stub.new('localhost:50051')
@grpc_res = @service.ping_pong(@request, metadata)
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
良かった点

25
● gRPCがRubyであっても型チェックしてくれる


○ もともと静的型付けなGo側は当然チェックされる(コンパイル時)


○ Rubyで生成したコードに間違った型の値を入れるとエラーになる


■ ただし、実行時な点は注意

○ テストコードやユーザーテストでエラーを発見しやすかった


@request = Grpcs::SamplePb::Ping.new(msg: msg)
↑msgがstring以外だとエラーにしてくれる
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
良かった点

26
● CloudRunの運用が楽

○ コンテナをサーバーレスに動かす仕組み


○ スケールは受け入れ可能同時リクエスト数と最低台数で決まる


■ その上でCPUを調整

○ CloudBuildを使ったリリースがかなり楽


■ リリース用コンテナのビルドまで、CloudRunへの展開までなど設定ファイルを書くこ
とで柔軟に選べる

■ GitHubなどと連携していなくても画面上からボタン押すだけでリリースできる


Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
失敗した点

27
● protoファイルの管理方法

○ Go側のプロジェクトにいれてしまった


■ Ruby側のプロジェクトとGo側のプロジェクトのフォルダの配置に依存してしまう


○ より広範にgRPCが使われるようなら専用リポジトリに分離しようと考えていたが、最初か
ら分離してもよかった

Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
失敗した点



28
● ライブラリの選定

○ GORMを採用したがsqlcのほうが、好みや実際の実装を見ると良かった


■ https://github.com/kyleconroy/sqlc


○ GORMを使ってはいるものの実際の使い方がクエリビルダーっぽい


■ SQLの結果を構造体にマッピングしているだけのような使い方


○ SQLを中心に考えるならsqlcのほうが良かったのでは?


var conv *HogeHoge
query := db.GetDB().Table("hogehoge").Where("fuga_id = ?", af.ID)
query = query.Where("type IN (?) ", []int{int(TYPE)})
query = query.Order("id desc")
query.Find(&conv)
Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
失敗した点



29
● gRPCの中身を直接は確認できない


○ RESTの場合は直接APIをブラウザで実行してみたりして返ってくるJSONを確認したりし
ていた

○ gRPCはHTTP/2上かつ、バイナリでデータのやり取りが行われるのでRESTのように直
接見える形で実行することが難しい


○ 開発時は専用クライアントを使った


■ BloomRPC

● https://github.com/bloomrpc/bloomrpc


Copyright  (C) 2022 Toranoana Inc. All Rights Reserved.
まとめ

30
● 虎の穴ラボでの新規サービスを作るときの技術選定の流れを紹介しました

● 実際に作ったものを例にソースや選定の結果できあがった構成を紹介しました

● 選んだ技術を使ってみて良かったところ、悪かったところを紹介しました


Contenu connexe

Tendances

マイクロサービスアーキテクチャ とは何か
マイクロサービスアーキテクチャとは何かマイクロサービスアーキテクチャとは何か
マイクロサービスアーキテクチャ とは何か
Yusuke Suzuki
 
スペシャリストになるには
スペシャリストになるにはスペシャリストになるには
スペシャリストになるには
外道 父
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Yuta Ohashi
 

Tendances (20)

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれいまさら聞けないselectあれこれ
いまさら聞けないselectあれこれ
 
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイントVPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
VPCのアウトバウンド通信を制御するためにおさえておきたい設計ポイント
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM Logging
 
GCを発生させないJVMとコーディングスタイル
GCを発生させないJVMとコーディングスタイルGCを発生させないJVMとコーディングスタイル
GCを発生させないJVMとコーディングスタイル
 
マイクロサービスアーキテクチャ とは何か
マイクロサービスアーキテクチャとは何かマイクロサービスアーキテクチャとは何か
マイクロサービスアーキテクチャ とは何か
 
KafkaとPulsar
KafkaとPulsarKafkaとPulsar
KafkaとPulsar
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
show innodb status
show innodb statusshow innodb status
show innodb status
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
 
スペシャリストになるには
スペシャリストになるにはスペシャリストになるには
スペシャリストになるには
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
 
deep dive distributed tracing
deep dive distributed tracingdeep dive distributed tracing
deep dive distributed tracing
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 

Similaire à 【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜

Similaire à 【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜 (20)

ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkins
 
Runtime c++editing
Runtime c++editingRuntime c++editing
Runtime c++editing
 
ドリコムのインフラCI
ドリコムのインフラCIドリコムのインフラCI
ドリコムのインフラCI
 
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムResemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
 
GoでEPC作って本番運用している話
GoでEPC作って本番運用している話GoでEPC作って本番運用している話
GoでEPC作って本番運用している話
 
GitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼうGitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼう
 
Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上
 
Google IoT Core × SORACOM
Google IoT Core × SORACOMGoogle IoT Core × SORACOM
Google IoT Core × SORACOM
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
Tech lounge gcp_20190313
Tech lounge gcp_20190313Tech lounge gcp_20190313
Tech lounge gcp_20190313
 
Golang tokyo #7 qtpm
Golang tokyo #7 qtpmGolang tokyo #7 qtpm
Golang tokyo #7 qtpm
 
Google IoT Core × SORACOM(補足:PrivateGarden機能の部分は、PublicGate機能の間違えです)
Google IoT Core × SORACOM(補足:PrivateGarden機能の部分は、PublicGate機能の間違えです)Google IoT Core × SORACOM(補足:PrivateGarden機能の部分は、PublicGate機能の間違えです)
Google IoT Core × SORACOM(補足:PrivateGarden機能の部分は、PublicGate機能の間違えです)
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
 
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例
 
FPGA, AI, エッジコンピューティング
FPGA, AI, エッジコンピューティングFPGA, AI, エッジコンピューティング
FPGA, AI, エッジコンピューティング
 
オタク×Node.js勉強会
オタク×Node.js勉強会オタク×Node.js勉強会
オタク×Node.js勉強会
 
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説
 
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
 
Rustで3D graphics programming
Rustで3D graphics programmingRustで3D graphics programming
Rustで3D graphics programming
 

Plus de 虎の穴 開発室

Plus de 虎の穴 開発室 (20)

FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化
 
Railsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認するRailsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認する
 
虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf
 
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdfDeno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
 
toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明
 
Deno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介しますDeno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介します
 
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
 
GCPの画像認識APIの紹介
GCPの画像認識APIの紹介 GCPの画像認識APIの紹介
GCPの画像認識APIの紹介
 
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」
 
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
 
セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説
 
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
 
Amplify Studioを使ってみた
Amplify Studioを使ってみたAmplify Studioを使ってみた
Amplify Studioを使ってみた
 
いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!
 
【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ
 
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
 
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント 虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
 
【20220120 toranoana.deno#4】deno を使って「ログイン」するサービスを作る
【20220120 toranoana.deno#4】deno を使って「ログイン」するサービスを作る【20220120 toranoana.deno#4】deno を使って「ログイン」するサービスを作る
【20220120 toranoana.deno#4】deno を使って「ログイン」するサービスを作る
 
【20220120 toranoana.deno#4】denoでffiの続き
【20220120 toranoana.deno#4】denoでffiの続き【20220120 toranoana.deno#4】denoでffiの続き
【20220120 toranoana.deno#4】denoでffiの続き
 

Dernier

Dernier (10)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜

  • 1. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新規システムにおける技術選定
 〜GoとgRPCを採用した話〜
 
 虎の穴ラボ 藤原 佳顕
 1
  • 2. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. アジェンダ
 ● 概要
 ● 新しいシステムを作った話
 ● 実際に採用した技術〜GoとgRPC〜
 ○ 実際の構成
 ○ 良かった点/失敗した点
 ● まとめ
 2
  • 3. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 自己紹介
 3 ● 名前
 ○ 藤原佳顕(@nuhera, @zonuko)
 ● 仕事
 ○ FantiaとかCreatiaとか社内アプリとか
 ● 好み
 ○ Clojure、Rust
 ● 趣味
 ○ 格闘ゲーム
 ■ Melty Blood、Guilty Gear
 ○ STG(ダライアスとか)も好き
 ○ 最近は女神転生Vずっとやってました

  • 4. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 4
  • 5. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 
 5 Fantiaにアフィリエイト機能作らない?
  • 6. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● 技術選定の前提
 ○ 自分のタスクに対する裁量はかなり大きい範囲で認められている
 ■ 何でもOKではない
 ■ 作るものに最適か、会社の方針にあっているかを踏まえた上で自分の使 いたいものを選択できる
 ■ プログラミング言語、インフラなど基本的にすべて裁量がある
 作ろうとしているモノに対して最適なものを採用するのが腕の見せ所!
 6
  • 7. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● 今回作る機能の要件
 ○ ある種の履歴管理機能
 ■ =>DB上のレコードは膨大になる可能性がある
 ○ 機能の使用に利用者申請が必要
 ■ =>利用者管理機能が必要
 ○ 連携箇所を考えるとなるべく高速に
 ■ =>レスポンスに1sとかはNG
 7
  • 8. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● 検討候補
 ○ 言語、フレームワーク
 ■ Ruby on Rails
 ● 虎の穴ラボで一番良く使われる 
 ■ Go
 ● マイクロサービスとする場合ユースケースに合致 
 ● 会社の方針としても推したい技術 
 ■ Rust
 ● 社内システムで採用したことあり 
 ● 他個人的に使っていた
 8
  • 9. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● 検討候補
 ○ アーキテクチャ
 ■ モノリシック
 ● 予想されるデータの量的には採用しづらいが検討余地はあり 
 ■ REST API
 ● 定番。慣れてはいるがきれいに作るのが難しい 
 ■ GraphQL
 ● Rustと共に個人的に利用実績あり(社内システム) 
 ■ gRPC
 ● 基本的にサーバー間通信の想定だったので候補に 
 ● また、Goを選んだ場合に相性が良さそう 
 9
  • 10. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● 検討候補
 ○ DB関連
 ■ MySQL(8)
 ● 社内の知見的に一択だった
 ● あくまで社内のものな点に注意。自分の経験からは選ばない
 ■ RDBにまつわるツール
 ● 言語が決まってから
 ■ Redis
 ● 速度要件的に使える場所でキャッシュとして使いたい
 10
  • 11. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● 検討候補
 ○ クラウド関連
 ■ GCP
 ● 組み込み先のシステムはGCP上で稼働
 ■ AWS
 ● 社内的には最も使われている
 11
  • 12. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● その他ライブラリなど 
 ○ Goを使う場合はある程度ライブラリの選定が必要 
 ■ ORM or クエリビルダー 
 ● GORM
 ○ スターが一番多い
 ● SQLBoiler
 ○ マイグレーションしたDBからORMのコードを起こせるのが良さそう 
 ■ DBマイグレーション 
 ● ORMとくっついていないので何でも良い 
 ● golang-migrate/migrate 
 ○ Go言語製でシンプルなDBマイグレーションツール 
 12
  • 13. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 13 ちゃんとメンテできるように!
 リリースは簡単に!
 技術方針としてはGoとgRPCがい いな・・・ 速度重視でクラウドは同じ+ リージョン近いほうがいいので は?
  • 14. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● 提案した技術をベースに社内で相談
 ○ はじめに組み込み先サービスの主担当+アーキテクチャの担当
 ■ 自分が推したいものを持っておくのが大事
 ● 今回はGo、gRPC、AWS
 ■ この時点で一旦決定
 ○ 決定したものをCTOに共有
 ■ 今回はここでAWS⇨GCPに変わった
 ● 前述の通りなるべく同じクラウド、同じリージョンにするため
 14
  • 15. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 15
  • 16. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● 最終的に選んだ技術
 ○ サービスは分割
 ■ データ量がやはり懸念。データが膨大になって障害になったことがあるた め
 ○ Go
 ■ 会社の方針と自分が上げた候補で合致したもの
 ■ ライブラリ:GORM、golang-migrate
 ● できるだけシンプルかつ、今後の発展も期待できそうなもの
 16
  • 17. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 新しいシステムを作った話
 ● 最終的に選んだ技術
 ○ gRPC
 ■ 今回はサーバー間通信が主だったのでRESTやGraphQLより向いているだ ろうと判断
 ■ 速度も期待できる
 ○ GCP(CloudRun)
 ■ FantiaはGCP
 ■ CloudRun自体は別件で利用実績があったかつ、gRPCに対応していた
 ■ AWSとの速度比較などしていないが、安全のためこちらを選択
 17
  • 18. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 実際に採用した技術〜GoとgRPC〜
 18
  • 19. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 実際の構成
 ● システム全体像
 19 Fantia(クライアント:Rails) 
 アフィリエイト(APIサーバー: Go) 

  • 20. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 実際の構成
 ● ディレクトリ構成
 20 ● api 
 ○ gRPCの定義ファイル(*.proto)とそこから生成されるファイルの置き場
 ● cmd
 ○ エントリポイントのソース置き場(main.goとそれにまつわるもの)
 ● db
 ○ migrations: go-migrateで作ったDBマイグレーションファイル置き場
 ○ model: GORMで定義されたORM用ソース置き場。ビジネスロジックはこちら
 ○ seed: 初期データ投入用ソース置き場
 ● handler
 ○ APIのエンドポイント
 ○ gRPCで自動生成されたソースを具体的な実装に落とし込んだもの
  • 21. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 実際の構成
 ● apiディレクトリ配下の例 
 21 syntax = "proto3"; package samplepb; // コード生成時のGoとRubyのパッケージ名 option go_package = "api/grpc-gen/samplepb"; option ruby_package = "Grpcs::Samplepb"; // 名前の通り一つのサービスを表す(service) service Sample { // rpcで定義されるのが実質的なインターフェース // 言語から見るとinterfaceやメソッドといった形 rpc PingPong (Ping) returns (Pong) {} } // messageではinterface等でやり取りされるデータが定義される // 要は構造体のようなもの これがシリアライズされてバイナリで送られる message Ping { string msg = 1; } message Pong { string msg = 1; } (sample.proto)

  • 22. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 実際の構成
 ● apiディレクトリ配下の例 
 22 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type SampleClient interface { PingPong(ctx context.Context, in *Ping, opts ...grpc.CallOption) (*Pong, error) } type Ping struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` } (sample_grpc.pb.go)SampleClientインターフェースをhandler配下で実装すればAPIが出来上がる
 (sample.pb.go)Pongも同様な形で構造体が生成される 

  • 23. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 実際の構成
 ● Ruby側もprotoファイルからソース生成できる 
 23 # Generated by the protocol buffer compiler. DO NOT EDIT! # Source: sample.proto for package 'Grpcs.SamplePb' require 'grpc' require 'sample_pb' module Grpcs module SamplePb module Sample class Service # 略 rpc :PingPong, ::Grpcs::SamplePb::Ping, ::Grpcs::SamplePb::Pong end Stub = Service.rpc_stub_class end end end require 'google/protobuf' Google::Protobuf::DescriptorPool.generated_pool.build do add_file("sample.proto", :syntax => :proto3) do add_message "samplepb.Ping" do optional :msg, :string, 1 end add_message "samplepb.Pong" do optional :msg, :string, 1 end end end (sample_pb.rb)
 (sample__services_pb.rb)

  • 24. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 良かった点
 24 ● 速度を目的に導入したgRPCの開発体験が良かった
 ○ 当然速度も満足できるレベル
 ○ protoファイルから自動生成されるコードをサービス間のインターフェースとして使える
 ○ API側は多少実装が必要だが、クライアント側は自動生成コードを実行するだけでAPI実行が できてしまう
 ■ エンドポイントの指定とかは必要
 ■ 先の例だとDSLで定義されていた`rpc :PingPong`
 ● 実際の呼び出しサンプルは以下
 @service = Grpcs::SamplePb::Sample::Stub.new('localhost:50051') @grpc_res = @service.ping_pong(@request, metadata)
  • 25. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 良かった点
 25 ● gRPCがRubyであっても型チェックしてくれる 
 ○ もともと静的型付けなGo側は当然チェックされる(コンパイル時) 
 ○ Rubyで生成したコードに間違った型の値を入れるとエラーになる 
 ■ ただし、実行時な点は注意
 ○ テストコードやユーザーテストでエラーを発見しやすかった 
 @request = Grpcs::SamplePb::Ping.new(msg: msg) ↑msgがstring以外だとエラーにしてくれる
  • 26. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 良かった点
 26 ● CloudRunの運用が楽
 ○ コンテナをサーバーレスに動かす仕組み 
 ○ スケールは受け入れ可能同時リクエスト数と最低台数で決まる 
 ■ その上でCPUを調整
 ○ CloudBuildを使ったリリースがかなり楽 
 ■ リリース用コンテナのビルドまで、CloudRunへの展開までなど設定ファイルを書くこ とで柔軟に選べる
 ■ GitHubなどと連携していなくても画面上からボタン押すだけでリリースできる 

  • 27. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 失敗した点
 27 ● protoファイルの管理方法
 ○ Go側のプロジェクトにいれてしまった 
 ■ Ruby側のプロジェクトとGo側のプロジェクトのフォルダの配置に依存してしまう 
 ○ より広範にgRPCが使われるようなら専用リポジトリに分離しようと考えていたが、最初か ら分離してもよかった

  • 28. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 失敗した点
 
 28 ● ライブラリの選定
 ○ GORMを採用したがsqlcのほうが、好みや実際の実装を見ると良かった 
 ■ https://github.com/kyleconroy/sqlc 
 ○ GORMを使ってはいるものの実際の使い方がクエリビルダーっぽい 
 ■ SQLの結果を構造体にマッピングしているだけのような使い方 
 ○ SQLを中心に考えるならsqlcのほうが良かったのでは? 
 var conv *HogeHoge query := db.GetDB().Table("hogehoge").Where("fuga_id = ?", af.ID) query = query.Where("type IN (?) ", []int{int(TYPE)}) query = query.Order("id desc") query.Find(&conv)
  • 29. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. 失敗した点
 
 29 ● gRPCの中身を直接は確認できない 
 ○ RESTの場合は直接APIをブラウザで実行してみたりして返ってくるJSONを確認したりし ていた
 ○ gRPCはHTTP/2上かつ、バイナリでデータのやり取りが行われるのでRESTのように直 接見える形で実行することが難しい 
 ○ 開発時は専用クライアントを使った 
 ■ BloomRPC
 ● https://github.com/bloomrpc/bloomrpc 

  • 30. Copyright  (C) 2022 Toranoana Inc. All Rights Reserved. まとめ
 30 ● 虎の穴ラボでの新規サービスを作るときの技術選定の流れを紹介しました
 ● 実際に作ったものを例にソースや選定の結果できあがった構成を紹介しました
 ● 選んだ技術を使ってみて良かったところ、悪かったところを紹介しました