10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ぐるなびAdvent Calendar 2018

Day 14

GolangでAPIサーバ作ったよの話

Last updated at Posted at 2018-12-13

はじめに

Memcacheサーバにデータを格納し、リクエストに応じて適宜情報を取得し整形して返却するAPIサーバを作りました。

  • ロードバランサ
  • APIサーバ
  • Memcacheサーバ

この構成で動くものです。

サーバの構成

image1.png

事前情報

APIサーバからMemcacheサーバへのアクセスは最低1ms(ミリ秒)かかりました。
受け取るデータ量が多ければもっと多くの時間がかかってしまいます。

1回目リリース時の処理

APIサーバからMemcacheサーバにデータを取りに行き、情報を整形して返却しています。
APIサーバからMemcacheサーバへのアクセスは多い時で100回を超えてしまっており、全部で100msかかる計算になってました。
その他の処理にも時間がかかるので平均すると80msくらいかかってました。

2回目リリース時の処理

APIサーバからMemcacheサーバにデータを取りに行く回数を減らすべく、APIサーバのメモリを活用することにしました。Memcacheサーバからデータを取得したらAPIサーバのメモリに載せるようにしたのです。

image2.png

同じデータへのアクセスであればAPIサーバのメモリから情報を取得するので、ネットワークに出ずに処理できるようになり処理速度が格段に向上しました。
その他の処理も最適化をかけ、例えばmapを使っていた部分を配列にして少しでも処理速度を上げたりと専化させ、処理にかかる時間の平均も5msくらいまで下がりました。

変わったところ

  • Memcacheサーバから取得した情報はAPIサーバのメモリ内に保存しておく
    • ローカルのメモリサイズとmemcacheのデータサイズを見て、大きすぎるやつは除外しました。幸いにも1回しかアクセスしないデータだったのでさほど気にならない程度で済みました。
    • APIサーバのメモリ内に保存したデータを更新しなければならないのですが、Memcacheのデータ自体の更新が発生したタイミングで該当のデータを削除できるようにし、その通知方法としてはSocket通信1を使いました。
  • mapを使わずに配列で処理することで時間短縮
    • mapは便利ですが、やはり処理時間がかかってしまうので、どうしてもというところ以外では配列にしました。(つまり全部配列というわけでもありません)

まとめ

  • 今回詳しく触れなかったSocket通信も容易に書けて
  • さらに処理速度も申し分なく
  • 書いていて楽しい

と、良いところがたくさんあるGolangは最高なのでみなさんも是非書いてみて下さい。

  1. Socket通信については今回は詳しく書きません。

10
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?