2009-10-25 17 views
7

Sto scrivendo un'applicazione Web utilizzando Catalyst framework. Sto anche usando una coda di lavoro chiamata TheSchwartz.Come dovrei strutturare meglio la mia applicazione web usando le code di lavoro [e Perl/Catalyst]?

Sto volendo usare una coda di lavoro perché sto volendo la maggior parte del codice specifico dell'applicazione disaccoppiata dal codice dell'interfaccia dell'applicazione web.

In sostanza l'intero sistema è costituito da tre componenti principali:

  • GUI (Catalyst interfaccia web)
  • Un crawler
  • Un "attacco componente" (l'applicazione è in fase di scrittura alla ricerca di XSS e Vulnerabilità SQLi in altre applicazioni/siti web)

Quindi in teoria la GUI crea lavori per il crawler che a sua volta crea lavori per il "componente di attacco".

Attualmente ho un modello in Catalyst che crea un'istanza di un oggetto TheSchwartz in modo che i controllori nell'app Web possano aggiungere lavori alla coda di lavoro.

Devo anche creare alcuni script di job worker che ascoltino continuamente (/ controllano il database) per i nuovi lavori in modo che possano eseguire le azioni richieste. Attualmente il materiale specifico per DB per TheSchwartz è nel modello in Catalyst e non penso di poterlo accedere facilmente al di fuori di Catalyst?

Non voglio duplicare i dati di connessione DB per la coda di lavoro di TheSchwartz nel modello e quindi nei miei script di Job Job. Dovrei racchiudere la creazione dell'oggetto TheSchwartz in un'altra classe che si trova all'esterno di Catalyst e chiamare nel modello che attualmente crea un'istanza dell'oggetto TheSchwartz? Quindi potrei anche usarlo negli script di lavoro. O dovrei avere i dati del DB in un file di configurazione e istanziare nuovi oggetti TheSchwartz come e quando ne ho bisogno (all'interno di Catalyst/all'interno degli script di Job Job)?

O mi sto solo pensando?

Alcuni collegamenti ad articoli di architettura di app web carnosi possono anche essere utili (non ho mai costruito uno di complessità moderata prima ..).

Acclamazioni

risposta

4

Si sta utilizzando DBIx :: Class? L'idea di base qui si applica anche se non lo sei, ma ho intenzione di andare avanti e assumere che tu sia.

Un modello Catalyst deve essere un wrapper per un'altra classe, che fornisce un comportamento sufficiente all'interfaccia con Catalyst e nient'altro. Ad esempio Catalyst :: Model :: DBIC :: Schema è solo un wrapper per DBIx :: Class :: Schema. Riceve la configurazione da Catalyst e la trasferisce al DBIC, inietta i ResultSet nello spazio dei nomi del modello (in modo da poter eseguire il trucco $c->model('DB::Table')) e quindi si disinteressa.

Il vantaggio è che poiché tutto il codice importante risiede al di fuori di Catalyst :: Model, è completamente indipendente da Catalyst. Puoi caricare il tuo schema da uno script di manutenzione o da un job manager o qualsiasi altra cosa, passargli qualche configurazione, dirgli di connettersi e andare, senza mai richiamare Catalyst. Tutte le informazioni e la logica contenute nei ResultSet e in qualsiasi altra cosa sono ugualmente disponibili al di fuori di Catalyst come all'interno.

3

Se ho capito bene, la tua domanda è "come riutilizzare la mia connessione al database al di fuori di Catalyst?".

È necessario utilizzare DBIx :: Class nell'applicazione Catalyst. È possibile riutilizzare gli stessi file in qualsiasi altra applicazione. $c->mode('DB::MyTable')->search(...) nel catalizzatore è lo stesso di questo al di fuori di catalizzatore:

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

Ogni modello può essere chiamato al di fuori di catalizzatore come un pacchetto normale MyApp :: Modello :: Library-> new(). Vuoi solo assicurarti di non usare $ c come argomento.

+1

Un buon numero di modelli non funzionerà se lo fai. Lascia la classe dell'app vuota e config non inizializzata, e non chiama ACCEPT_CONTEXT, quindi i modelli scritti in base al modello di adattatore * raccomandato * non funzioneranno affatto. – hobbs

2

Una delle cose che dovresti dare un'occhiata è usare TheSchwartz::Simple per creare lavori piuttosto che TheSchwartz stesso (di cui hai davvero bisogno solo per elaborare i lavori). I vantaggi sono:

  • leggero (non c'è bisogno di caricare l'intero del TheSchwartz nel vostro Catalyst App)
  • Accetta un semplice manico database per la connessione al database, mentre TheSchwartz essenzialmente ha il proprio livello di database involucro e volontà vuoi dargli nomi utente e password e gestire la propria connessione (che hai detto che non vuoi che faccia)
Problemi correlati