Rails アプリケーション用に N 個の dyno があり、それらすべてに対してコマンドを実行したいと考えています。それを行う方法はありますか?runningrails r "SomeRubyCode"
はすべての dyno で実行されますか?
M 分ごとにサードパーティと同期するプラグインを使用しています。問題は、サードパーティのサービスがタイムアウトすることがあり、さらに M 分が経過するのを待たずにもう一度実行したいということです。
Rails アプリケーション用に N 個の dyno があり、それらすべてに対してコマンドを実行したいと考えています。それを行う方法はありますか?runningrails r "SomeRubyCode"
はすべての dyno で実行されますか?
M 分ごとにサードパーティと同期するプラグインを使用しています。問題は、サードパーティのサービスがタイムアウトすることがあり、さらに M 分が経過するのを待たずにもう一度実行したいということです。
いいえ。1 回限りのコマンド ( などheroku run bash
) は、別の 1 回限りの dyno で実行されます。これを実現するには、すべての dyno がリッスンする何らかの種類の pubsub/メッセージ キューをセットアップする必要があります。https://devcenter.heroku.com/articles/one-off-dynos
(私のコメントを回答に変えるように求められました...この機会に説明します。)
プラグインがサードパーティのサービスと「同期」するために何をする必要があるかについての詳細はわかりませんが、プラグインは基本的に Web アプリケーションが使用する一時的なデータを取得するという前提で進めます何とかして。
同期または取得プロセスが失敗することがあり、Web アプリケーションは最新のデータに依存しているため、「同期」プロセスを手動で実行するオプションが必要です。現在、プラグイン自体からこれを行う唯一の方法は、すべての dyno でいくつかのコードを実行する必要があることを意味しますが、他の人が指摘しているように、現在は不可能です。
以前の同様のシナリオ (外部サービスから分析をフェッチする) で行ったことは単純です。
次に、Heroku のシンプルなスケジューラを使用して、n分ごとに上記の rake タスクを実行し、データを最新の状態に保ち、常にキャッシュ内に保持しようとしました (キャッシュの有効期限はn分弱に設定されていました)。データフェッチが発生します。キャッシュの有効期限をneverまたはn以上に設定することもできましたが、これはミッションクリティカルではありませんでした.
このようにして、最新の分析が表示されていることを確認したい場合は、a) Redis に接続してアイテムをキャッシュから削除するか、(より簡単に) b) heroku run rake task
.
繰り返しますが、これは主に、すべての dyno 間で共有する必要があるデータを取得する場合にのみ機能します。
これは明らかに逆には機能しません。たとえば、メトリクス (たとえば、リクエストごとに費やされた時間) を dyno ごとに定期的に送信したい集中型サービスがあるとします。Heroku を使用してこれを行うための簡単でエレガントな方法は考えられません (すべてのオーバーヘッドを伴うリアルタイム以外では)。