はじめに
Memcacheサーバにデータを格納し、リクエストに応じて適宜情報を取得し整形して返却するAPIサーバを作りました。
- ロードバランサ
- APIサーバ
- Memcacheサーバ
この構成で動くものです。
サーバの構成
事前情報
APIサーバからMemcacheサーバへのアクセスは最低1ms(ミリ秒)かかりました。
受け取るデータ量が多ければもっと多くの時間がかかってしまいます。
1回目リリース時の処理
APIサーバからMemcacheサーバにデータを取りに行き、情報を整形して返却しています。
APIサーバからMemcacheサーバへのアクセスは多い時で100回を超えてしまっており、全部で100msかかる計算になってました。
その他の処理にも時間がかかるので平均すると80msくらいかかってました。
2回目リリース時の処理
APIサーバからMemcacheサーバにデータを取りに行く回数を減らすべく、APIサーバのメモリを活用することにしました。Memcacheサーバからデータを取得したらAPIサーバのメモリに載せるようにしたのです。
同じデータへのアクセスであればAPIサーバのメモリから情報を取得するので、ネットワークに出ずに処理できるようになり処理速度が格段に向上しました。
その他の処理も最適化をかけ、例えばmapを使っていた部分を配列にして少しでも処理速度を上げたりと専化させ、処理にかかる時間の平均も5msくらいまで下がりました。
変わったところ
- Memcacheサーバから取得した情報はAPIサーバのメモリ内に保存しておく
- ローカルのメモリサイズとmemcacheのデータサイズを見て、大きすぎるやつは除外しました。幸いにも1回しかアクセスしないデータだったのでさほど気にならない程度で済みました。
- APIサーバのメモリ内に保存したデータを更新しなければならないのですが、Memcacheのデータ自体の更新が発生したタイミングで該当のデータを削除できるようにし、その通知方法としてはSocket通信1を使いました。
- mapを使わずに配列で処理することで時間短縮
- mapは便利ですが、やはり処理時間がかかってしまうので、どうしてもというところ以外では配列にしました。(つまり全部配列というわけでもありません)
まとめ
- 今回詳しく触れなかったSocket通信も容易に書けて
- さらに処理速度も申し分なく
- 書いていて楽しい
と、良いところがたくさんあるGolangは最高なのでみなさんも是非書いてみて下さい。
-
Socket通信については今回は詳しく書きません。 ↩