ゴールデンウィーク初日。個人的には昨日は休暇にしていたので、もう二日目かよみたいな気分なしょっさんです、おはようございます。
昨日休暇にしていたけれども、第1四半期END処理やら、月末処理をまったくしていなかったので、結局なんか仕事したりしていたりして変な気分です。
初日っぽく、ゴールデンウィークはこんなことします!! とかやっても良いんだけど、別に個人的すぎる話すぎてあれなので、まったく別の話を綴っていきます。ちなみに、ゴールデンウィークは、ズレにずれまくって、壊れに壊れまくった生活リズムを安定化させ、第二四半期に備えるのが基本姿勢です。意識高い。
そして、何故こんな壊れてしまったのかという原因については触れずに、その結果生まれたものについて紹介します。実はすでにqiita.comに公開してたんですね。やりやがるぜ。
目次
異常な要求にも、サクッと対応できる負荷テストを行いたい
結局の所、これを実現したいがために多くの紆余曲折を経て、一つの結論に至りました。
「HerokuにはLocustが似合う」
昨今、SaaSタイプの負荷テストツールが出ていますので、Webアプリのテストは実施しやすくなりました。負荷テストごときでがたがた言わなくなってきたIaaSクラウドの面々という背景もあります。サクッとできる反面、料金や構成によってある程度の縛りがあるので無尽蔵にリソースを食いつぶすような試験には向いていない場合もあります。
今回は残念ながら、そのリソースをできうる限り食いつぶすタイプの負荷テストを実現しなければなりませんでした。そこで、まず目をつけたのがApache JMeterです。メジャーどこも良いところですね。しかしまぁ大して負荷をかけてくれねぇんです、これが。Heroku Dyno(コンテナ)のリソースサイズが不足しているのかなと、AWS で m5.2xlarge
を突っ込んでみても、特に変わらず。こんなもんかと思い、次に手を付けたのが Siegeです。簡素なツールではありますが、さっくと試すにはちょうどよいかとやってみたら、JMeterの10倍位上を簡単にひねり出してくれたんです。なんてこった。しかし、これでも限界があったので、限界突破を狙ってJMeterのMaster/Slave構成を組んでみました。
その結果生み出されたのが、こちらのブログたちです。
SlaveをWorker Dynoとして起動しておいて、Master を One-off Dynoであとから起動してSlaveを制御する方法を生み出しました。このあたりについてもQiitaあたりにまとめていきたいとは考えていますが、もうホントにしんどすぎたのと思い出したくもなくて書くかどうかは謎です。
Locust との出会い
Facebookで
もう JMeter お腹いっぱいです
JMeter on Heroku で Master/Slave で動くようになったけど、誰得だろう。
にしても、JMeter 遅い。なんでこんなに遅いのか。遅い原因特定できるほどでもない。Siege めっちゃ便利(現実逃避)
って愚痴ってたら、シャゼくんに
https://locust.io とかとか
とさっぱり教えていただいた Locust が死ぬほど便利。Heroku Private Spaces を使えば、簡単に Master/Slaveが構成できるし、Web UIで操作できてしまうというスグレモノ。Python で書けば書いただけ無理難題にも答えてくれる。そんなステキツール。
ということでできたのが Locust を Heroku で動かして大規模負荷テストを実行してみよう これ。Githubのメッセージは、がんばって英語で書いて、海の向こうの Heroku SE にも紹介してしまう程度には感動したけど、伝わらない、この感動。みたいなそんなものです。
こんな生活を送っていて、しばらくコード見たくない、みたいにもなりましたが。ゴールデンウィーク初日なんとか元気に始まってます。しかし、寒いですね。
今日のおすすめ
なんとなくblogの最後に、Amazonアフィで儲けよう、否、みなさんにオススメの何かを紹介していきます。本編とはまったく関係ありません。
華麗なる初回は現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法です。わいの尊敬してやまないichitaniくんの会社で取締役やってる増田亨氏の著書です。日本でドメイン駆動設計の第一人者といえば、増田氏でしょう。タイトルには「ドメイン」の「ド」の字も入ってませんが、中身はドメイン駆動も含んだアプリ設計です。
日本で一番やさしくドメインを理解するための書籍と言って過言ではありませぬ。出版書籍としては、まずこちらをどうぞ。データベース設計とドメインオブジェクトの点で、すべての「コト」は記録され、非同期で状態が更新されるよう独立するものだ的な内容にピンとくる部分がありました。ああ、なるほど、Kafkaのイベントバスを使って、すべての「コト」を保管すると共に、非同期でビジネスロジックを処理するようにすると、アプリケーションデザインではなく、システムアーキテクチャ自体がクリーンアーキテクチャになるんではないだろうか、なんてことに気が付きました。このあたりは実装できたら、紹介してきます。こんな感じで、みなさまのピンとくるきっかけになるとよろしいんではないかと。
Heroku で豪華に負荷テストを行う方法を実現するに至りました