Carpe Diem

備忘録。https://github.com/jun06t

gRPCにおける各RPC方式の実装方法【Bidirectional streaming RPC】

概要

前回の

gRPCにおける各RPC方式の実装方法【Client streaming RPC】 - Carpe Diem

に引き続き、最後はBidirectional streaming RPCの実装方法を紹介します。
チャットのようなリアルタイム通信や、大きなデータを少しずつ処理したい時、Simple RPCで毎回コネクションを張るコストを避けたい時などに有用です。

環境

  • golang 1.9.2
  • grpc 1.7.2
  • protobuf 3.4.0

成果物

最終的に出来たコードはこちら

github.com

続きを読む

gRPCにおける各RPC方式の実装方法【Client streaming RPC】

概要

前回の

gRPCにおける各RPC方式の実装方法【Server streaming RPC】 - Carpe Diem

に引き続き、今回はClient streaming RPCの実装方法を紹介します。
こちらは大きなリクエストを分割して送りたい時に有用です。

環境

  • golang 1.9.2
  • grpc 1.7.2
  • protobuf 3.4.0

成果物

最終的に出来たコードはこちら

github.com

続きを読む

gRPCにおける各RPC方式の実装方法【Server streaming RPC】

概要

前回の

gRPCにおける各RPC方式の実装方法【Simple RPC】 - Carpe Diem

に引き続き、今回はServer streaming RPCの実装方法を紹介します。
サーバ側から複数のレスポンスを送ることができるので、フィードなどをReactiveに取得したい時に使ったり、サーバサイドプッシュを使いたい時などで有用です。

環境

  • golang 1.9.2
  • grpc 1.7.2
  • protobuf 3.4.0

成果物

最終的に出来たコードはこちら

github.com

続きを読む

gRPCにおける各RPC方式の実装方法【Simple RPC】

概要

gRPCは4つのRPC方式を持っています。

RPC方式 説明 使い所
Unary(Simple) RPC シンプルな1 Request - 1 Response方式 一般的なマイクロサービスなど
Server streaming RPC 1 Request - N Response方式 サーバサイドプッシュ・フィードなど
Client streaming RPC N Request - 1 Response方式 データアップロードなど
Bidirectional streaming RPC 1つのTPCコネクションの中で、RequestとResponseの送受信を任意数繰り返す。
WebSocketに近い?
チャットなど双方向の同期が欲しい時。
コネクション数を節約したい時

ref: grpc / gRPC Concepts

それぞれ実装が異なるので、各方式での書き方を簡単に紹介します。
今回はSimple RPCのやり方です。

続きを読む

protoeasyでprotobufのコンパイルを簡単にする

概要

gRPCなどで使われているprotobufですが、.protoの定義は簡単でもコンパイルにちょっと学習コストがかかります。
gogoprotogrpc-gatewayといった他のライブラリも使うと、中々にカオスなコマンドになります。

grpc-gatewayの例

protoc -I/usr/local/include -I. \
  -I$GOPATH/src \
  -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
  --grpc-gateway_out=logtostderr=true:. \
  path/to/your_service.proto

ref: https://github.com/grpc-ecosystem/grpc-gateway

この辺の手間を解決してくれるのが次のツールです。

github.com

面倒なコマンドをオプションで簡単に使えるようにしてくれます。

続きを読む

TypeScriptのthisでハマった話

概要

AngularでエラーハンドリングをまとめようとしたらTypeScriptのthisの扱いにハマった話です。

環境

  • TypeScript 2.5.3
  • Angular 4.4.6

どんな問題が起きていたか

APIコールのロジックでエラーが発生した時のハンドリングをまとめることができるよう、共通のErrorServiceを持っていました。
ただ時々ErrorServiceでCannot read property 'navigateByUrl' of undefinedというエラーが出てきていました。

続きを読む

ECSのオートスケール戦略

概要

ECSはコンテナのスケールアウトとインスタンスのスケールアウトのタイミングが重要です。
よく起きる問題としては

  • インスタンスのスケールアウトが遅くてコンテナのスケールアウトも遅くなってしまう
  • しきい値が不適切でインスタンスがスケールアウトせず、コンテナがスケールアウトしたくてもできない

で、こういった事が起きないようにしないといけません。

スケールアウトの方針

対象 方針
インスタンス インスタンスの空きリソースがコンテナ1台分だけの状態がn分間続いたら
コンテナ コンテナの使用率がn%を超えたら

インスタンスもう1台もコンテナを追加するリソースがない状況になったら早めにスケールアウトします。
コンテナは一般的なやり方で使用率が高くなったらスケールアウトすればOKです。

続きを読む