内部ツール向けプロキシサーバを自作しているためいわゆるリバースプロキシサーバをGoの標準ライブラリを活用して作っています。
今回はこのプロキシを作っている際に気がついたTipsについてご紹介します。

※決して全て自前でHTTPプロトコルをパースして作るWebサーバのことではありません。

1. http.ServerにIdleTimeoutを指定する

IdleTimeoutはkeep-aliveの最大持続時間です。
特にHTTP/2で通信している場合において、適度にコネクションを切ってあげないとgoroutineが増え続けます。

HTTP/2のサーバは1クライアントに対していくつかのgoroutineを起動しています。
クライアント数がそこまで多くない場合であればgoroutineが増えたとしてもたかがしれています。
ですが、goroutineが増え続けることに …


以前、 モノレポ構成にしてビルドツールとしてBazelを利用していることを紹介しました。

そのBazelは10月10日にとうとう1.0をリリースしました
バージョン1.0に到達したというニュースは日本語のニュースサイトでも掲載されるなど、多少注目を浴びたようです。

そこで今回はGoのプロジェクトのビルドツールとしてBazelを利用する際のTipsをご紹介します。
GoのプロジェクトではGNU makeをビルドツールとして使われていることが多いと思いますが、一度Bazelに慣れてしまうと手放せないツールになります(なっています)。
導入を検討する際のなにかの参考になりそうなTipsをいくつかご紹介します。

BazelをGoのプロジェクトで使うことのメリット

  1. Bazel がすべてを用意してくれるので最悪 goコマンドが入ってなくてもビルドできる。
  2. コンテナとしてshipする際に非常に軽量なイメージをdockerを使わずにビルドでき …


こんにちわ、モンスト事業本部SREGの伊藤です。

以前 IP制限を減らす取り組み で自作のプロキシをご紹介しました。
自分の手で作ったことで色々と問題を解決することができましたがまだ解決できてない問題もありました。

今回は解決できていなかった問題の1つを解決する仕組みをご紹介します。

本プロキシは自分のメイン業務の片手間で作っているためそれほど多くの時間を割いているわけではありません。(業務時間の10%〜20%程度でしょうか)
本当はもっと作り込みたい部分もあるのですがそのような立ち位置のため効果の大きそうなものや個人的に興味があるものを優先して実装しています。
今回は個人的な興味で実装した機能のご紹介です。

内部アクセス問題

皆さんはいくつのAWSアカウントを利用していますでしょうか?
自然とアカウントが増えていったりしないでしょうか?

モンストも歴史的経緯などでアカウントが増えました。それもAWSだけではなく、GCPやIBMクラウドなどもあります。
データセンターも運用しているのでそれぞれのアカウントから自社のDCを経由させることで相互に通信できるようにしている部分もあります。
一方相互に通信できない部分もあります。
全てのネットワーク間で相互に通信できる方が楽ですが数が増えてくると管理が大変になってくるので相互通信はあまり増やしたくはないという側面もあります。

また当初は内部通信できる必要はなかったが、後から内部通信の必要が生じるケースもあります。
そうなるとネットワークの設計が通信しないことを前提に行われていたりするため後から変更するのには大きなコストがかかります。

そのためプロキシは内部通信に限定せず、そういう場合はインターネットを経由してリバースプロキシできるようにしていました。
(以前の記事でもチラッと言及しています)


モンスト事業本部SREグループの伊藤です。
普段はモンストに関するシステムの改善・運用を様々な面から行っています。

これまでに IP制限を減らす取り組みBazelとモノレポ のサービスの周辺開発についてのお話を紹介しました。
今回はモンストでどのようにキャッシュを使ってパフォーマンスを改善しているのかご紹介します。

皆さんは “負荷対策” と聞いて何を連想するでしょうか?
適切なデータ構造?インデックス?Covering Index?
もちろんそれらも大事ですが、システム全体を考えるとどこでバランスを取るかというのも大事になってきます。
ある処理をする場合、必要なリソース量の和というのはアーキテクチャによらず一定でどのようにバランスを取るかというのが重要になってくると思っています。
ここで言う …


モンスト事業本部SREグループの伊藤です。
普段はモンストに関するシステムの改善・運用を様々な面から行っています。

今回もサービスの直接的な改善ではないですが、ツール等のIP制限を減らす取り組みについてご紹介します。
サービスの直接的な改善もいつか書ければなと思っております。

皆さんはIP制限をしているツール等はいくつくらいありますでしょうか?
モンストにも歴史的経緯でIP制限されたツールや、特に制限されていないツール(!)までいくつもありました。
自作のツール以外にも開発や運用で使っているツールのフロントエンドなども合わせると30以上のツールがあります。

運用で使うツールはアラート対応などでオフィスにいない時でもどこからでもスマートに見れると嬉しいです。
特にサーバーのメトリクスは移動中に見 …


モンスト事業本部SREグループの伊藤です。
普段はモンストに関するシステムの改善・運用を様々な面から行っています。

前回は弊社のあるリポジトリでのBazelの活用について簡単に紹介しました。

今回は更に1歩、Bazelの使い方に踏み込んでみたいと思います。

我々のリポジトリに含まれている色々なツール等をビルドしてshipするにあたって分かりづらかったりした点を中心に説明したいと思います。
すべてを網羅できているわけではありませんし、あくまで自分たちのリポジトリの頻出パターンなので皆さんのリポジトリでは違った点で悩むかもしれません。
Bazelを使い始めようという時に思い出して見ていただけるとよいかもしれません。

今回もサンプルコードは前回と同じリポジトリに置いてあります。

コンテナを作る

サンプルリポジトリの he …


モンスト事業本部SREグループの伊藤です。
普段はモンストに関するシステムの改善・運用を様々な面から行っています。

運用で使われる大小様々なツールを作ることもしばしばあるのですが、このリポジトリ運用が少し特徴的なので紹介をしたいと思います。

リポジトリ運用を一言で表せばモノレポで運用しています。

大小様々なツールがすべて一つのリポジトリに入っています。
ツールのソースコードに限らずKubernetesのマニフェストも同じリポジトリに入っていますしDockerfile等も入っています。(Dockerfileはそんなに多くはないです。Dockerfileを使わずに作成されているコンテナも多いので。これに関しては別の機会に)
ツールを書く時に使われる頻出な処理はライブラリとして分割されているものもあ …

Fumihiro Ito

Software Engineer at Z Lab Corporation

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store