7

Catalyst フレームワークを使用して Web アプリケーションを作成しています。TheSchwartzという Job Queue も使用しています。

Web アプリケーション インターフェイス コードから切り離されたアプリケーション固有のコードが必要なため、ジョブ キューを使用したいと考えています。

基本的に、システム全体は次の 3 つの主要コンポーネントで構成されています。

  • GUI (Catalyst Web インターフェイス)
  • クローラー
  • 「攻撃コンポーネント」 (アプリは、他の Web アプリ/サイトで XSS および SQLi の脆弱性を探すために作成されています)

したがって、理論的には、GUI はクローラーのジョブを作成し、それが「攻撃コンポーネント」のジョブを作成します。

現在、Web アプリのコントローラーがジョブ キューにジョブを追加できるように、TheSchwartz オブジェクトをインスタンス化する Catalyst のモデルがあります。

また、必要なアクションを実行できるように、新しいジョブを継続的にリッスン (/データベースをチェック) するジョブ ワーカー スクリプトを作成する必要もあります。現在、TheSchwartz の DB 固有のものは Catalyst のモデルにあり、Catalyst の外部から簡単にアクセスできないと思いますか?

モデルで TheSchwartz ジョブ キューの DB 接続データを複製してから、ジョブ ワーカー スクリプトで複製したくありません。TheSchwartz オブジェクトの作成を Catalyst の外部にある別のクラスでラップし、現在 TheSchwartz オブジェクトをインスタンス化しているモデルでそれを呼び出す必要がありますか? 次に、それをワーカー スクリプトでも使用できます。または、DB データを構成ファイルに格納し、必要に応じて新しい TheSchwartz オブジェクトをインスタンス化する必要があります (Catalyst/ジョブ ワーカー スクリプト内)。

それとも私はこれを考えすぎていますか?

肉付きの良い Web アプリ アーキテクチャの記事へのリンクも役に立つかもしれません (中程度の複雑さの記事を作成したことはありません..)。

乾杯

4

3 に答える 3

4

DBIx::Class を使用していますか? ここでの基本的な考え方は、あなたがそうでなくても当てはまりますが、私はあなたがそうであると仮定して先に進みます。

Catalyst モデルは、別のクラスのラッパーであり、Catalyst とのインターフェイスに必要な動作だけを提供する必要があります。たとえば、Catalyst::Model::DBIC::Schema は DBIx::Class::Schema の単なるラッパーです。Catalyst から構成を取得して DBIC に渡し、ResultSet を Model 名前空間に挿入して ($c->model('DB::Table')トリックを実行できるように)、邪魔にならないようにします。

利点は、すべての重要なコードが Catalyst::Model の外にあるため、Catalyst から完全に独立していることです。メンテナンス スクリプトやジョブキュー ワーカーなどからスキーマをロードし、何らかの構成を渡し、Catalyst を呼び出すことなく、接続して実行するように指示できます。ResultSets に含まれるすべての情報とロジック、および Catalyst の外部でも内部と同様に利用できるその他すべてのもの。

于 2009-10-26T02:20:17.203 に答える
3

私の理解が正しければ、あなたの質問は「データベース接続を Catalyst の外で再利用するにはどうすればよいですか?」です。

Catalyst アプリケーション内で DBIx::Class を使用する必要があります。他のアプリケーションで同じファイルを再利用できます。$c->mode('DB::MyTable')->search(...)in Catalyst は、Catalyst の外でこれと同じです:

my $schema = MyApp::Model::DB->new();
$schema->resultset('MyTable')->search(...)

通常のパッケージ MyApp::Model::Library->new() のように、任意のモデルを Catalyst の外部で呼び出すことができます。$c を引数として使用しないようにする必要があります。

于 2009-10-26T02:23:36.360 に答える
3

注目すべきことの 1 つは、TheSchwartz 自体ではなく、TheSchwartz::Simpleを使用してジョブを作成することです (ジョブを処理するためにのみ必要です)。利点は次のとおりです。

  • 軽量 (TheSchwartz 全体を Catalyst アプリにロードする必要はありません)
  • データベースに接続するための単純なデータベース ハンドルを受け入れますが、TheSchwartz には基本的に独自のデータベース ラッパー レイヤーがあり、ユーザー名とパスワードを指定して独自の接続を管理する必要があります (これはやりたくないと言っていました)。
于 2009-10-27T11:14:02.433 に答える