Carpe Diem

備忘録

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: Managing Compute Resources for 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に保存し、分析側だけで閉じれるようにする、という方針です。

環境

続きを読む

Embulkの基本的な使い方

Embulkとは

fluentdのバッチ版のようなツールで、データを一括転送したい時に利用します。

f:id:quoll00:20190618131523p:plain

ref: GitHub - embulk/embulk: Embulk: Pluggable Bulk Data Loader.

メリット

自前で実装すると面倒な

  • 並列実行でパフォーマンスの最適化
  • validation
  • dry-run
  • エラーリカバリ
  • 冪等なリトライ

といった部分をサポートしてくれている上、

  • fluentdと同様にプラガブルに作られているので、inputもoutputも開発者が自由に開発できる

ため、プラグインが豊富なので大抵のユースケースをカバーできます。

なので自前でデータ転送をスクリプトやら簡易コードで書いたりすることはできるけれど、後々の運用を考えるとEmbulkを導入した方がいいケースは多々あると思います。

続きを読む

Goの実プロジェクトでのエラーハンドリングの悩みどころと解決案

概要

Golangに限らずではありますが

  • レイヤ間のエラー伝搬
  • 外部APIを叩いた時のエラーコードハンドリング
  • HTTPやgRPCとしてレスポンスを返す時のエラーハンドリング

で悩むことは多いと思います。
今回はそれの1つの方針を紹介します。

課題

レイヤ間のエラー伝搬

golangのエラーは基本的に例外を扱わず、常にハンドリングする前提です。なので

user, err := findUser(id)
if err != nil {
  return User{}, err
}

みたいなコードが大量に生まれます。

一方でその関数を呼び出した側ではそれがどんな種類のエラーなのか分かりません
NotFoundだったりDB自体のエラーだったりしますが、それを外層のレイヤ(HTTPレスポンスを返すハンドラなど)でハンドリングするのは辛いです。
レイヤ毎のエラー内容を知る必要が出てくるため余計な依存が生まれてしまいますし、どこにどんなエラーが有るか把握するのが難しくなって考慮漏れも出てきます。

続きを読む

singleflight でキャッシュのOriginへのリクエストを抑制

概要

golangにはsingleflightという重複したの関数呼び出しを抑制する仕組みがあります。
例えばキャッシュが切れた時にOriginへのアクセスが並行して走ってしまうケースでサーバやDBがスローダウンする問題がありますが、こういった時にsingleflightを挟むと解決できます。

環境

簡単なサンプル

通常だと10回呼び出す処理を、singleflightで抑制してみます。

続きを読む

Datadog SyntheticsでSSL/TLS証明書の期限チェック

概要

少し前にリリースされたDatadog Syntheticsですが、いつの間にかTLS証明書の期限チェックもできるようになったので紹介です。

Datadog Syntheticsって?

外形監視ができるDatadogの機能です。
後ほど設定にでてきますが、世界7箇所からチェックが可能です。

f:id:quoll00:20190530134925p:plain

ref: Simplified synthetic monitoring | Datadog

また、まだベータ版ですがDatadog SLOとも連携できます。

続きを読む