mockmockでmockを50k台動かしてみる


この記事は、[mockmockアドベントカレンダー](https://qiita.com/advent-calendar/2019/mockmock)25日目の記事です。
昨日は、 [Y_uuu](https://fusic.co.jp/members/57)による、 [mockmockで簡単なIoTシステムを開発してみよう](https://qiita.com/Y_uuu/items/22393b0a236f7aa21bd7) でした。
向かいの席でなにやらゴソゴソしていたのですが、まさかこんなものを作っていたとは！！！
とても夢のあるワクワクする内容でした。

本日は、[mockmock Advent Calendar 2019](https://qiita.com/advent-calendar/2019/mockmock) の記事を振り返りつつ、夢の`cn50k`を動かしてみようと思います。

※ cn50k とは？
mockmock の キャパシティの1種。
現時点で最も大きいキャパシティで、50,000台のmock を同時起動できる。


# 振り返り
cn50kを動かして見る前に、今年Qiitaに投稿されたmockmock関連の記事をまとめておこうと思います。

## mockmock とは？
[IoT開発者向け疑似データ送信サービス「mockmock」とは](https://qiita.com/Kta-M/items/aa75dfeaae9a44d2d3ee)
プロダクトオーナーの[Kta-M](https://fusic.co.jp/members/19)による、mockmock全体の説明でした。

## 各種サーバー・サービスにデータを送る
### サーバー(Nginx)
もちろん自前のサーバーにデータを送ることができます。
- [mockmockでサーバー(Nginx)にデータを送るプロジェクトを作成する ](https://qiita.com/withelmo/items/7e78359965d0809f2120)

### クラウド
AWS, GCP, Azure など、大手クラウドサービスのIoTプラットフォームにデータを送ることができます。
- [mockmockでAWS IoT Coreにデータを送るプロジェクトを作成する](https://qiita.com/Y_uuu/items/6e0e7e532b3e65672d91)
- [mockmockでAmazon API Gatewayにデータを送るプロジェクトを作成する](https://qiita.com/Kta-M/items/7e9f5cfc355f9004611a)
- [mockmockでAmazon Kinesis Data Streamsにデータを送るプロジェクトを作成する](https://qiita.com/Kta-M/items/589888aef0092953ad6c)
- [mockmockでGoogle Cloud IoT Coreにデータを送るプロジェクトを作成する](https://qiita.com/Y_uuu/items/ac3c148bc7c58ca2337e)
- [mockmockでAzure IoT Hubにデータを送るプロジェクトを作成する](https://qiita.com/cheekykorkind/items/2f8cffc9263044b30d99)

### SORACOM
SORACOM SIM を使わずに SORACOM のサービスを使った機能を構築することができます。
- [mockmockでSORACOM Beamから連携するシステムの開発を効率化する](https://qiita.com/kkimura/items/89abaccd31244e4dff3e)
- [mockmockでSORACOM Beamにデータを送るプロジェクトを作成する](https://qiita.com/cheekykorkind/items/b62d6392be53ac3baf39)
- [mockmockでSORACOM Funnelにデータを送るプロジェクトを作成する](https://qiita.com/m-shimao/items/1295cc3f7aee45f084af)
- [mockmockでSORACOM Funkを呼んでみる](https://qiita.com/kkimura/items/fa5b3924a284beef0682)
- [mockmockでSORACOM Funkにデータを送るプロジェクトを作成する](https://qiita.com/Y_uuu/items/5c14fb12d92a9ee3ef38)
- [SORACOM MOCAROSで世界を反転させて愉しむ](https://qiita.com/Kta-M/items/73735b6e2b8f4d51fb2f)


いろいろなところにデータを送れます。


## mockmock に備わった機能の使い方
### ジェネレータ
開発中のIoT デバイスを模倣することができます。
- [mockmockのグラフバリュージェネレーターの原点基準の違いを試す](https://qiita.com/yukabeoka/items/0481415488c643103f30)
- [mockmockのバケットバリュージェネレーターの送信ルールの違いを試す](https://qiita.com/yukabeoka/items/7bcf1fe836b2ee50ca52)
- [mockmockの位置ジェネレーターを使ってみる](https://qiita.com/Kta-M/items/9a7e2e1e99b702a55803)
- [mockmockのデータテンプレートでHTTP Request Headerを使ってみる](https://qiita.com/yukabeoka/items/a58d737adaab55ec0f20)
- [mockmockのデータテンプレートで生成タイプ"バルク"を使ってみる](https://qiita.com/Kta-M/items/bbef58856a1343cc2a55)

### 送信制御
送信間隔を調整したりmockを一括操作したりできます。
- [mockmockでデータ送信間隔をランダムにしてみる](https://qiita.com/yukabeoka/items/ccdbeb6367cd8c0fab92)
- [mockmockで大量のmockを一度に登録してみる](https://qiita.com/yukabeoka/items/f3cc79f6a90e49f27f53)
- [mockmockで自動的にmockを終了させる](https://qiita.com/yukabeoka/items/191a98fcda7eee4094d7)
- [mockmockで特定の数のmockを一括操作する](https://qiita.com/yukabeoka/items/396b4960cc93950df88c)

### 状態遷移
mock の状態を、確定的・確率的に遷移させることができます。
- [mockmockでmockの状態遷移をしてみる(初級編)](https://qiita.com/cheekykorkind/items/d26551b60109b78d1cdd)
- [mockmockでmockの状態遷移をしてみる(中級編)](https://qiita.com/cheekykorkind/items/ab54f1f87dca61b324bc)
- [mockmockでmockの状態遷移をしてみる(上級編)](https://qiita.com/cheekykorkind/items/d22b6cdf49761671413d)

### API
APIも実装されています！
- [mockmockのAPIを使ってみる](https://qiita.com/Kta-M/items/3a2ee96c28ab3a658535)

## 実用例
実際にIoTデバイスの開発にmockmockを使ってみた事例です。
- [mockmockで簡単なIoTシステムを開発してみよう](https://qiita.com/Y_uuu/items/22393b0a236f7aa21bd7)


ということで、今年は非常に多くの記事が書かれました。
ほとんどがこのAdvent Calendar ですが泣

# 本題
mockmock では、上の様々な記事で取り上げられている通り、

- 各種エンドポイントへのデータ送信
- 複数のデータ生成方式
- 任意の送信間隔でのデータ送信
- mock がまるで生きているかのような、状態遷移

をサポートしています。
しかし、疑問に思われる方も多いはずです。
生成できるデータが豊富なことはわかった。いろいろな送信先に遅れることもわかった。
でも、一体どれだけの `データの量` を送れるんだ？ と。

ということで本日は、 mockmock の本気、`cn50k`を試してみたいと思います。


# 制約
mockmock の通常プランでは、 `cn5k`(5,000 mockの同時起動)までしか対応していません。
ご利用前に申請して頂く必要があります。
mockmock コンソールにログイン後、[こちら](https://console.mock-mock.com/contact) よりお問い合わせください。

# やってみる！

Amazon Kinesis Data Streams に対してcn50kでデータを送ろうと思います。
今回は、
1. Kinesis Data Streams にデータを送信する
2. せっかくなので、 [mockmockで特定の数のmockを一括操作する](https://qiita.com/yukabeoka/items/396b4960cc93950df88c)を試してみる (0 -> 33k -> 50k -> 0)
3. Kinesis Data Streams の モニタリング画面で、受信数を確認

という手順で実行しようと思います。

ここで1点注意です。
`cn50k` は費用が高かったり起動に時間がかかったりするので、多くの場合動作確認は`cn1`や`cn10`で行うことをおすすめします。
もちろん必要な場面もあるかとおもいますが、かなりの金額がかかってしまうのでご注意ください(料金表は[こちら](https://console.mock-mock.com/pricing/price/calculation?currency=jpy&capacity=cn))。
自分は1度設定をミスったまま cn50kでmockを起動してしまい悲しい思いをしたことがあります。。。

## Kinesis Data Streams にデータを送る準備
まずは、[mockmockでAmazon Kinesis Data Streamsにデータを送るプロジェクトを作成する](https://qiita.com/Kta-M/items/589888aef0092953ad6c)を参考に事前準備を行います。
記事を見ながらやるとうまくできました。
1点注意が必要なのが、シャード数です。
自分はこの上限にあたってしまい何度か実験をやり直しました。。
今回は10秒に1データ送信 x 50k なので、受信データ数の上限にあたってしまいました。。
同じように、10秒に1データ送信 x 50k の場合は、 シャード数は`6`に設定する必要があります(最低/送信データ数により増える可能性あり)。

## Mock ステータスの設定
今回は、`{'hello': 'World!'}`を10秒に一度送りつけるという極めてシンプルなステータスを設定しました。

## Mockの作成と起動
せっかくなので、 [mockmockで特定の数のmockを一括操作する](https://qiita.com/yukabeoka/items/396b4960cc93950df88c)を試してみました。
`0 mock -> 33k mock -> 50k mock-> 0 mock` と順次起動・一括停止 を行いました。

mock の起動には約15分かかります。

## Kinesis Data Streams の モニタリング画面で、受信数を確認
さて、起動してしばらくしたら、Kinesis Data Streams のモニタリング画面を表示し、きちんとデータが送られているかを確認します。
上述したとおり、いきなり50kでやるのではなく、`cn1` や `cn10` で疎通確認を行ったほうが良いです。

### 33k
表示されている数は、1分間に受信した数です。
![全画面_2019_12_23_21_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/014212d6-8c8f-b79e-e855-49f9e6fce78d.png)

33k * 6 (10秒に1回送信 = 1分に6回送信) = 198,000 ≒ 198,004
概ね正しい数を受信できていることがわかります。


### 50k
表示されている数は、1分間に受信した数です。
![全画面_2019_12_23_21_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/e7f2d37b-b43f-614b-09ae-fdcd5b9e038b.png)

50k * 6 (10秒に1回送信 = 1分に6回送信) = 300,000 ≒ 299,996
こちらも概ね正しい数を受信できていることがわかります。
無事、50k mock 立ち上げることに成功しました。

### 0
終了後はこのようなグラフになりました。
![全画面_2019_12_23_21_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/2dff7a8a-cf8a-250c-782a-97291cd2c6a7.png)
約5分で全mock が停止していることがわかります。

## シャード数
先程から再三申し上げていることですが、シャード数の設定をミスっていたので、一部データの受信に失敗してしまった箇所があります。
くれぐれもシャード数の設定にはお気をつけくださいませ。。。

### シャード数の設定をミスっていたので、うまくデータが取れなかった
![shard_effect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/edb467b7-9a4e-843b-6e84-9517285761e1.png)

### 比較
![fixed_shadow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/c0a7bdbb-9622-8485-a57b-dd70bdf4fc0a.png)

## mock の動作をモニタリング
mock のログを確認できます！
Requests は、送信したリクエストを表しており、success, failed はそれぞれリクエストが成功したか、失敗したかを表しています。
難点は、タイムラグが有ることと、cn50k ではログの詳細が表示されないことです。

![IoT開発を加速する仮想デバイス作成サービス___mockmock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/287f7f9e-95d9-e90c-fc95-f768c521dfff.png)



## mockの停止と掃除

終了後は、Kinesis Data Streams のストリームを削除するのを忘れないようにお気をつけくださいませ。
また、IAMやポリシーも忘れずに削除しておきましょう。
あと、mockmockプロジェクトのキャパシティ変更もお忘れなく。
次回起動時のミスを防ぐため、cn1 にしておくのがおすすめです。

# 終わりに
`cn50k` プロジェクトは、自分が初めてmockmock に関わったプロジェクトでした。
右も左もRubyもGoもわからないままプロジェクトに参加することになり、毎日必死に実装していたのを思い出します。
最近ではmockmockの開発を行うことは無くなってしまいましたが、`cn50k` を開発していたあの日々は、今振り返ってもとても有意義な日々でした。
数が増える。それだけのことだと思っていたのですが、想定していないエラーが飛んできたり何故か起動しないmockがいたり。
スケールアップだけでは乗り越えられない壁に直面したのもこの頃でした。
AWSのいろいろな機能を試し、全mockが正常に起動したときの喜びは今でも昨日のことのように覚えています。  
今、キャパシティ`cn50k` は[@cheekykorkind](https://fusic.co.jp/members/60)の手によりまさに生まれ変わろうとしています。
これからの大きな変身とさらなる成長を楽しみにしつつ、そっと遠くから見守っていきたいと思います。  

25日間、[mockmock Advent Calendar 2019](https://qiita.com/advent-calendar/2019/mockmock)を楽しみにしていてくださった皆様、ありがとうございました。
渾身の作品が目白押しですので、まだ読まれていない方はぜひお読みください！
来年の mockmock Advent Calendar もお楽しみに！