4

Herokuスケジューラのドキュメントには次のように書かれています。

スケジュールされたジョブは、実行時間の短いタスクを実行するか、実行時間の長いタスクをバックグラウンドジョブキューにエンキューすることを目的としています。完了するまでに数分以上かかるものはすべて、ワーカープロセスを使用して実行する必要があります

スケジューラーがこれらのジョブに対して新しいdynoを開始し、コストがdynoとワーカーで同じである場合、キューにタスクを追加してワーカープロセスに実行させることの利点は何ですか?

4

2 に答える 2

9

スケジューラ タスク (または独自のカスタム クロック プロセス) でインターバル タスクをスケジュールし、実行しないことは、アーキテクチャ上のベスト プラクティスです。これの動機は、スケジュールされたジョブの記事で説明されていますが、要約すると、スケジューラーのプロセス/タスクは 1 つしか存在しないため、可能な限り軽量にする必要があります。スケジュールを実行で過負荷にし始めると、スケジュールの競合や不安定な動作に遭遇することがよくあります。

1 つのインターバル ジョブがハングするか、予想よりもはるかに長い時間がかかるとします。間隔が十分に狭い場合、これによりバックログが発生し始め、将来の間隔が延期またはスキップされる可能性があります.

また、コンポーネントの責任をできるだけ分離しておくのが賢明です。単一のコンポーネントが直交するタスクを担当するのではありません。これは、スケジューリングと実行を独立させることで、スケジュールされたジョブのユースケースに反映される一般的な設計手法です。

ベスト プラクティスはさておき、開発モードまたはブートストラップ モードで上記の結果を理解している場合は、そのようなアドバイスを無視してスケジューラ タスク内ですべてを実行することを選択できます。ジョブの競合や明らかな重複をデバッグするのが難しい場合は注意してください。

于 2012-06-21T15:57:16.747 に答える
0

まあ、これはあくまで推奨事項だと思います。Scheduler によって実行されるタスクがあり、このタスクを (Heroku 管理で) 手動で実行すると、エラーが発生します - このエラーはタイムアウトが原因です (各タスクには 30 秒の制限があるため)。しかし実際には、このタスクは中断されません。タスクは正しく終了します。

dyno が 1 つある場合、この 1 つの dyno でアプリケーションに Heroku を使用します。スケジュールされたジョブを実行すると、この dyno がスケジューラーになります -> 実行時間の長いタスクがある場合、ページは「アイドル」になります (スケジュールされたジョブが終了するまで正しく動作しません)。 .

于 2012-06-21T08:20:46.880 に答える