- ウェブサイトに script で埋め込んで「直近数分間の閲覧人数(アクセス元 IP アドレス数)」を表示するやつ。
- 超・単純自己完結なマイクロサービス。
- Go で実装したので、高速。
- Nginx がスタティックページを返すのと同じくらいの処理性能。
- データは実行プロセス内の共有メモリ領域に格納する。
- KVS を使うと、その通信がボトルネックになるし、オーバーヘッドも生じるので。
- 必要に応じて Redis の Pub/Sub 機能を使って分散処理も可能。
- 性能参考値
- 開発機(MacBook Air, 13-inch, Early 2014)にて
- go 1.3.3 でビルドしたバイナリ
- localhost で
ab -c 100 -n 10000
したら 9000 req/sec 前後。 - シミュレーションモードで内部的に 1000 サイト × 100 req/sec の処理(前項の結果からありえないが)を発生させ続け、60秒ウィンドウで 6,000,000 件ぐらいのアドレスを保持してる状態で同じ ab をしたら 7500 req/sec 前後。
- つまり HTTP のオーバーヘッドに比べれば内部データ管理の処理性能は充分。
- メモリは 1GB ~ 1.5 GB ぐらい占有した。
- t2.micro にて
- go 1.4.2 でビルドしたバイナリ
- localhost で
ab -c 100 -n 10000
したら 8500 req/sec ぐらい。- 分散処理モード(Redis 使う場合)では 6000 req/sec ぐらいになる。(単独モードの 70% ぐらいか。)
- 公開アドレスで
ab -c 100 -n 10000
したら 2500 req/sec ぐらい。(ネットワーク IF がボトルネックになってる。)
- Heroku (フリーアカウント)にて
- 公開アドレスは https://solocounter.herokuapp.com/
git push heroku master
すると go 1.3.3 でビルドされた。- http で
ab -c 10 -n 1000
したら 30 req/sec ぐらい。 - 同じく
ab -c 100 -n 10000
なら 300 req/sec ぐらい。 - 同じく
ab -c 1000 -n 100000
なら 2300 req/sec ぐらい。 - レイテンシは気になる(Heroku が US リージョンだから?)けど、処理速度は悪くないのかな。
- 開発機(MacBook Air, 13-inch, Early 2014)にて
- こういうの動かすなら
- ディスクアクセスはしないので I/O 性能はほとんど気にしなくて良い。
- マルチコアなマシンなら環境変数に GOMAXPROCS=8 とかしつつ -parallel オプション付きで起動するとより良いかもしれない。
表示したいところに
<div id="Counter"> - </div>
を置いて
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="jquery-now-counter.js"></script>
<script>
$('#Counter').asConcurrentAccessCounter({ path:'/your-host.com/any-area' });
</script>
みたいに適用すると、適当にポーリングして表示更新される。