2011/03/22
無駄のないシステム
原発のニュースで霞んでる感じだが、 みずほ銀行のトラブルもずいぶん長期化しているようだ (義援金の振込が集中したことが原因との報道もある)。 銀行の決済システムなんて全く知らないので、ど素人の戯れ言なんだけれど、 「顧客がカットオフ時刻までに送金したら翌営業日にはトランザクションが済んでいる」って仕様は、 処理溢れに対して弱いんじゃないかなあという気がした。 極端なピークが来て一度でもバッチ処理が間に合わないと、積み残しが全部事故になっちゃうから。
USの銀行は、裏のシステムでどういう扱いになってるかは知らないけど、 顧客から見るとトランザクションが二相に分かれてるように見える。
最初のフェーズでは、支払元が小切手を振り出し、受取人はそれを自分の口座に入れる。 ここで、受取人口座の残高は増えるけれど、これはあくまで仮の残高。 二番目のフェーズでは、受取人銀行が支払元銀行へ小切手を照会し、 支払元銀行がそれをクリアして、支払元口座の残高が減り、受取人口座の仮残高が 確定残高となる。 支払元銀行が小切手をクリアできなければ、 全体のトランザクションがロールバックされ、受取人口座の仮残高は取り消される。 2-phase commitみたいなものだ。
日本でも企業間では小切手決済やってるからその限りでは同じように動いてるんだろうけれど、 USでは個人間決済もいまだ小切手中心なせいか、電信振込のシステムも この2相コミットを模倣しているように感じられる。 そもそも電信で他行に振り込んだら数日かかるのは普通だし(最近は速いのかな?)、 電子的にクレジットカードの支払いなどしても、 実際にコミットされるのに2-3日かかる (一度コミットされると、 記録される支払い日はコミットされた日ではなく支払い操作をした日とされる。 つまり、操作をした日から2-3日は「仮の状態」で、コミットが済んだら 遡って最初の日にきちんと支払いをすませた「ということになる」。)
一度のトランザクションでアトミックにこっちの口座残高が減ってあっちの口座残高が増える、 って方が確かにわかりやすいし便利だ。 USのシステムではロールバックを考慮しないとならないんでシステム的な手間は大きいし、 タイムラグを使った不正が発生する余地もある。つまり、 本来は口座残高に足りない小切手を切っちゃだめなんだけど、 照会が来るまでの時間に手当てする or トンズラする、ということが可能になる。 (今は電子的に仮照会をかけるシステムができたけど、 ちょっと前までは照会の手続きも人手によってたので、 米国本土の銀行発行の小切手を使ってハワイで高額の買い物をしようとすると 断られたりすることもあった。 実際、LAからハワイに来てすぐに車を買った時にはそれで クレジットカードも併用するはめになった。)
そのかわり、一時的に処理が集中した場合に、何が何でも翌日朝までに処理を終わらせなくても、 仮期間が1日2日伸びるだけ、と考えて処理を平均化できるというメリットはある。 まあ、本当にそうなっているかどうかは知らないんだけど。理屈の上ではそうだ。
定常状態で最も快適になるように最適化したシステムより、 通常運転で無駄が出ているようなシステムの方が、 非定常なイベントに対してより頑健である、ってことなのかもしれない。
Tags: Programming, 生活
Post a comment