Carpe Diem

備忘録

gRPC Unary Interceptorを複数設定した時の実行順序

概要

以前

christina04.hatenablog.com

にてgRPCのUnary Interceptorの基本的な使い方を説明しました。
このInterceptorを複数設定したい時に使われるのがgo-grpc-middlewareの出している

です。READMEにありますが、以下のように複数のInteceptorをセットできます。

import "github.com/grpc-ecosystem/go-grpc-middleware"

myServer := grpc.NewServer(
    grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(
        grpc_ctxtags.StreamServerInterceptor(),
        grpc_opentracing.StreamServerInterceptor(),
        grpc_prometheus.StreamServerInterceptor,
        grpc_zap.StreamServerInterceptor(zapLogger),
        grpc_auth.StreamServerInterceptor(myAuthFunction),
        grpc_recovery.StreamServerInterceptor(),
    )),
    grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(
        grpc_ctxtags.UnaryServerInterceptor(),
        grpc_opentracing.UnaryServerInterceptor(),
        grpc_prometheus.UnaryServerInterceptor,
        grpc_zap.UnaryServerInterceptor(zapLogger),
        grpc_auth.UnaryServerInterceptor(myAuthFunction),
        grpc_recovery.UnaryServerInterceptor(),
    )),
)

ここで実行順序について疑問に思ったので確認してみました。

続きを読む

Go言語でプラグイン機構【RPC編】

概要

オブジェクト指向についてClean Architectureでは

OOとは「ポリモーフィズムを使用することで、システムにあるすべてのソースコードの依存関係を絶対的に制御する能力」である。

これにより、アーキテクトは「プラグインアーキテクチャ」を作成できる。これは、上位レベルの方針を含んだモジュールを下位レベルの詳細を含んだモジュールから独立させることである

と説明されています。

このようにソフトウェアの拡張性を持たせるためにプラグイン機構を用意することは非常に大切です。

今回はhashicorpのgo-pluginを使って実現してみます。

プラグインの利用箇所

プラグイン機構にすることでメリットがありそうなケースってなんだろう?と思って簡単にいくつか挙げてみます。

こんなところでしょうか?
fluentdのようなETLツールはプラグイン開発が非常に活発ですね。
プラグイン機構にすることで自分は本体の堅牢さ・パフォーマンスに注力し、プラグイン開発は他の開発者に作ってもらってスピード開発といった両立が可能になります。

続きを読む

rand.Readerはいつエラーを返すのか

概要

Go言語のuuid生成で有名な satori/go.uuidこちらのコミットでUUIDv4を生成する際にエラーを返すように変わりました。
理由は

github.com

このissueに対応するためなのですが、内部で使っているrand.Read()はそもそもどんな時にエラーが起きるのだろう?と気になって調べてみました。

環境

続きを読む

Kubernetesを扱う上で便利なツール

概要

Kubernetesを利用する上であったら便利なツールの紹介です。

stern

podのログを簡単に取れるツールです。

github.com

インストール

$ brew install stern
続きを読む

Kubernetesのresource requests, limits

概要

Kubernetesには以下のフィールドでCPUやメモリを制限することが可能です。

  • spec.containers[].resources.limits.cpu
  • spec.containers[].resources.limits.memory
  • spec.containers[].resources.requests.cpu
  • spec.containers[].resources.requests.memory

ref: Resource Management for Pods and Containers | Kubernetes

cpu: 1cpu:2といった整数値はイメージが湧きやすいですが、

  • cpu: 100mといった時にどういう動きをするのか?
  • マルチコアのノード環境で↑の時、アプリケーションコードでマルチコア前提のものはきちんと動くのだろうか?

という疑問があったので調べてみました。

環境

続きを読む

Google Cloud Pub/SubでPush(Webhook)型のSubscriptionを設定するにはドメイン認証が必要

概要

タイトルの通りなのですが日本語記事がなかったのでまとめておきます。

経緯

developers.cyberagent.co.jp

の対応でGooglePlayの定期購読ユーザの購読状態をリアルタイムに更新するため、Real-time developer notificationsを導入しました。

その際Pub/SubのPush型Subscriptionでリアルタイムにwebhookが飛ぶようにPush型のSubscriptionを設定したのですが、Google Domains管理下に無い独自ドメインだとINVALID_ARGUMENTというエラーが出ていました。
日本語だとエラーがより分かりにくかった記憶です。残念ながらスクショ等撮っておらず覚えてません。

ググって見ると以下の記事がヒットし、ドメインの認証が必要であることが分かりました。

stackoverflow.com

続きを読む

EmbulkでMongoDBのデータをBigQueryへ

概要

ユーザの行動ログで利用しているデータがDBにあるので、それをまるっとBigQueryへ書き込む方法をEmbulkを使って説明します。

BigQueryにマスタデータを保存する理由は?

単純に行動ログに保存される関連データがIDのみで保存されていると、詳細が知りたい時にDBの情報が必要になりフローが複雑化します。

例)ユーザはquest001を攻略した。quest001の詳細(クエスト名など)は?

一方行動ログにマスタデータの情報を付加するのは冗長なログになってしまいます。
なので行動ログとマスタデータをそれぞれBigQueryに保存し、分析側だけで閉じれるようにする、という方針です。

環境

続きを読む