Carpe Diem

備忘録

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です。

続きを読む

負荷ツールのスレッド数・Ramp-Up期間・ループ回数の関係

概要

負荷ツールで負荷をかける時の説明でよく見るのは

項目 計算式
総テスト回数 スレッド数×ループ回数
1秒あたりのリクエスト数 総テスト回数÷Ramp-Up

ですが、例えば分間600アクセスを想定した時に

設定項目
スレッド数 600
Ramp-Up期間 60
ループ回数 1

とした場合と

設定項目
スレッド数 100
Ramp-Up期間 60
ループ回数 6

では先ほどの説明だとどちらも総テスト回数1秒あたりのリクエスト数は同じです。
それぞれのケースの時にかかる負荷の違いが分からなかったので調べてみました。

続きを読む

Fluentdを0.14にバージョンアップした時の対応

概要

Fluentdを0.12から0.14へアップデートしました。
その時にtd-agent.confやらpluginで色々と変更点があったのでその時の対応をまとめます。

環境

  • fluentd 0.14.21
  • fluent-plugin-s3 1.0.0.rc6

td-agent.confの変更点

root_dirができた

以前はbuffer毎に

<match pattern>
  buffer_type file
  buffer_path /var/fluentd/buffer/
  ...
</match>

といった感じに1つ1つpathを設定する必要がありましたが、

<system>
  root_dir /path/fluentd/root
</system>

と設定すれば、システム内の/path/fluentd/root/worker0/plugin_idに保存されるようになります。

続きを読む

GoのSliceを関数の引数に渡した時の挙動

概要

Sliceの構造を始め、関数で呼び出した場合の挙動やappendなどsliceを操作した場合どうなるかをまとめました。

環境

Sliceの構造

Sliceは以下のような3つの要素でなりたっています。

  • 配列へのポインタ
  • length
  • capacity

図示すると以下です。

f:id:quoll00:20170926151254p:plain

ref: Go Slices: usage and internals - go.dev

続きを読む