1

JSON形式で一連の統計を定期的にパッケージ化する分析エンジンがあります。これらのパッケージを Rails サーバーに送信したいと考えています。パッケージが到着すると、Rails サーバーはそれを調べ、そこからモデル インスタンスを生成し (履歴の目的で)、コンテンツをユーザーに表示する必要があります。私は2つのアプローチを考えました。

1)Railsサーバーと同じホストに小さなアプリを配置して、これらのパッケージをリッスンします(ZeroMQを使用)。パッケージを受け取ると、アプリは CURL を介して Rails アクションを呼び出し、パッケージをパラメーターとして渡します。このアプローチに関する私の懸念は、サインインしたユーザーのみがモデルに影響を与えるアクションにアクセスできることを Rails サーバーがチェックすることです。このリスニング アプリ (したがって他のエンティティ) にアクセス可能なアクションを作成することで、重大なセキュリティ上の欠陥にさらされることになりますか?

2) 2 番目の方法は、リッスンしているアプリにパッケージを特別なデータベース テーブルにダンプさせるだけです。Rails サーバーは定期的にこのテーブルをチェックして新しいパッケージを探します。1 つ以上を検出すると、それらを処理してテーブルから削除します。

このようなことをするのは初めてなので、より良い解決策のために共有できるテクニックや経験があれば、ぜひ学びたいです.

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

4

3 に答える 3

0

ベンジャミンのリードに続いて、私はこの特定のアクションのためのフィルターを実装しました。

def verify_ip
  @ips = ['127.0.0.1']
    if not @ips.include? request.remote_ip
    redirect_to root_url
  end
end

ローカルホスト上のリスニングアプリがアクションを呼び出し、分析エンジンから受け取ったJSONパッケージをパラメーターとして渡します。ありがとうございました。

于 2013-02-28T14:00:06.847 に答える
0

routes.rb でリクエストに許可されているホスト名を制限することで、特定の呼び出しへのアクセスを制限できます。

post "/analytics" => "analytics#create", :constraints => {:ip => /127.0.0.1/}

ユーザーに最新情報を表示したい場合は、ポーリングを使用して約 1 分ごとにページを更新できます。

于 2013-02-27T09:48:06.853 に答える
0

1) はい、次の場合を除き、重大なセキュリティ違反を暴露しています:

  1. zeroMQ アプリは、レール側で認証と承認を行うために必要なデータを提供します
  2. Rails アプリは 127.0.0.1 インターフェイスでのみリッスンするように構成されているため、外部からアクセスすることはできません
  3. ベンジャミンが示唆するように、特定のルートを特定の IP に制限します

2) このアプローチは、delayed_job とよく似ています。https://github.com/collectiveidea/delayed_jobを見て、rake タスクを使用して新しいジョブを追加してください。

つまり、リスニング アプリは、パケットを受信したときにカスタムのdelayed_jobを追加する rake タスクを呼び出します。次に、delayed_job に負荷を処理させます。delayed_job の利点 (さまざまなキュー、スケーリングなど) の恩恵を受けます。難しい部分は結果を得ることです。

1 つのアイデアは、一意の ID を各ジョブに関連付けて、delayed_job タスクが結果をジョブ ID を結果に関連付けたデータ ストアに出力するようにすることです。このデータ ストアは単純なリレーショナル テーブルにすることができます

+----+--------+
| ID | Result |
+----+--------+

またはmemecache/redis/その他のインスタンス。そのデータ ストアをポーリングして、ジョブ ID に関連付けられた結果を探すだけです。ユーザーへの表示が完了したら、すべてを削除します。

3) Rails サーバーにデータを直接 POST しないのはなぜですか?

于 2013-02-27T11:33:42.867 に答える