6

Rails アプリケーション用に N 個の dyno があり、それらすべてに対してコマンドを実行したいと考えています。それを行う方法はありますか?runningrails r "SomeRubyCode"はすべての dyno で実行されますか?

M 分ごとにサードパーティと同期するプラグインを使用しています。問題は、サードパーティのサービスがタイムアウトすることがあり、さらに M 分が経過するのを待たずにもう一度実行したいということです。

4

2 に答える 2

9

いいえ。1 回限りのコマンド ( などheroku run bash) は、別の 1 回限りの dyno で実行されます。これを実現するには、すべての dyno がリッスンする何らかの種類の pubsub/メッセージ キューをセットアップする必要があります。https://devcenter.heroku.com/articles/one-off-dynos

于 2013-02-11T14:25:55.343 に答える
4

(私のコメントを回答に変えるように求められました...この機会に説明します。)

プラグインがサードパーティのサービスと「同期」するために何をする必要があるかについての詳細はわかりませんが、プラグインは基本的に Web アプリケーションが使用する一時的なデータを取得するという前提で進めます何とかして。

同期または取得プロセスが失敗することがあり、Web アプリケーションは最新のデータに依存しているため、「同期」プロセスを手動で実行するオプションが必要です。現在、プラグイン自体からこれを行う唯一の方法は、すべての dyno でいくつかのコードを実行する必要があることを意味しますが、他の人が指摘しているように、現在は不可能です。

以前の同様のシナリオ (外部サービスから分析をフェッチする) で行ったことは単純です。

  1. Redis を使用して Heroku アプリをプロビジョニングおよび構成する
  2. コードを単純に実行してデータを取得する rake タスクを作成し (そうでなければプラグインによって実行される)、そのデータをキャッシュに書き込みます。
  3. アプリで通常データを取得する場合は、まずキャッシュからの取得を試みます (キャッシュ ミスの場合は、同じコードをもう一度実行します。これは、データが更新される前にキャッシュから期限切れになったことを意味します)。

次に、Heroku のシンプルなスケジューラを使用して、n分ごとに上記の rake タスクを実行し、データを最新の状態に保ち、常にキャッシュ内に保持しようとしました (キャッシュの有効期限はn分弱に設定されていました)。データフェッチが発生します。キャッシュの有効期限をneverまたはn以上に設定することもできましたが、これはミッションクリティカルではありませんでした.

このようにして、最新の分析が表示されていることを確認たい場合は、a) Redis に接続してアイテムをキャッシュから削除するか、(より簡単に) b) heroku run rake task.

繰り返しますが、これは主に、すべての dyno 間で共有する必要があるデータを取得する場合にのみ機能します。

これは明らかに逆には機能しません。たとえば、メトリクス (たとえば、リクエストごとに費やされた時間) を dyno ごとに定期的に送信したい集中型サービスがあるとします。Heroku を使用してこれを行うための簡単でエレガントな方法は考えられません (すべてのオーバーヘッドを伴うリアルタイム以外では)。

于 2013-02-20T03:38:30.603 に答える