Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go+gRPCで作った次世代店舗の裏側

howyi
February 22, 2022

 Go+gRPCで作った次世代店舗の裏側

GeekGig 『DONUTS×Showcase Gig』〜Goでゼロから作り直した話〜
で発表したスライドです。

https://showcase-gig.connpass.com/event/235635/

howyi

February 22, 2022
Tweet

More Decks by howyi

Other Decks in Programming

Transcript

  1. confidential ©Showcase Gig • 次世代店舗の紹介 • 次世代店舗のシステム構成 • gRPCサーバの利用者向けSDKの用意 •

    ロッカーとの接続を行うエッジサーバについて • gRPCを採用してよかったこと 今日話すこと

  2. confidential ©Showcase Gig The Label Fruit
 • 店外に商品の出来上がりを通知する サイネージ •

    注文はリアルタイムでサイネージに表 示される • 受取ロッカーの各扉にディスプレイ • QRコードの読み取り後、ロッカーの扉 は専用の演出が流れる
  3. confidential ©Showcase Gig gRPCサーバの利用者向けSDKの用意
 タグをGitHubリリースした時とき に自動で go/{tag} のタグを切る ようにGitHub Actionsで設定して

    いる name: "On release" env: CI: true on: release: types: [published] jobs: go-release: name: go release runs-on: ubuntu-latest steps: - name: Set version variable id: version run: | VERSION=$(echo ${{ github.ref }} | sed -e "s#refs/tags/##g") echo ::set-output name=version::$VERSION - name: checkout uses: actions/checkout@v2 - name: tag to go sdk run: | git tag go/${{ steps.version.outputs.version }} git push origin go/${{ steps.version.outputs.version }}
  4. confidential ©Showcase Gig 既存のIoTロッカーとの兼ね合い
 店内機器リアルタイム 通信基盤 ロッカー
 IoTロッカー(既存のものを流用) 
 IoTロッカー


    ソフトウェア ドアの解錠命令 
 (gRPC Streaming) 
 QRコードの読み取り等 (gRPC Unary)
 QRコードの読み取り等 (HTTP POST)
 ドアの解錠命令 (WebSocket) 
 🥺
 ロッカーのソフトウェアと、リアルタイム通信基盤はそもそも別の用途で作られてい たため、使用している通信技術が大きく変わっている
  5. confidential ©Showcase Gig 既存のIoTロッカーとの兼ね合い
 店内機器リアルタイム 通信基盤 ロッカー
 IoTロッカー(既存のものを流用) 
 IoTロッカー


    ソフトウェア ドアの解錠命令 
 (gRPC Streaming) 
 QRコードの読み取り等 (gRPC Unary)
 QRコードの読み取り等 (HTTP POST)
 ドアの解錠命令 (WebSocket) 
 IoTロッカーとリアルタイム通信基盤を変換するサーバを新設する案 • HTTP&WebSocketのサーバとして動作し、ロッカーソフトウェアの認証を行う • 常にgRPC Streamingで基盤と接続を確立する 変換 サーバ
  6. confidential ©Showcase Gig 既存のIoTロッカーとの兼ね合い
 店内機器リアルタイム 通信基盤 ロッカー
 IoTロッカー(既存のものを流用) 
 IoTロッカー


    ソフトウェア ドアの解錠命令 
 (gRPC Streaming) 
 QRコードの読み取り等 (gRPC Unary)
 QRコードの読み取り等 (HTTP POST)
 ドアの解錠命令 (WebSocket) 
 IoTロッカーとリアルタイム通信基盤を変換するサーバを新設する案 • 新規サーバ構築にあたっての基盤構築の必要性 • 今回のロッカーソフトウェア専用のサーバとなり、負債となるリスク 変換 サーバ
  7. confidential ©Showcase Gig エッジサーバの配置による解決
 店内機器リアルタイム 通信基盤 ロッカー
 IoTロッカー(既存のものを流用) 
 IoTロッカー


    ソフトウェア ドアの解錠命令 
 (gRPC Streaming) 
 QRコードの読み取り等 (gRPC Unary)
 QRコードの読み取り等 (HTTP POST)
 ドアの解錠命令 (WebSocket) 
 エッジサー バ ロッカー内部に通信を仲介するエッジサーバを作ってしまう案 • 既存のIoTロッカーはlocalhostに向けて今まで通り通信してもらう • エッジサーバは通信を変換し、認証情報を付与したうえでロッカーとして振る舞う • 既存のハードウェアに入り、運用するサーバや端末が増えることはない • ロッカー <-> エッジサーバ間はローカル通信のため、認証について考える必要がない
  8. confidential ©Showcase Gig エッジサーバの開発
 ドアの解錠命令 
 (gRPC Streaming) 
 QRコードの読み取り等

    (gRPC Unary)
 QRコードの読み取り等 (HTTP POST)
 ドアの解錠命令 (WebSocket) 
 エッジサー バ 必要な機能 • gRPC Streamingで基盤との常時接続を保つ • HTTPサーバとして動き、リクエストを gRPC Unaryに変換してサーバへ送信する • WebSocketサーバとして起動しgRPC Streamingのイベントを接続中のクライアントに配信する • gRPCの接続時は認証情報を付与し、サーバにはロッカーとして振る舞う • cliツールとして配布し、 IoTロッカーソフトウェアの起動時に同時に裏で起動する 店内機器リアルタイム 通信基盤 IoTロッカー
 ソフトウェア
  9. confidential ©Showcase Gig エッジサーバの開発
 • CLIアプリケーションとして動作すればいいことから、使い慣れている Goを採用 • 店内機器リアルタイム通信基盤用の SDKを使用しているため、リポジトリ内のコード量はかなり

    少なく済んだ • 簡単に各OS向けのビルドができ、ビルドしたバイナリを配布するだけでエッジデバイス上で動か せるのはGoの大きなメリット ◦ 実際、macで開発しwindowsで動かしていたが、OS毎での問題には一度も直面しなかった ビルドコマンド例 GOOS=windows GOARCH=386 go build -o edge.exe cmd/locker-edge/main.go 

  10. confidential ©Showcase Gig エッジサーバの開発
 実行時にsync.ErrGroupで • gRPCのStreaming(Subscribe) • HTTPサーバ (POST,

    WebSocket) のgoroutineを起動 eg, ctx := errgroup.WithContext(ctx) httpServer := di.NewHttpServer(cfg, logger) eg.Go(func() error { err := httpServer.Start() return err }) grpcClient := di.NewGrpcClient(cfg, logger) eg.Go(func() error { err = grpcClient.Subscribe(ctx) return err }) <-ctx.Done() // シャットダウン処理
  11. confidential ©Showcase Gig gRPCのコード生成
 protoc(Protocol Buffer Compiler)によるコード 生成が手厚い APIを利用するにあたって書くコードが大幅に少 なく済み、かつ型安全になる

    社内ではprotoから複数のプログラミング言語に 向けてのSDKを自動生成するように ◦ PHP/Go/Dart/Kotlin/JavaScript ◦ https://note.com/scg_tech/n/n45c13047c648 gRPCを採用してよかったこと