Carpe Diem

備忘録

Go

Clean Architecture で実装するときに知っておきたかったこと

概要 developers.cyberagent.co.jp こちらで 課金システムをマイクロサービス化した サービス自体の設計をDDDにした という対応をしました。 当時は試行錯誤の連続でしたが対応から1年程経ち、ある程度設計もfixされてきたので知見をまとめます。

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

Go

概要 christina04.hatenablog.com でも話したcontext.Contextはタイムアウト、キャンセルなどのハンドリングができて便利ですが、使う際に知っておいた方が良いことをいくつかまとめました。 環境 golang 1.12.0 Tips Q. 親・子の両方でWithTimeoutが設定さ…

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

概要 gRPCのInterceptorのClient側、Server側の基本的な使い方を紹介します。 環境 golang 1.12.0 grpc 1.18.0 Interceptorの種類 以下の4つがあります。今回はUnaryの方の使い方を説明します。 サーバサイド UnaryServerInterceptor StreamServerIntercept…

goroutineでのpanicのハンドリング その2

Go

概要 christina04.hatenablog.com で書いていなかったことの追加です。 環境 golang 1.11.4 recoverしたあとのエラーハンドリングをどうするか panicをrecoverしたものはいいものの、 func f() { defer func() { if r := recover(); r != nil { fmt.Println(…

Go言語の良いところ

Go

概要 Goの良いところってなんだろう?と思ってまとめます。 多分新しいことを知ったら追記していきます。 よく言われるところ コンパイルが速い JavaやC++に比べてかなり高速です。 メモリ安全 GoはC言語に近いですが、C言語で問題になっていたメモリ周りは…

goroutineはなぜ軽量なのか

Go

概要 以前の記事で christina04.hatenablog.com Goはスレッドよりはるかに軽量なgoroutineでC10K問題を解決する、という話をしましたが、goroutineが軽量なのはなぜか?という理由を深掘りしたことがなかったのでしてみました。 環境 golang 1.11.1 Darwin 1…

Goのpprofの使い方【メモリ編】

概要 前回 christina04.hatenablog.com にてpprofのコマンドラインツールの使い方を説明しました。 今回はメモリについて ケース1:このバッチ処理、メモリすごく喰うけどどこが原因? ケース2:メモリリークしてない? といったところの調査方法を説明し…

Goのpprofの使い方【コマンドラインツール編】

概要 前回 christina04.hatenablog.com にてpprofの基本的な使い方を説明しました。 今回はさらに詳細に調べるためのコマンドラインツールの使い方を説明します。 環境 golang 1.11.0

Go 1.11 で導入された ListenConfig を使って SO_REUSEPORT を利用する

概要 先日リリースされた1.11でソケットオプションを設定できるようになりました。 これによってLinux 3.9から導入されたSO_REUSEPORTという、同じポートでbindすることが可能になる機能が利用可能になります。 環境 golang 1.11 macOS 10.13.6 (Darwin Kern…

GoでVaultを操作

概要 これまで紹介したHashiCorp Vaultの使い方はCLIを使うのがメインでしたが、実際はアプリケーション内で秘密情報を扱うケースが多々あります。 VaultはGoのライブラリを提供しているので、様々なログイン方法を紹介しつつ秘密情報にアクセスしてみます。…

GoでGraceful Shutdown

Go

概要 以前はGraceful shutdownをするために以下のようなライブラリを使用していました。 github.com しかしながらGo 1.8 からGraceful Shutdown機能が標準で提供されるようになりました。 今回はその導入方法を紹介します。 環境 golang 1.10.3

GoのRoundTripperとTransport

Go

背景 僕が保守している go-iapというGoで書いたAppStore, GooglePlay AmazonAppStore用の課金ライブラリ があるのですが、そこに以下のissueがあがっていました。 github.com ざっくり説明すると「GAEでは普通のhttp.Client使えないからカスタムClientサポー…

Exponential Backoff (指数関数的に増えるリトライ間隔)

概要 fluentdのretryはExponential Backoffと呼ばれるもので、リトライの間隔が 1秒、2秒、4秒、8秒、16秒 と指数関数的に増えていきます。これによって無駄なリクエストを省きつつ、再試行する前に問題を修正して解決できるようになります。 特に外部APIが…

Goのpprofの使い方【基礎編】

概要 pprofの使い方の備忘録として何回かに分けて書いてきます。 今回は前提知識として知っておくべきことを書きます。 環境 go 1.10.1 pprofは2つの計測方法がある 以下の2つのやり方があります。 runtime/pprof が提供しているAPIを使ってファイルに出力…

GoでFacebook OAuthログインをセキュアに実装する

概要 Facebookを用いたOAuthログインの実装方法はネット上に多々ありますが、セキュリティに関してあまり考慮されてないものが多いです。 今回はセキュアに実装する例を示します。 環境 golang 1.10 facebook graph api v2.12 成果物 今回のソースコードはこ…

Goのcontext.Contextはいつ使うべきか

概要 go 1.7からcontextパッケージが標準パッケージになりました。 タイムアウト、キャンセルなどのハンドリングができることから、ブロッキングする処理や外部APIリクエストなどを扱う時は基本的に第一引数に置くべきです。 またAPIやプロセス間通信のリク…

goroutineでのpanicのハンドリング

Go

概要 goroutineを使った時のpanicのハンドリングについて調べてみたのでまとめ。 Goはgoroutineで簡単に並列処理を書けますが、エラーハンドリングをきちんとしていないと後で困ることになるという話です。 環境 golang 1.9.2 通常 recoverがどうなるか確認…

grpc-gatewayでgRPCサーバをRESTで叩けるようにする

概要 gRPCはProtocol Buffersを喋るもの同士ではメリットが大きいですが、RESTしか叩け無いものや、curlでRESTを叩くようにサクッと検証したかったりするときに不便です。 そんな問題を解消してくれるのがgrpc-gatewayで、protobuf定義からREST APIを提供す…

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

概要 前回の gRPCにおける各RPC方式の実装方法【Client streaming RPC】 - Carpe Diem に引き続き、最後はBidirectional streaming RPCの実装方法を紹介します。 チャットのようなリアルタイム通信や、大きなデータを少しずつ処理したい時、Simple RPCで毎回…

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

概要 前回の gRPCにおける各RPC方式の実装方法【Server streaming RPC】 - Carpe Diem に引き続き、今回はClient streaming RPCの実装方法を紹介します。 こちらは大きなリクエストを分割して送りたい時に有用です。 環境 golang 1.9.2 grpc 1.7.2 protobuf …

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

概要 前回の gRPCにおける各RPC方式の実装方法【Simple RPC】 - Carpe Diem に引き続き、今回はServer streaming RPCの実装方法を紹介します。 サーバ側から複数のレスポンスを送ることができるので、フィードなどをReactiveに取得したい時に使ったり、サー…

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

概要 gRPCは4つのRPC方式を持っています。 RPC方式 説明 使い所 Unary(Simple) RPC シンプルな1 Request - 1 Response方式 一般的なマイクロサービスなど Server streaming RPC 1 Request - N Response方式 サーバサイドプッシュ・フィードなど Client stre…

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

概要 gRPCなどで使われているprotobufですが、.protoの定義は簡単でもコンパイルにちょっと学習コストがかかります。 gogoprotoやgrpc-gatewayといった他のライブラリも使うと、中々にカオスなコマンドになります。 grpc-gatewayの例 protoc -I/usr/local/in…

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

Go

概要 Sliceの構造を始め、関数で呼び出した場合の挙動やappendなどsliceを操作した場合どうなるかをまとめました。 環境 golang v1.9.0 Sliceの構造 Sliceは以下のような3つの要素でなりたっています。 配列へのポインタ length capacity 図示すると以下で…

Scratch imageでtime: missing Location

概要 以前以下の記事でscratch imageの作成方法を紹介しました。 christina04.hatenablog.com しかしGoのコードによっては以下のpanicが起きることがあります。 panic: time: missing Location in call to Time.In 今回はその対応方法です。 環境 golang 1.8…

ScratchイメージでGoアプリの超軽量イメージをビルド

概要 Alpineベースのイメージが軽量イメージとして認知されていますが、Goの場合は単一バイナリで動くのでイメージ内にgolangが入っている必要はありません。 なので最も軽量と言われているScratch imageを利用することで、dockerイメージを軽量化することが…

delveでGoのデバッグ

Go

概要 Goでデバッグをする際にdelveというツールがオススメです。 環境 golang v1.8.3 delve 1.0.0-rc.1 インストール brewでもインストールできますが、単体テストの実行の際に上手く動かないことがあったのでgo getの方をオススメします。 $ xcode-select -…

Non-Blocking I/O, I/O Multiplexing, Asynchronous I/Oの区別

概要 各言語がC10K問題をどう解決してきたかを調べてみたところ、Non-Blocking I/O, I/O Multiplexing, Asynchronous I/Oの区別がよく分からなかったので調べてみました。 正直なところ人によってちょこちょこ定義が異なるのではっきりとした答えはなさそう…

GoでMockを書く時のTips

Go DI

概要 「GoはDuck TypeだからMock用意するの大変だよね」とよく言われますが、そんなことはないですよ、という話。 環境 golang 1.8.3 1. interface自体埋め込めば実装済みと解釈してくれる 例えば以下のような複数のメソッドを持つinterfacedoEverythingがあ…

GoでBigQueryにデータを追加する

概要 GoでのBigQueryの使い方です。 認証周りが以前と変わっており、JWTを使ってゴニョゴニョしてた部分をライブラリ側で吸収してくれるようになったのか使う側は簡単になりました。 環境 go 1.8.3 サービスアカウントキーの作成 API Console Credentials pa…