Webサービス（AICEVOTE）がバズってサーバーと高校生開発者に起きたことと反省点

私たちのサービス**[”AICEVOTE”](http://aicevote.com)**がQiitaの[記事](https://qiita.com/akaoni_sohei/items/186121bd9994197aab50)からバズったので時系列を追ってサーバーに起きたことと開発者の身に降りかかったことを書いていきたいと思います
#感謝
まずはみなさん。
私たちのサービスを高く評価してくださり、本当にありがとうございました。
たくさんの方が私たちのサービスに興味を持ってくださり、拡散をしていただいたおかげで、
全部で**１０万人**の方にサイトを訪問してもらいました。本当に感謝しかないです。
また、たくさんのコメントもいただきました。そのほとんどが好意的な意見で、
自分たちがやっているこのAICEVOTEというサービスに自信を持つことができました。
１０万人の方にAICEVOTEを知っていただき、使っていただいたことについて、
本当に嬉しく思うと同時に、驚きを隠せないでいます。ある意味、**波乱万丈の一ヶ月**となりました。
そこで今回の記事では、何件かリクエストもあったため、この僕たちにとって嵐のような
数日間を当時の心情も含めながら、回想していきたいと思います。

#経緯
##１月５日　累計ユーザー数：1000人に到達

###嵐の前の静けさ
この日のお昼過ぎに記事を公開しました。
記事は[こちら](https://qiita.com/akaoni_sohei/items/186121bd9994197aab50)になります。
年末から、年始に記事を発表しようとは思っていましたが、
こんなに早く出すとは、思っていませんでした。
今まで、３つほどの記事を書いていましたが、
１年間で作り上げた自分たちのサービスを発表する今回の記事は
正直とても緊張し、不安でした。
ボロクソに言われたらどうしよう。
このようなネガティブな気持ちが錯綜し、自分たちが全く知らない世界に足を踏み入れるような心もちでした。
とりあえず、拡散しようということになり、twitterとinstagramで記事の共有をしました。
###安堵と虚しさ
しかし、この日は少しの反響はあったものの限定的であり、少し安心するとともに、少し残念に思いました。

##１月６日　累計ユーザー数：8000人到達

###うなぎ上り
この日私は、携帯の通知音で起きました。
携帯を見るとチームのメンバーや知人から無数の不在着信がきていました。
何かおかしいと思ってqiitaを開くと通知が**99+**になっていました。
**何事！**と思い、チームに連絡して、事情を聞くと昨日の夜から朝方にかけて、
記事がバズり、サイト訪問者が急増しているというのです。
この日の朝までにユーザー数は8000人を超え、サーバーがもう耐えきれない状況になっていました。
その間も、qiitaの記事をは見るたびにどんどん伸びており、はてなブックマークのトップにも記事が掲載されました。
そのこともあり、ユーザー数はうなぎ上りで増えていきました。
しかしこの頃ある異変に気付きました。
サービスの利用者の増減にCPU負荷も比例するはずなのにCPU負荷は常に増加し続けているのです！
そこで、私にWeb関係の知識を教えてくださった先輩にことの事情を説明したところ、
いくらAWSの無料プランでも、こんなに早くサーバーは落ちない。
サーバーのログを確認してみな。
と言われました。ログを確認しても、知識不足だった私たちはどこがおかしいか見つけることはできませんでした。

###奇怪な行動
途方にくれた私たちは、奇怪な行動をしました。
それは、*サーバーを一回落とし、再起動。*
私たちはawsの無料利用枠のmicroインスタンスをlimitedの状態で利用していました。利用者が増えてCPUクレジットがなくなりそうになるたびに再起動によって補充されるCPUクレジットに頼るというものでした。
年齢制限からgoogleアドセンスの認定も降りないままにサーバーをunlimitedにすることが非常に怖かったからです。私たちはこの時直感でこのサーバー側の処理にに明らかな問題があると悟りました。
今思えば、本当に馬鹿でしたね。でもその時は、多くの人に見て欲しいという思いがあり、
何より必死だったのです。
途中までは、それでなんとか保てていたのですが、限界がきてしまいました。
何度再起動しても、CPUクレジットが回復しないのです。
![cpu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141738/f5cc5daa-8a4c-1615-74cd-76fd53698ff7.jpeg)

体の限界もきていました。流石に無理だと悟った私たちは、明日また、立ち上げよう
と約束し、眠りにつきました。

##１月７日　累計ユーザー数：32000人に到達

###頼む！サーバー！息してくれ！
この日が私は私用があったため、一旦パソコンと離れなくてはなりませんでした。
サーバー管理をメンバーに任せ、家を出ましたが、不安で、不安で仕方なかったのを
覚えています。
私が用事をしている時も、携帯は通知音で悲鳴をあげていました。
なんと、サーバーが起動もできないし、落とすこともできないというのです。
決定打となったのは、Gigazineさんに[記事](https://gigazine.net/news/20200107-aicevote/)が掲載されたことです。
正直これには、本当にびっくりしました。しかし、嬉しさとともに、サービスを１００%の状態で利用していただけないことに深くもどかしさを感じました。
また、同時期に、ねとらぼさんからも記事の依頼を受けており、２１時までにサーバーを必ず再起させる必要がありました。
私用を早めに切り上げた私は、チームとミーティングをし、AWSのサーバーをlargeにすることに決めました。少しお金はかかりますが、未来への投資だと思い、思い切って変えました。
すると、**CPUクレジットはみるみる回復し、サーバーの問題とはおさらば！**
と思っていましたが、また、前回と同じようにCPU負荷はユーザーの増減に比例せず単調増加し、みるみるうちにCPUクレジットが下がっていき、月にいくらかかる計算になるのか計算不能でした。
もう体も心も限界だった私は、胃腸炎のような症状が出ていて、寝てしましました。
###重大なミス
この日の深夜、チームのメンバーは徹夜でコードを全て見直し、どこにサーバーの問題があるのかを探しました。そこで何気ない会話から、nodejsのタイマー（setinterval）と非同期通信（socket.io）に問題があるのではないかということになりました。
元々はこのコードでした

```javascript:www
io.sockets.on('connection', (socket) => {
   setInterval(() => {
	//票を計算する関数
   }, 2000);
});

```
 

この場合socketのconnectionが増えるほどnode内でタイマーが新しく生成されてより高頻度に計算されていく仕組みになってしまっていました。これを知らなかったためでした。
これをこう書き換えました

```javascript:www
io.sockets.on('connection', (socket) => {
   //updateresult関数の呼び出し
});
 
function updateresult() {
   setInterval(() => {
     //票を計算する関数
   }, 2000);
}

```


こうすることで固有のタイマーで全ての計算処理を可能にしました。
非常に初歩的なミスで、今思えばなぜ気付かなかったのかという話ですが、一人しかテストユーザーをいれていなかった開発環境では気付かなかったのと、初期に書いた部分であまり確認しなかったことなどだと思います。この変更によりサーバーの負荷は利用者数に比例するようになりました。もし気づいてなかったらと思うと寒気がします。

##１月８日　累計ユーザー数：60000人
###サーバー安定へ
その日は腹痛で目が覚めました。
朝起きてすぐ、チームのメンバーから連絡がきており、
私たちの記事が、**ねとらぼさん、スマートニュースさんとyahooニュースさんに掲載された**というのです。
それぞれの記事はこちらになります。[ねとらぼさん](https://nlab.itmedia.co.jp/nl/articles/2001/08/news100.html)、、[yahooニュースさん](https://headlines.yahoo.co.jp/hl?a=20200108-00000057-it_nlab-sci)
スマートニュースさん<img width="375" alt="smartnews.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141738/c1a941d4-b43c-d323-3dfe-57f8485e694f.jpeg">

私はそのことを聞いて、またサイトが落ちているだろうと思いましたが、
AICEVOTEを見ると正常に動作していたため本当に安心しました。

この日からは、徐々にユーザー数も安定していきました。

#反省点
これが大まかな内容になります。
私たちは、今回の一件でたくさん失敗し、様々なことを学びました。
これから私たちのようなことをする人や将来の自分たちに向けて、反省点をあげました。
##その１　サーバーを対策しておけばよかった
私たちはこれを怠ったせいで、一番流れに乗っていた時にサーバーが落ちてしまい、
多くのユーザーを失ってしまいました。サーバーを大きくしてから勝負に挑むべきだったと思います。
##その２　心の準備をしておけばよかった
急激にサービスが伸びた、というのはとても嬉しいことですが、高校生の私たちにとっては
心労になりました。自分が書いたサイトが１０万人の人に使ってもらっていると思うと、夜も眠れなくなりました。（まだ慣れていません）自分のサービスを世界に公開するのはこういうことなんだと身を持って体感させられました。記事を出す前にその覚悟をしておきましょう
##その３　お金を準備をしておけばよかった
私たちはほぼ半強制的にサーバーを強化せざるをえなくなりました。
そこで必要となったのはお金です。私たちは、事件が起きる前にコードの問題に気づきましたが、中にはそれに気づかず、何百万円も使ってしまったという話も聞きました。
本当に恐ろしいです。お金の準備はしておいたほうがよかったです。
##その４　DBが帰って来なかった
これは多分一番反省すべき点です。私たちは、途中で、サーバーが再起不能になり、
サーバーを移転するということをしました。しかし、その時に、DBを引っ張ってくることができず、今までの努力や、サイトに来て頂いた人の記録が全て飛んでしまいました。現在は旧dbにはアクセス可能なのですが現在のdbとの競合があるのでmergeできていません。
次からは、DBにきちんとバックアップをして臨みたいと思います。

#これから
本当にありがたいことに、多くの方が我々のサービスに協力して頂けることになりました。まだ公表できないのですが、近々発表したいと思います。Twitterの[フォロー](https://twitter.com/aicevote)お願いします。サービスのレポートや、マーケティングに関しては[note](https://note.com/aicevote)で発信していきたいと思います。

次回はAICEVOTEのシステムについてかなり踏みこんで書きたいと思います！