QA@IT

railsで時限タイマーを作成する

4741 PV

ruby on railsで時限タイマーのようなものを作りたいのですが、作り方がわかりません。
もしご存知の方がいらっしゃいましたら教えてください。

例えばブログの記事を更新して、その記事に作成して10日以内に閲覧者が10人来なかった場合、その記事が削除されるといったような実装をしたいのですが、どなたかわかる人はいらっしゃいますか?

回答

Railsに限らず通常Webアプリケーションの場合、厳密な意味での時限タイマーというのは出来ないと思います。

これはWebアプリケーションの実行の契機が「ユーザーがページにアクセスしたら」だからです。
なので、単純な処理としては
記事にアクセスされたときに

  • 作成日から10日以降か
  • 閲覧者が10人未満か を毎回チェックして、両方が trueなら削除処理を行うというパターンが考えられます。

気付かれているかもしれませんが、例えば記事を作成して最初の閲覧者が来たのが、作成してから 100日後であった場合、
その100日間はDBに記事が残っています。
(そして削除処理が走ってしまうので最初の閲覧者は記事を見ることはできません。見かけ上は10日で消えているようには見えます。)

どんな削除処理を作りこんでも、呼び出されなければ実行はされませんので(当然ですよね?)、
Rails的にはその時限タイマーを発動するきっかけがない。ということです。

より時限タイマー式にする方法としてはいくつか考えられますが、

  • 定期的に削除する処理を定期的に呼び出す
    Linuxならcron / Windowsならタスクとか使って、削除処理を実行します。
    専用のcontrollerとrouteを用意して定期的にそのページを見に行くでもいいですが、
    削除できればいいのでWebページである必要は必ずしもなくてバッチ処理を作成してそれを定期実行する手もあります。
    単純ですが、いつ実行するかが課題になります。

  • だれかがいずれかのページにアクセスしたら削除処理を走らせる
    たとえば誰かがトップページにアクセスしたら、全ての記事の削除チェックを行う。といったものです。
    これも誰もトップページに来なければ同じことが起こる上に、
    意図せずユーザーを待たせることにもなりますので、記事が少なくて削除処理が無視できるぐらいの時間でなければお勧めはしません。

  • DB上の実データはどうあれ、論理的に10日間しか残ってないように見えるならそれでよい
    前述の記事へのページアクセスのタイミングでその記事の削除チェックを行うままでよいというパターン。
    DBの容量が深刻でないならこれでもいいかもしれませんが、「現在アクティブな記事の数」「最新記事一覧」などの集計・表示を行いたい場合そうも行かない場合がでてきます(避けて集計すればいいんですが、パフォーマンスの課題が出てくるかもしれませんね)。

個人的にはバッチ処理をつくるか、アプリ側で10日で削除されたように上手く見せかけるか(1番目と3番目)が良く使われるような気がします。

編集 履歴 (0)

ご丁寧にいつもありがとうございます。
考慮した結果バッチ処理を行う方針で行こうと思います!
ありがとうございました。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。