Domanda

Devo offrire la pianificazione di azioni / eventi, nel nostro sito web. Un'analogia della merda potrebbe essere un sistema di calendario, in cui una persona aggiunge un elemento del calendario e quando la data / ora è stata "colpita", viene attivata una logica (ad es. Calcolare un rapporto).

Potrei avere centinaia e persino migliaia di eventi programmati che vengono inseriti dai miei clienti. Quando un client inserisce qualcosa per essere programmato, salverò tali informazioni nel database. Quindi suppongo che aggiungerò un evento / lavoro da qualche parte, che conterrà la chiave primaria della tabella del database. quando l'evento deve essere lanciato, prenderò quelle informazioni dal db, quindi farò la logica. fatto.

Quali sono alcune soluzioni comuni per gestirlo?

Sto usando .NET 3.5 SP1. DB è Sql Server 2008. L'interfaccia utente verrà tuttavia suddivisa in web.

Non ero sicuro che le persone usassero MSMQ? O qualcosa incorporato in SQL Server? O alcune librerie open source (ad es. Quartz.NET ) con un servizio NT. Il server sarà Windows 2008 standard edition.

Inoltre, non suggerire di utilizzare un cron job equivalente o eventuali script da riga di comando, ecc.

Finalmente, e questo è un obiettivo secondario .. mi piacerebbe vomitare su azzurro per shiz e risatine ... quindi è anche possibile? è solo un'idea della lista dei desideri. Preferirei farlo su una scatola dedicata se la soluzione è più semplice rispetto all'utilizzo di Azure.

evviva :)

modifica: la logica da elaborare quando un evento deve essere generato, sono lavori in background. Nessuna interfaccia utente richiesta.

È stato utile?

Soluzione

Quartz.NET probabilmente potrebbe anche gestire abbastanza bene questi requisiti. I vantaggi che vedo sono in vari modi di impostare lo scheduler (CronTrigger + calendari) e la possibilità di avere i tuoi lavori in piccole unità di codice testabile (lavori).

Quartz.NET offre anche la distribuzione e il failover necessari con le funzionalità di clustering. Una bella caratteristica è anche la configurazione configurabile per trigger di gestione degli incendi che ti dà la possibilità di reagire agli incendi e ai tempi di inattività dello scheduler.

SQL Service Broker sembra non avere il vantaggio di non eseguire il polling, mi chiedo comunque se questo sarà mai il problema, il broker ha lo svantaggio di sembrare un po 'complicato (almeno dalla descrizione che ho letto sopra).

Solo i miei $ 0,02 di parte.

Altri suggerimenti

Foundation Workflow può farlo. Utilizza una Attività di ritardo , imposta il TimeSpan su (DesiredTimeOfExecution - Now) . Per sistemi di dimensioni maggiori, impostare UnloadOnIdle su true e i flussi di lavoro in sospeso verranno mantenuti fino a quando necessario.

Ecco un esempio molto semplice dell'attività di ritardo .

WF è gratuito , incluso come parte di .NET Framework 3.0.

Quello che vuoi è SQL Server Service Broker.

È possibile eseguire l'accesso al database temporizzato per eseguire query sui dati del calendario, ecc. È basato su messaggi, più potente di MSMQ, non richiede polling e può essere utilizzato in ambienti distribuiti se è quello che ti serve. Funziona benissimo per me!

Verrà eseguita una procedura memorizzata per inserire le informazioni sull'evento in una coda SSB nel database. In futuro darai a quel messaggio un momento per riattivare ed elaborare un'altra procedura memorizzata che raccoglie i dati del tuo evento e inserisce una coda di prelievo che esegue un'attivazione esterna. EA invia una notifica a un servizio Windows che punta a un'app console. L'app per console prende le informazioni sull'evento dalla coda di prelievo. Ora hai i dati del tuo evento nel momento esatto in cui li desideri. Elaboralo come preferisci nell'app console.

Esiste una curva di apprendimento, ma ne vale la pena se hai bisogno dell'affidabilità, flessibilità e scalabilità che offre SQL Service Broker. Di seguito sono riportati alcuni link per iniziare.

Ecco un confronto: SQL Service Broker vs. MSMQ

SO mi permetterebbe solo di pubblicare un link purtroppo. Altrimenti potrei indicarti più risorse per aiutarti a iniziare con SSB.

Spero che questo aiuti!

