--

--

コメント

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
管理者にだけ表示を許可する

この記事のトラックバックURL

http://welcomevac201world.blog84.fc2.com/tb.php/466-5e350b3d

01

06

コメント

レスポンス速度の改善とバッチ処理

今CakePHPで作っているERPモドキなんですが、DBが

* 顧客
* 売上
** 伝票(着席して販売)
** 伝票無し販売(レシートのみ)

って感じになっている。

んで、各店舗での売り上げや顧客ごとの売上なんかを1日、1ヵ月、1年単位でまとめていく。

SQLでsumしてやれば、とある店舗の1ヵ月の売上は算出できる。
だけど遅い。

そのため、毎月の売上用のテーブルを用意する。
そうすると、SQLでは単純なselectになるので処理は早い。メモリも食わない。
だけど登録の時に統計データを更新していると登録が遅い。

んじゃーバッチでやろうか。←イマココ

「バッチでやる」というのは、"通常のリクエスト→レスポンス時間に影響を与えないで処理したい"っていう意味で使うものだと私は思うのだけど、果たしてそれでいいのか。

リクエスト→レスポンスの流れの外に毎日、毎月、毎年の売上の統計処理を入れることができればバッチは必要ない。登録処理が終わった段階で全ての統計処理が(ある程度タイムラグはあるかもしれないけど)終わっていることになる。そう考えると、マルチスレッドがいいのではないか...という発想が出てくる。

ここで、マルチスレッドにした場合には"ほぼリアルタイム"という言葉が脳内に浮かんでくると思う。
処理Aの最中に処理B、処理Cを実行すれば、Apache君はきっとABCを素早く終わらせるために頑張ってくれると思う。
ただ、やっぱりPHPでマルチスレッドは限界があると思う。PHPのソースは、先頭から順番に読んでいけば処理が全部理解できるのがやっぱりいいところだからだ。MVC?そんなの方便だ。開発内容を分離したい人たちが作った仕組みの一つにすぎない。
そうすると、"ほぼリアルタイム"が何ミリ秒の世界だとしたら、"ほぼリアルタイム"を何秒くらいまで我慢できればよいのか想像すればよいのではないだろうか。

1分?

ほら、やっぱりバッチでいいじゃないか。

よし、バッチでいこう。

なに?1秒以内がいいだって?

それならCakePHPは使うのをやめよう。そして、たぶんnode.jsを使ったほうが優秀だ。
ただもしあなたが1秒以内の情報を毎日1440回以上見ないのであれば、私は現段階ではCakePHPで作成することをお勧めする。

開発コストを上げることができないだって?

1分我慢できないんだったら、机の上のいらない紙をシュレッドするか、お客様の空いたお皿の一つでも下げれば1分なんてあっという間さ。

よし、バッチでいこう。←イマココマデキタ


バッチ処理をやるにしてもやらないにしても、リソースのことを常に考えることは重要なことだと思う。
毎日、毎月、毎年のデータを作成するのであれば、「店舗aの毎日売上データを更新せよ!」っていう指示があってから動くのが理想的だと思う。
cronの設定が分単位までしか対応していないので、もし統計処理が終わっていないようだったら「ただいま処理中のデータがあります。しばらくしてから再表示してください」というメッセージでも出そう。
cronで毎分、更新指示を確認して、更新すればいいと思う。

更新指示あるかなー→無い→1分後、更新指示あるかなー→ある→キタ――(゚∀゚)――!!

これでバッチ設計は問題無い。

さてこれで統計処理は完全にバッチ化する方針で決まった。

んで、毎日、毎月、毎年のデータについては、

* 毎日のデータの更新後に毎月のデータを更新する指示を出す
* 毎月のデータを更新後に毎年のデータを更新する指示を出す

これでバッチ処理が無駄にならずに済む。

ただこの流れだと、もしかしたら10分くらいタイムラグがあるかもしれない。
だけど考えてみてほしい。1年単位のデータを作成するのに10分のタイムラグが果たして影響するかどうか。

よし、ぜんぜん大丈夫。これで行こう。

こうなってくると、連動しているデータは全部バッチ処理で大丈夫なんじゃないかって気がしてきた。
Webシステムはとにかくレスポンス時間が重要だから、ほとんどバッチ処理化して単純化することは、いいことのような気がしてきた。
ただそうするとバッチが動いてるかどうかの確認が必要だな...

よし、バッチの最終起動時刻を保存するテーブルを作ろう。
んで、バッチの最終起動時刻が相当過ぎていた場合(1分ごとのバッチなんだから、10分くらい動いてなければアラート出そう)、管理者に連絡せよとエラーメッセージを表示すればいいだろう。

うん、これでバッチ設計完了。
あとは細かい統計情報の作成処理を既存の処理から抜き出してその部分にバッチ実行指示を設定。
統計処理をバッチに外出しすればいいだろう。

\(^o^)/オワタ!


CakePHP2系のShellについて少し触れておくことにしたい。


bakeについて

CakePHPは「超絶速度で開発作業を進める」という目的を持って開発されています。
そのため、データベースに対して、CRUD(登録、検索、更新、削除)を行う画面を速攻で開発するためのツールがbakeです。
マスタデータの作成あたりに大変効果的であり、弊社の開発案件ではほとんどのモジュールのおおもとはbakeから自動生成されています。

CakePHPの格納されているディレクトリをCAKEとして

> cd CAKE/app/Console/

して

> ./cake [コマンド]

で実行したときの処理がバッチ処理になります

> ./cake bake

で各パーツ

> ./cake bake all

でMVCの全部を出力します。

ただし、1テーブルにつき1回コマンドが必要です


shellについて

CakePHPは、「超絶速度で開発作業を進める」ということの他に、「SQLをあんまりわからなくても実装できる」という点も気を使っています。
ただしそうするとアクセス時の速度を犠牲にする可能性があります。
そうした場合に大量処理をする補助を行うのがshellになります。

CAKE/app/Console/Commandに格納されている
~Shell.phpが実行対象です

実行方法は、

> cd CAKE/app/Console/

して、

> ./cake [シェルの名前]

で実行できます。
例えば

> ./cake SummarySale

と実行すると CAKE/app/Command/Console/SummarySaleShell.php が実行されます。
開発の観点で言うと、SummarySaleShell.phpのfunction mainが実行されますので、function mainは必須になります。
関連記事
スポンサーサイト
管理者にだけ表示を許可する

この記事のトラックバックURL

http://welcomevac201world.blog84.fc2.com/tb.php/466-5e350b3d

ようこそ!

ブロとも申請フォーム

ブロ友申請大歓迎です!
一覧に表示されるので自動で相互リンクになります!

>> ブロ友申請はこちら <<

検索フォーム

最近のコメント

メールフォーム

名前:
メール:
件名:
本文:

FC2ブログランキング

人気ブログランキング

人気ブログランキング

ブログ村

アクセスランキング

[ジャンルランキング]
育児
811位
アクセスランキングを見る>>

[サブジャンルランキング]
パパ育児
58位
アクセスランキングを見る>>

やーんは今、

ブロとも一覧

Designed by

Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。