なにがおきたのか
※スマートフォンがまだないガラケー時代の昔話です。
Apache + Tomcat + Java + MySQLで動くWebサービスを新規で開発し、無事リリースすることができました。
本番でも問題なく稼働していて安心して迎えた初めての週末で事件は起きました。
土曜日の早朝から鳴り続ける会社ケータイ・・・。
数百件のメールの受信中画面 → メールの中身を確認しようとするとまた数百件のメールの受信中画面、が延々と繰り返し続き、メールの中身を確認することもできなかったものの、一瞬見えるタイトルからアラートメールっぽいことを推測。
※そのガラケーの仕様で、メール受信はバックグラウンドではなく、割り込みでフォアグラウンドでメール受信中画面を出すため、メールを送られ続けるとメールボックスが空になるまで何も操作できなかった。また、メールを自動受信しないという設定もなかったため、電波が届く状態で起動すると絶対にメールを取りいくようになっていた。
送られ続けるメールで会社ケータイで通話することもできず、プライベートケータイで関係者に電話したところ、どうもバッチ処理のアラートが大量に送られ続けている模様とのこと。
ちなみに、アラート通知用のMLにはエンジニア全メンバーと偉い人々が入っていました。
どうしてそうなった
結局開発担当者が土日につかまらず、影響範囲もバッチによる集計処理で実サービスに影響なかったので、月曜日まで放置することになりました(ケータイの電源はもうOFFにしていました)。
月曜日に状況を確認したところ、集計用DBがダウンしていてそこへのアクセスする処理が全てエラーになっていたのですが、そのエラーの通知がループ内で行われていました。
while(/*数万件のループ*/) {
try {
/* 1件ごとの集計処理 */
} catch(Exception e) {
/* アラートメールを送る処理 */
}
}
その結果、毎ループでDBアクセスできないアラートメールが送られることになりました。
結局アラートメールは数万通送られ、月曜日に1日かけて全てのメールを受信しました。
どうすればよかったのか
- 1回でもエラーが起きたらバッチを終了するようにする
- それが無理なら、全エラーの内容をまとめて1回のアラートメールで送るようにする
- アラートメールの送り先はレベルに応じてわける