Un'opzione potrebbe essere la creazione di un processo SQL da eseguire a qualunque sia l'intervallo più granulare che hai e l'elaborazione di tutti i tuoi eventi allora.

Se vuoi il meglio dei mondi .NET e SQL Server puoi usa lavori SQL e chiama anche il codice gestito . Non ho alcuna esperienza con questa soluzione, quindi mi scuso anticipatamente se la risorsa che ho fornito non è molto approfondita.

Se le attività sono molto complesse e non si desidera caricare gli assembly su SQL Server o semplicemente non ti piace il loro sistema di pianificazione, consiglierei un servizio Windows .NET con un plug-in di pianificazione di terze parti. Personalmente, se tutto il codice potesse essere conservato in una procedura memorizzata o in una serie di procedure memorizzate, farei un lavoro poiché penso che sia molto più facile da gestire e molto del lavoro è già stato fatto per te.

Modifica

Ho appena notato un commento che spiega la granularità. Se hai alcune azioni che devono essere eseguite ogni minuto, una soluzione di servizio .NET sarebbe probabilmente più semplice poiché probabilmente dovresti implementare una sorta di soluzione multi-thread.

Avrai bisogno di un pianificatore di lavoro e di un gestore dei lavori poiché hai una granularità ridotta e devi sapere a priori se tutti i lavori che si verificano in un determinato minuto finiranno al minuto successivo.

Ciò semplifica il lavoro dello scheduler. Dovresti avere una tabella DB che memorizza i tuoi lavori e ogni minuto un servizio di pianificazione lavori vai a quella tabella e seleziona i lavori che devono essere fatti.

Accodera quei lavori con un gestore lavori. È possibile utilizzare un'altra tabella o una coda transazionale per accodare il lavoro. Il servizio di gestione dei lavori monitorerà la coda dei lavori. Puoi crearne uno tuo o usare BizTalk per monitorare la coda dei lavori e dare il via a un'orchestrazione o flusso di lavoro . Tirerà fuori le attività una alla volta, eseguirà le attività e aggiornerà lo stato del lavoro nel DB.

Il tuo problema sarà la scalabilità in base al numero di utenti, al numero di attività che accodano e all'intensità (tempo, memoria, CPU, ecc.) di ciascuna attività. Se fossi in te, respingerei la granularità temporale di 1 minuto e la spingerei a 5 minuti. Cosa devi fare alle 13:38 che non puoi aspettare fino alle 13:40 per? :)

Questo è già un problema discusso su StackOverflow. consulta Hai bisogno di un programmatore di lavoro in asp.net

Hai dimenticato di aggiungere le informazioni più essenziali alla tua domanda: ASP.Net

Descrive un framework dello scheduler per le app Web ASp.Net che può funzionare come un servizio e offre un metodo che viene periodicamente chiamato e quindi è possibile attivare la logica per caricare eventi, mettere in coda quelli validi utilizzando i timer.

Inoltre, questo è il più economico di tutte le alternative. Spero che questo sia quello di cui hai bisogno.

Dipende un po 'dalla natura del sistema. Partendo dal presupposto che la definizione completa degli eventi sia archiviata nel database:

  • Se l'evento deve causare qualcosa in un'interfaccia utente Web, negli aggiornamenti controlla la tabella per le voci che si sono verificate e aggiungi gli indicatori visivi / schermate / popup appropriati al successivo output della richiesta web.
  • Se i tuoi eventi si riferiscono all'elaborazione in background, la soluzione più semplice è scrivere un'applicazione .NET stand-alone separata che sottopone a polling la tabella degli eventi del database per nuovi record e controlla in tempo per vedere quali eventi sono accaduti. Puoi diventare fantasioso e coinvolgere il threading se alcuni degli eventi causano processi di lunga durata, ecc., Ma questo sarebbe il design di base. (Usa il threading solo se devi ... una semplice app a thread singolo che esegue il polling della tabella sarebbe più robusta)
  

Quindi suppongo di aver aggiunto un evento / lavoro da qualche parte, che conterrà la chiave primaria della tabella del database. quando l'evento deve essere lanciato, prenderò quelle informazioni dal db, quindi farò la logica.

Non so quale sia la soluzione comune ma, reinventando la ruota, penserei di creare un indice cluster del database al momento dell'evento, in modo da poter eseguire il polling del database ogni minuto con un'istruzione come ...

SELECT * FROM Events WHERE Events.Time < next_minute
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top