ソフトバンクモバイル(SBM)は、ナンバーポータビリティ制の導入に伴って、事務処理量の増加に耐え切れずシステムダウンを起こしました。
一部では、話題を引くためにわざと障害を起こしたのではないかと言われたりもしましたが、その後も、システムダウンを起こし、致命的ともいえる出遅れになったところを見ると、予想外のシステムダウンだったようです。
では、システムダウンを起こした事務量というのを考えてみましょう。
SBMでは、毎月、顧客ごとに回線使用料を集計して、プランごとの複雑な割引を行い、請求書を発行し、銀行からのデータと照合して、入金消込み処理を行っています。
ナンバーポータビリティ制の導入で各ショップに顧客が殺到といっても、全顧客の1%に満たない人数だったそうで、毎月の請求処理の複雑さ処理量と比べると、システムの処理量がオーバーするほどのものでないことは明らかです。
つまり、処理量が、根本的なサーバーマシンの限界値をオーバーしたとは考えにくいです。
では、なぜ、システムダウンを起こしたのでしょう。
私はマシンスペックは十分だったけれど、システムの構造上、無駄な処理が含まれていたためではないかと思います。
SBMの業務形態を考えるとショップ毎にシステム管理者を置けないため、システムの構成はWEBシステムで、おそらく、データをRDBMSに保存して、JavaやASP.NETなどを使ったではないかと思います。
私は部外者なのでまったくの憶測ですが、この構成だったとして話を進めます。
今回の予想外の割引処理やナンバーポータビリティ制に対応する処理は、RDBMSサーバ(データベースサーバ)でも、APサーバ(プログラム実行サーバ)のいずれでも処理が可能です。
そのため、どちらで処理を行うかは設計者の好みで変わります。
私の予想は、システム障害が起きた原因は『APサーバで処理していた』からではないかと思います。
WEBシステムでは、処理概要は次のようになります。
各ショップのクライアント
↓↑
APサーバ
↓↑
ミドルウェア
↓↑
RDBMSサーバ
これらを少し分かり安く、文房具の出荷工場と、文房具店という構造で説明します。
各ショップのクライアント = 文房具店
APサーバ = 商社
ミドルウェア = 営業マン
RDBMSサーバ = 出荷工場
となります。
文房具店では、新入学の季節を迎えたので、鉛筆1ダースと消しゴム、筆箱、をセットにしてラッピングして1000セット販売することになり、営業を呼びました。
このときのAPサーバ(商社)とミドルウェア(商社の営業マン)の作業を考えると次のようになります。
★ APサーバで処理した場合。
以下の手順で注文します。
文房具店から1000セットのオーダーを受ける。
以下を1000回繰返し
鉛筆の箱の注文(SQLを書く) → 営業マンが出荷工場へ → 商社へ
鉛筆を1本の注文(SQLを書く) × 12回 → 営業マンが出荷工場へ → 商社へ
商社で箱に詰め込む
消しゴムの注文(SQLを書く) → 営業マンが出荷工場へ → 商社へ
商社でラッピング作業(HTMLの生成)
(繰り返し終わり)
文房具店へ1000セットを届ける。
結局、出荷工場は15000回出荷処理を行うことになり、営業マンは15000回、商社と出荷工場を往復します。
★ RDBMSサーバで処理した場合。
文房具店から1000セットのオーダーを受ける。
商社で、鉛筆1ダースと消しゴム、筆箱を1まとめにしたものを
1000セット分の注文書を書く。
→ 営業マンが出荷工場へ → 出荷工場から商社へ
商社でラッピング作業
文房具店へ1000セットを届ける。
どこに問題があるか、小学生でもすぐに判りますね。
コンピュータは動作が速いので、1つの文房具店から鉛筆1本づつ、1000セットの注文が入っても一瞬で返してくれます。
ですから、この問題は開発期間中に気づくには、それなりの経験が必要です。
(ハードで解決していたら、何回でも失敗するんですが…)
しかし、APサーバで処理すると、営業マンが何度も往復し、ラッピング処理をするまで鉛筆や消しゴムを置く場所をAPサーバ内にキープしています。
そのため、注文してくる文房具店が増えると、営業マンが足りなくなるか、作業場所がなくなるか、出荷工場の出入り口の渋滞(ネットワーク障害)などのいずれかの問題が発生します。
営業マン・作業場所が足りないのであれば、商社を増やせばよいでしょう。
商社を増やす、つまり、APサーバの増設はプログラムをコピーしてつなげれば増やせます。
(分散するためのルータは必要です)
しかし、RDBMSサーバは単純にコピーすればよいというわけにはいきませんから、RDBMSサーバで処理していて、RDBMSサーバの処理量を超えてシステムダウンしたときの増強は簡単ではありません。
SBMでは半日で「増強しましたもう大丈夫です」と発表して、その数時間後に再び止まるようなことになりましたが、RDBMSサーバで処理していては起きない症状で、APサーバで処理量がオーバーしたときに起きることです。
ですから、私の想像はおそらく当たっています。
DBサーバの処理量がオーバーしたなら、1週間程度は止まっていたでしょう。
DBサーバは増強しにくいから、増強しやすいAPサーバで処理した方が安全でしょうか?
そう主張される技術者も多いです。
しかし、あなたが出荷工場の担当者(RDBMSサーバ)になったつもりで『よ~く考えよう~♪』APサーバで処理(鉛筆1本ずつの注文)と、RDBMSサーバで処理(セットで注文)どちらがうれしいでしょうか?
『増強しやすいAPサーバで処理した方が安全』と主張するなら、RDBMSサーバの処理をAPサーバが肩代わりしている必要がありますが、APサーバーで処理した場合、RDBMSサーバの処理はむしろ増えているのです。
多分、SBMは大量にAPサーバを追加することで乗り切ったでしょう。
それで解決できるならよいとも言えますが、APサーバの増強で乗り切れるなら、RDBMSサーバで最初から処理していれば、そもそもシステムは止まらなかったのです。
1日に1%に満たない顧客が来店しただけで処理が溢れるなら、毎月の請求書に3ヶ月掛かる計算になりますね。(こんな単純な計算が出来ないSE&PGがなんと多いことか…)
APサーバ中心で処理させるというのは一般的な構造で、大きな問題が起きなかったAUやDOCOMOなどは、最初から、それはもうびっくりするぐらい大量のサーバをつないで処理していたのかも知れません。
プログラミングとは、要望・仕様という自然言語(日本語)を人造言語(プログラミング言語)に翻訳する作業なのです。
それを、英語で言えば関係代名詞などを使った文章は難しいので、現在形のみの単文で書きましょう、という方向性は普通に考えればプロとしてあり得ない話だと分かるでしょう。
しかし、APサーバで処理する方がわかりやすいシステムになりやすいため、現在のソフトウェア業界では、複雑なSQLは出来るだけ使わない方向へ動いています。
けれども、技術者が足りないから、英語の翻訳で言えば関係代名詞を使えないレベルのプログラマ、SEを促成栽培して技術者として仕事をさせてしまう。
促成栽培方法と、そのレベルでもシステムが作れる方式というのを、業界として確立したわけです。
それは、ある意味すばらしい技術ではあるのですが、SBMの障害ような潜在的な問題を抱えてしまう。
経営者としては、苦労せずに稼げる促成栽培に移行すれば一番儲かる(笑)
そちらへシフトさせるか非常に悩むところではあるのですが、結局、私は業界で確立された方式に異を唱えてがんばっているわけです。
「SQLについて(安い、且つ 速いシステムを作るには)」 の問題が10分で出来る技術者で構成したプロジェクトなら、もっと儲かるはず!という絵に描いた餅を実現するために。

コラムの全インデックス
記事一覧 (42)