負荷試験製品の骨組みができてきた。今回はアーリーアダプターとしての顧客が数社いるため、まずは動くものを優先に作っていってる。
負荷試験ツール
この製品は使うときだけ起動するというよりは、常時起動しておき、HTTP API 経由で好きなタイミングで使える負荷試験ツールとして開発している。
負荷試験は準備が面倒だったりするため、しっかり計画を建てて行うというのがよくあるが、これはできるだけ気軽に負荷試験を行えるのを目的としている。
全体構成
今回の全体構成図を起こしてみた。
Web API での負荷試験の世界では仮想ユーザ (VU) というのが標準らしいので真似をすることにした。
登場人物は master と worker と vu の 3 種類。
- master は worker の管理
- worker は VU の管理
- VU は Lua を実行する 1 仮想ユーザ
master は常時起動しており、worker は必要なときだけ起こして使う。worker の起こし方などはクラウド毎に仕組みがことなるため、この製品では取り扱わないことにする。
とりあえず 1 worker で 5 万 VU を目標にしている。worker は最大 100 台を想定。そのため今回この負荷試験サーバは最大 500 万 VU を実現できる仕組みにしたい。
構築を簡単に
AWS だとスポットインスタンスを使うことを想定している。必要なときだけ建てて、あとは実行したら終了していくという仕組みを想定している。
とにかく構築を簡単にしたいという思いがある。負荷試験は準備が大変というイメージが強い。これを払拭したい。
負荷試験のフロー
- 負荷をかける URL やシナリオ、終了時間または終了回数、そして仮想ユーザ数を指定してセットアップ用の HTTP API を叩く。
- master は用意されているサーバに worker をセットアップしていく
- worker は VU をセットアップしていく
- 開始用 HTTP API を叩く事で全ての VU が指定された URL に負荷をかけ始める
- 指定した終了時間、または終了回数がきたら VU は負荷をかけるのを終了する
- 全ての VU が終了したら、worker は自分を終了させ master に通知する
worker は VU が負荷をかけている間も定期的に master に統計情報などを通知する。
シナリオの繰り返し
シナリオは繰り返し実行される。状態を持ち回したり、持ち回さなかったりできる。
繰り返し実行する際のインターバルの時間も指定できる。
local http = require "shiguredo.http"
local json = require "shiguredo.json"
local client = require "shiguredo.client"-- VU に渡されるユニークな VU の ID を取得する
local id = client.get_id()local json = json.encode({id = id})
local res = http.post("http://192.0.2.1/bacon", {}, json)
local res_json = json.decode(res)-- 3000 ミリ秒待つ
client.sleep(3000)local beacon = res_json.beacon
local json = json.encode({bacon = bacon})
local res = http.post("http://192.0.2.1/spam", {}, json)
例えばこのシナリオの実行が終わったら、10 秒待つそれを繰り返すという動作を実行できる。
また待つ時間にはランダムな数値を指定でき、10秒プラスマイナス 5 秒なんて仕組みもできる。