2

Heroku で毎時間ホストされているデータベースを埋めるために、外部 API を呼び出す必要があります。

この目的のために、外部 API からすべてのデータを取得し、stdout に出力する ruby​​ スクリプトを作成しました。さて、これらの結果をデータベースに保存したいと思います。それにはさまざまな方法があります(より良い方法を知っている場合はコメントしてください)。

私が持っているもの(制約):

  • Heroku 上で動作する Ruby on Rails アプリケーション
  • Heroku でホストされている PG データベース
  • 「車」モデル、「タイトル」、「説明」、「価格」属性、および「ユーザー」モデルからの他の 1 つのネストされた属性 (PG と同じスキーマ)。
  • 異なる外部 API を照会する Ruby スクリプト
  • Ruby スクリプトは、毎時間 / 2 時間 / 日ごとに呼び出す必要があります。スクリプトは約 10 分間実行されます -> 結果の数に応じて 2 時間

それを行うための私の3つの異なる方法:

  • EC2 インスタンスでスクリプトを実行し、Ruby on Rails REST API ではなく、データベースへの直接の外部ログインをデータベースに入力します。問題は、Ruby on Rails バリデーターを要求しないことです。たとえば、データベースが変更された場合や、一部のデータを検証する必要がある場合は要求されません。
  • EC2 インスタンスでスクリプトを実行し、データベースに RoR REST API への cll を入力して、JSON / XML でデータを入力します。問題は、API からの呼び出しが 1000 回を超えると、dyno が高負荷で苦しむ可能性があることです。
  • Heroku の特定の dyno でスクリプトを実行する (いくつかの情報が必要です。Heroku でいくつかの情報が見つかりません)
  • (良い方法をご存知の方はコメントください)

どう思いますか ?明日「車」のモデルを変更する場合、古いモデルと新しいモデルを簡単に切り替えられるようにする必要があります。

ありがとうございました。

4

2 に答える 2

4

最良のアプローチは、バックグラウンド プロセスを使用して作業を実行することだと思います。http://sidekiq.org/や DelayedJobなどの gem にはすべて、ジョブをスケジュールする機能があります (この場合、ジョブは 2 時間後に再スケジュールされます)。

Heroku では、ワーカーは Web dyno とは別に実行されるため、パフォーマンスに干渉することはありません。また、ワーカーからモデルに直接アクセスできるため、API を公開する必要がないという点で物事をシンプルに保ちます。

このテーマに関する Heroku のドキュメントはたくさんあります。

于 2013-07-16T08:00:19.107 に答える
1

これを行うには、スクリプトを Rake タスクとして記述し、Heroku スケジューラを使用してタスクを特定の間隔で実行するようにスケジュールします。

複数のタスクがある場合は、スケジュールごとにタスクを分割してから、複数のスケジューラを追加するだけです。それらは1 回限りの dyno (通常料金で支払う) で実行され、同じコード ベースから実行されるため、既存のすべてのアプリ コード (モデル、ライブラリなど) を活用できます。

于 2013-07-19T20:28:54.163 に答える