Frage

Ich schreibe eine Web-Anwendung, den Catalyst-Framework verwenden. Ich bin auch ein Job Queue namens TheSchwartz .

Ich bin zu wollen, eine Job-Warteschlange verwenden, weil ich so viel von dem anwendungsspezifischen Code entkoppelt von dem Web-Anwendung Interface-Code zu wollen.

Im Wesentlichen das gesamte System besteht aus drei Hauptkomponenten:

  • GUI (Katalysator Web-Interface)
  • Ein Crawler
  • Eine "Angriff Komponente" (die App geschrieben wird für XSS und SQLi Schwachstellen in anderen webapps / Site suchen)

Also in der Theorie der GUI Arbeitsplätze für den Crawler schafft wiederum die Arbeitsplätze für die „angreifende Komponente“ erstellt.

Zur Zeit habe ich ein Modell in Katalysator, der ein TheSchwartz Objekt instanziiert, so dass Controller in dem Web-App Aufträge an die Jobwarteschlangen hinzufügen kann.

Ich brauche auch einige Jobs Arbeiter Skripte zu erstellen, die kontinuierlich (/ überprüfen Sie die Datenbank) für neue Arbeitsplätze hören, so dass sie die gewünschten Aktionen ausführen können. Derzeit ist die DB speziellen Sachen für TheSchwartz sind in dem Modell in Katalysator und ich glaube nicht, dass ich einfach, dass außerhalb des Katalysators zugreifen kann?

Ich will nicht die DB-Verbindungsdaten für TheSchwartz Auftragswarteschlange im Modell kopieren und dann in meinem Job Arbeiter-Skripten. Soll ich die Schaffung von TheSchwartz Objekt in einer anderen Klasse sitzen außerhalb der Katalysator wickeln und rufen, dass in dem Modell, das derzeit Instanziieren TheSchwartz Objekt? Dann könnte ich auch in dem Arbeiter-Skripte verwenden, die. Oder soll ich die DB-Daten in einer Konfigurationsdatei und instanziiert neue TheSchwartz Objekte wie und wann ich sie brauche (innen Katalysator / inside job Arbeiter Skripte)?

Oder bin ich nur über das gedacht?

Einige Links zu fleischig Web-App-Architektur Artikeln auch nützlich sein können (ich habe noch nie eine moderate Komplexität aufgebaut ..).

Prost

War es hilfreich?

Lösung

Sind Sie mit DBIx :: Class? Die Grundidee hier gilt auch, wenn Sie nicht, aber ich werde gehen Sie vor und nehmen an, dass Sie sind.

Es soll ein Katalysator Modell ein Wrapper für eine andere Klasse sein, gerade genug, um das Verhalten bietet mit dem Katalysator zu verbinden, und nichts anderes. Zum Beispiel Katalysator :: Modell :: DBIC :: Schema ist nur ein Wrapper für DBIx :: Class :: Schema. Es wird die Config von Katalysator und leitet sie an DBIC es die Resultsets in das Modell-Namensraum injiziert (so dass Sie die $c->model('DB::Table') Trick tun können), und dann wird es aus dem Weg.

Der Vorteil ist, dass, da alle wichtigen Code außerhalb des Katalysators :: Modell lebt, es ist völlig unabhängig von Katalysator. Sie können Ihr Schema aus einem Wartungs Skript oder einem Jobqueue Arbeiter oder was auch immer, übergeben Sie es einige Config laden, es sagen zu verbinden und zu gehen, ohne Katalysator jemals aufgerufen wird. Alle Informationen und Logik, die als innen ist ebenso verfügbar außerhalb des Katalysators in den Resultset und was sonst ist.

Andere Tipps

Wenn ich richtig verstehe, Ihre Frage ist: „Wie kann meine Datenbankverbindung außerhalb des Katalysators wieder verwenden?“.

Sie sollten DBIx :: Klasse innerhalb Ihrer Katalysatoranwendung verwendet wird. Sie können die gleichen Dateien in anderen Anwendungen wiederverwenden. $c->mode('DB::MyTable')->search(...) in Katalysator ist der gleiche wie dieser außerhalb des Katalysators:

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

Jedes Modell kann außerhalb von Katalysator wie ein normales Paket MyApp :: Modell :: Library-> new () aufgerufen werden. Sie wollen nur sicherstellen, dass Sie nicht über $ c als Argument verwenden.

Eines der Dinge, die Sie einen Blick darauf werfen sollen verwendet TheSchwartz :: Simple Arbeitsplätze zu schaffen, anstatt TheSchwartz selbst (die Sie wirklich nur brauchen, um Arbeitsplätze zu verarbeiten). Die Vorteile sind:

  • Leicht (keine Notwendigkeit, das gesamte von TheSchwartz in die Catalyst-App zu laden)
  • Akzeptiert eine einfache Datenbank-Handle für die Datenbank zu verbinden, während TheSchwartz es im Wesentlichen hat eine eigene Datenbank-Wrapper-Schicht ist und möchten Sie es Benutzernamen und Passwörter geben und eine eigene Verbindung verwalten (die Sie gesagt haben Sie es nicht wollen zu tun)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top