私はDjango Webアプリケーションを持っており、バックグラウンドで動作する(または実際には開始される)タスクがいくつかあります。
アプリケーションは次のようにデプロイされます。
- apache2-mpm-worker;
- デーモン モードの mod_wsgi (1 プロセス、15 スレッド)。
バックグラウンド タスクには次の特徴があります。
- 一定の間隔 (約 5 分ごと) で動作する必要があります。
- アプリケーション コンテキストが必要です (つまり、アプリケーション パッケージがメモリ内で利用可能である必要があります)。
- 電子メールの送信やデータベースの状態の更新など、それほど重くないタスクを実行するために、データベース アクセス以外の入力は必要ありません。
現在、この問題に対する最も単純なアプローチは、(mod_wsgi によって生成された) 既存のアプリケーション プロセスにピギーバックすることだと考えていました。タスクをアプリケーションの一部として実装し、それに HTTP インターフェースを提供することで、すべてのアプリケーションをメモリに保持している別のプロセスのオーバーヘッドを防ぐことができます。この HTTP インターフェイスに 5 分ごとにリクエストを送信する単純な cronjob をセットアップできます。アプリケーション プロセスは 15 のスレッドを提供し、タスクは非常に軽量で 5 分ごとにしか実行されないため、Web アプリケーションのユーザー向け操作のパフォーマンスが妨げられることはないと思います。
それでも...私はいくつかのオンライン調査を行いましたが、このアプローチを支持する人は誰もいません. 多くの記事では、本格的なメッセージング コンポーネント ( RabbitMQ を使用する Celery など) に基づく、より複雑なアプローチを提案しています。それはセクシーですが、私にはやり過ぎに思えます。一部の記事では、タスクを実行するスクリプトを実行する cronjob を設定することを提案しています。しかし、それもあまり魅力的ではありません。アプリケーション全体をメモリにロードし、いくつかの小さなタスクを実行し、プロセスを再び破棄する新しいプロセスを作成することになるからです。そして、これは5分ごとに繰り返されます。エレガントなソリューションのようには聞こえません。
そのため、前の段落の前の段落で説明したように、提案したアプローチについてのフィードバックを探しています。私の推論は正しいですか?(潜在的な) 問題を見落としていませんか? アプリケーションのパフォーマンスが妨げられないという私の仮定はどうですか?