kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

トランザクションを減らすという考え方


Windows Azure Storage Service を用いた在庫管理の設計 – The First Virtue – Site Home – MSDN Blogs

自分はこうしないなー等と思ってみた。

 

そもそもの「注文処理では、この在庫管理テーブルの商品から在庫量を読み取り、必要な注文数が確保できるかどうかを確認します。」の前提が自分の思う所とは食い違うって感じ。

 

歴史的な流れとして、システムのアーキテクチャで一貫性をどこが提供してきたでしょうか。

長らく使われてきた RDBMS に至る流れとしては基本的にはストレージが一貫性を提供するという物です。

「ストレージに保存されたデータは正である」と言っても良いでしょう。

そのストレージをいかに一貫して更新するか、出来るだけ競合を発生させない様にすると共に、発生したとしてアトミックな更新をどうやって提供するのかはストレージが原則として使われてきたわけです。

 

そして、ストレージが一貫性を提供するという考え方の基本は「マシンがいつ落ちるか解らない」という前提に立っているのです。マシンが落ちたとしてもデータを保持し続けるのがストレージの役目ですから。

さて、この前提ははたして現在でも正しいのでしょうか?楽観的悲観的どっちにしてもトランザクションを使って一貫性を提供する理由の第一の前提がこれです。

マシンがいつ落ちるか解らないという様な危うさはもう過去の話でしょう。(まぁ、数万台いればなんかしら落ちてるのは当然でしょうが、1台が頻繁に落ちるなんてのは無いというか、それ修理に出そうぜの世界です。)

 

前提はもう変わった、過去の話だとして考えるならどうでしょう。

1000個を売るのにWebサーバ(アプリケーションサーバ)が4台居たとして、それぞれに250個売らせれば良いなら各アプリケーションサーバに250個づつ売れという4トランザクションで1000個の物は売れます。

100個割り当てて30個売った時点でアプリケーション(の実行サーバが)落ちたとしての障害復旧を考えるなら売上のトランザクションデータを舐めれば70個売れてるって事は解るし、マシンが落ちてからの復旧の手順としてそれを織り込んでおけば1個単位が売れる事での在庫処理トランザクションは必要無いって事です。

受注を書きこむというトランザクションは当然にしっかりしている必要がありますが、そこが担保されているなら在庫処理トランザクションは割り当てられた個数売り切るまではアプリケーションサーバに割当たってるって事だけ知っててそれをカウントダウンすれば済む話です。マシンローカルというか、オンメモリの物だったら Interlocked でオペレーションすれば少なくともアトミック性や一貫性なんて物は自動的に提供されてるよねって話。

障害復旧で過去の全受注を舐めなきゃいけないとなると大きな話でWorkerRoleで多並列で処理してとか大きな事になりますが、在庫をアプリケーションサーバから割り当ててからの一定範囲を、そのアプリケーションサーバでとった受注を舐めるなんて別に大した話では無いでしょう。

 

Application_End で在庫を中央でのストレージベースの管理系に返す、とる時はがばっと取る、がばっと取ったというログレコードをちゃんと残して障害復旧時に舐める範囲を限定できるようにする。個別の受注時にはちゃんと受注明細を残す。これさえ満たせば受注明細を残すのは元々変わらないとしても在庫に関してはいちいちトランザクションを細かくする必要なんてありません。

一貫性を提供するのはどこの何か、安定して動く電源が確保されるならばそれはメモリで何の問題がありますか?電源的なトラブルとかで終了処理もまともにできない様なアプリケーションの落ち方はめったにないよね、あったとしてストレージで一貫性が提供される物をある程度舐めれば済む範囲であればそれを元に障害復旧できるよね。これが満たされる物であれば楽観的同時実行制御の様なトランザクション自体を消す事はできるし、トランザクションすなわち並行性に対する競合点ですので、消せばその分性能は上がるわけですよね。

 

てな感じで考える足がかりを作るとその先は結構トランザクションを消せるし減らせるっていうヨタでございました。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。