業務系Web アプリケーションの裏側

一応、仕事柄、業務系の Web アプリケーションに携わることなんかがあるわけですが、こういうのを沢山みていると、一般的に配布されている PHP なんかでつくられミッションクリティカルじゃないプログラムをみていてドキドキしちゃうことが結構あります。 まぁ別に実害があるわけではなので、どーでもいーのですが、ネタに業務系の Web アプリのちょっとした裏側を書いてみます。

ここでいう業務系 Web アプリケーションというのは、イントラネットで公開されている社内の業務を行うコンピュータシステムもしくは、インターネットに向けて一般のお客さんにつかってもらうような、人、物、金なんかがかかわる怖そうなシステム。 不具合があったらしゃれにならんやつです。

で、その業務系のアプリケーションでは絶対実装されていて、ミッションクリティカルじゃない Web アプリケーションでは大抵実装されていない機能に、排他処理とトランザクション処理というのがあります。

Web アプリってーのは画面がリアルタイムに変わったりしません。 最近は AJAX なんかでリアルタイムにみせることもできますが、擬似的なものです。 基本的に、セッションレスでサーバからの突然の指示には答えることはできず、クライアントから全てがスタートします。

ここで一例。 たとえば、WordPress のスパムフィルタープラグイン akismet。 このプラグインには、”捕まえたスパム” を表示して一括で消す機能があります。

  1. 一覧画面表示
  2. DELETE ボタン押下
  3. 消えた結果が再び一覧表示

という流れになりますが、さきほど書いたように Web 系のアプリケーションはリアルタイム表示が不可能です。 ってことで、 1 で一覧が出てから 2 で DELETE ボタンを押すまでの間にスパムがくる可能性がありますが、その表示も通知もされません。

1, 2, 3 一連の処理を(広義の)トランザクションといいます。 ひとつの仕事ということですね。

ここで昔の akismet の実装を見ると 1 ~ 2 の間にスパムがきている可能性があれど、 2 の処理で豪快に「全部消せ」ってやっています。 画面表示中にきたみえない”スパム疑惑コメント”を削除しちゃうんですね。

ふつーに考えれば、みえているスパムコメントだけ消えてほしいわけなんですが、昔の akismet ではトランザクションを無視して実装していました。 これを業務システムでやったら殺されます。 画面にみえない入金されてきたお金を無視して払い出し、残高0にするみたいなもんです。(笑)

じゃーこれを解決するにはどーすればいーってかというと、よくやるのは時間を持たせるやり方です。 いまの akismet はこの実装になっていて、1 の一覧表示時にその時間をクライアントに (hidden項目で) 返し、2 のサーバサイド処理時にさっきわたした画面の時間を取得して、それ以前のスパムコメントを消すようになっています。 なのでそれ以後のスパム疑惑コメントは残ります。

ただし、この時間は”秒”単位で処理しているので、一覧を表示した1秒以内にきたスパム疑惑コメントは処理しきれません。 業務系アプリではこの辺も死活問題になりますので、一般的には時間を使ったトランザクション処理は用いません。 (これやるならラストのコメントID わたせばいいじゃん、matt も若いな、ふふ、とおじさんは思うわけです 🙂

てなかんじで、いちいちこんなの手動で実装してたりすると絶対間違えるので、世の中にはその手のフレームワークとか、実装環境が存在していて、ぼくらはこれらを使ってアプリの開発をします。 で半ば必然的に必然的に、Java とか C# のエンタープライズ用の言語(というか環境)を使うことになります。

なんだか昔、電子カルテシステムをスクリプト言語で実装しようとして大失敗した某大学病院のプロジェクトがありましたが、そら無理でしょ。 というのがこの辺の話です。

世の中知らない方がいいこともある、、ってやつでしょうか。 しればしるほどコンピュータシステムを使うときにドキドキしてしまうかもしれません。 :-P

コメントを残す