Skip to content

kamicup/solocounter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

なにこれ

  • ウェブサイトに 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 リージョンだから?)けど、処理速度は悪くないのかな。
  • こういうの動かすなら
    • ディスクアクセスはしないので 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>

みたいに適用すると、適当にポーリングして表示更新される。

client/README.md

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published