登録されたデータが指定時刻になるとAという処理(例えばオークションが終了するとメール配信)を動かしたいと思います。この場合の実装方法として一般的なのは、次のうちどれでしょうか?LAMP環境を前提としてください。


(a) cronに1分毎に終了時刻をチェックして、該当データがあればAを起動する処理を登録。
(b) デーモンに常駐してDBを監視するようなプログラム
(c) その他

回答の条件
  • 1人2回まで
  • 登録:2008/08/28 07:35:44
  • 終了:2008/09/04 07:40:02

回答(5件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/08/28 11:19:46

ポイント20pt

「指定時刻になるとAという処理」を行うのであれば、指定時刻を入れて cron を一度だけ起動すればいいと思います。


もし、DBにあるデータを一定間隔で監視したいなら、デーモンを作った方がサーバの負荷は減ります。

id:logihot

例えば、オークションですと、一日数千件の終了データがあると思います。その場合、毎度1件1件cronに追加する訳にはいかないので、特定プログラムを毎時セットするのが現実的ですね。

2008/08/29 13:26:16
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402008/08/28 10:02:47

ポイント20pt

要件によるでしょう。

ただ、「指定時間ぴったしに」ということであれば (a) が多いかもしれませんね。

(b) 形式だと前の処理が終わってなかったりすると「指定時間以降に」という設定になってしまいますし。

id:logihot

(B)は開発も面倒ですね。

2008/08/29 13:26:32
id:standard_one No.3

standard_one回答回数252ベストアンサー獲得回数232008/08/28 09:32:37

ポイント20pt

他所様のデータを参照するならa

自前ならc(終了処理にメール送信機能をフックしておく)

id:logihot

終了処理をどう起動するか、を知りたいです!

2008/08/29 13:27:10
id:pahoo No.4

pahoo回答回数5960ベストアンサー獲得回数6332008/08/29 15:11:58

ポイント20pt

例えば、オークションですと、一日数千件の終了データがあると思います

この場合、まず終了時刻をテーブルにセットします。

その終了時刻テーブルを監視するデーモンが動いており、終了時刻になった取引を検出次第、終了手続きタスクを起動するのが一般的かと思います。

この際、監視デーモンが複数起動しないようにしておくことが肝要です。

id:logihot

ありがとうございます。

2008/08/30 18:34:20
id:kazumichi No.5

kazumichi回答回数14ベストアンサー獲得回数22008/08/30 11:07:32

ポイント20pt

マッシュアップ的サイト構築のために、(a)で2000行、(b)で3000行くらいのLAMP実装経験を持つものです。

結論から言いますと、(a)がお勧めです。

理由は、Perlはデーモンに常駐させることを想定した言語ではなく、ネットワークの遅延などでプログラムの反応が遅くなったり無くなることがまれにり、その際catch exceptionなどの救済実装があまり一般的でないためです。

(b)でもプログラムの反応に目を瞑れば可能ですが、バグが一つでもあると落ちてしまうので、バグをすべて取り除く作業が非常に煩雑でした。(その際、Encode.pmのconvertの'auto'における潜在的なバグなど、自分のプログラム以外の箇所で腐心しました。)

ただし、実際インプリしてみて、起動や処理にかなり時間が要するプログラムが出来上がった場合は、この手法を選択することになると思います。

言うまでもないことかもしれませんが、(a)の場合、「lockファイルを使う」「psで同一のプロセスが生きてないか確認する」など重複回避処理をお忘れなく。

(間違った表現があればお許しください。)

id:logihot

実務に基づくアドバイスで大変参考になります。

2008/08/30 18:34:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません