Carpe Diem

備忘録

gRPC の Unary Interceptor の基本的な使い方

概要

gRPCのInterceptorのClient側、Server側の基本的な使い方を紹介します。

環境

Interceptorの種類

以下の4つがあります。今回はUnaryの方の使い方を説明します。

サーバサイド

クライアントサイド

続きを読む

Multi Match Queryのtypeの違い

概要

以前Bool Query と Dis Max Query の違いについて書きました。
今回はその中で出てきたMulti Match Queryのtypeの違いについて書きます。
どれも複数のフィールドに対して実行するクエリですが、それぞれ用途が異なります。

環境

  • Elasticsearch 6.6.0

データ投入

curl -s -H "Content-Type: application/json" \
  -XPOST localhost:9200/my_index/my_type/_bulk -d '
{"index": {"_id": "1"}}
{"title": "Quick brown rabbits", "body": "Brown rabbits are commonly seen."}
{"index": {"_id": "2"}}
{"title": "Keeping pets healthy", "body": "My quick brown fox eats rabbits on a regular basis."}
{"index": {"_id": "3"}}
{"first_name": "Will", "last_name": "Smith"}
{"index": {"_id": "4"}}
{"first_name": "Smith", "last_name": "Jones"}
'
続きを読む

ALBのアクセスログをAthenaで分析

概要

AthenaでALBのアクセスログの分析が非常に簡単にできるので、設定方法とよく使うクエリを紹介します。

手順

ALBアクセスログをS3に保存

新規バケットを同時に作成する場合

バケットポリシーが自動で設定されるので楽なやり方です。
ELBの属性の編集でチェックボックスをONにします。

f:id:quoll00:20190209072232p:plain

このときにS3バケットの作成を一緒にやります。

続きを読む

gRPCで大きなファイルのやり取りをする

概要

gRPCで4MB以上のデータ転送をしようとすると

rpc error: code = ResourceExhausted desc = grpc: received message larger than max (xxxxxxx vs. 4194304)

のようなエラーが出ます。この上限はデフォルト値なのでgrpc.MaxRecvMsgSize()grpc.MaxCallSendMsgSize()を使うことで変更可能ですが、ドキュメントでも以下のように

Protocol Buffers are not designed to handle large messages. As a general rule of thumb, if you are dealing in messages larger than a megabyte each, it may be time to consider an alternate strategy.

ref: Techniques  |  Protocol Buffers  |  Google Developers

と、1メッセージがメガバイトを超えるのであれば別の手段で転送することを考えるべき、と言っています。

なので

のようにストリームで送るのが良さそうです。

続きを読む

Circusを使ってgraceful restart

概要

Nginx + GoのApp

という構成をとっている時に、単純にデプロイでGoだけ更新するとNginxからは

[error] 1413#1413: *1 connect() failed (111: Connection refused)
[error] 1412#1412: *3 connect() failed (111: Connection refused)
[error] 1412#1412: *5 connect() failed (111: Connection refused)

このような111: Connection refusedエラーが起きて、クライアント側には502エラーが返ってしまいます。
理由はデプロイ時にプロセスが一時的に落ちるためです。

これを防ぐためにCircusというソケットマネージャを利用します。

環境

  • Ubuntu 16.04
  • Nginx 1.15.3
  • Circus 0.15.0
  • go 1.11.5
続きを読む

.proto ファイルの整形に clang-format を使う

概要

gRPCで通信しようとすると.protoファイルが沢山出てきます。
ただ人によってインデントが異なったりするのは良くないので、何かしらformatterが無いかなと探したら

github.com

こちらのissueで「Googleではclang-formatを使ってるよ」という回答があったのでそれを使ってみます。

環境

  • macOS Mojave 10.14.2
  • clang-format 8.0.0
続きを読む

VPN接続するとどうして別ネットワークにアクセスできるのか

概要

VPNサーバをAWSに置くことで内部ネットワークに外部からアクセスする手法がありますが、どうしてそれができるのかを知りたくなって調べてみました。

環境

VPNサーバ

  • Ubuntu v18.04
  • pritunl v1.29.1958.76

クライアント

ネットワーク環境

イメージは以下の図です。

f:id:quoll00:20190125234530p:plain

続きを読む