Carpe Diem

備忘録

context.WithCancel, WithTimeout で知っておいた方が良いこと

概要

christina04.hatenablog.com

でも話したcontext.Contextタイムアウト、キャンセルなどのハンドリングができて便利ですが、使う際に知っておいた方が良いことをいくつかまとめました。

環境

Tips

Q. 親・子の両方でWithTimeoutが設定されたらどうなるか?

例えば

  • 親:4秒
  • 子:1秒

の時、もしくはその逆の時どうなるか、です。

続きを読む

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)

のようなエラーが出ます。この上限はデフォルト値なので変更することもできるのですが、ドキュメントでも以下のように

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 + GolangのApp

という構成をとっている時に、単純にデプロイでGolangだけ更新すると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
続きを読む