Domanda

Abbiamo a che fare con un problema interessante su StackOverflow.

Abbiamo un sacco di piccoli "deve essere fatto presto-ish" compiti. Un esempio è l'aggiornamento liste "Domande correlate". Quello che abbiamo fatto in passato è quello di piggy-back tali compiti Onto caricamento della pagina di alcuni utenti.

Questo non è mai stato l'ideale, ma non è stato davvero notevole. Ora che così ha superato il punto di domanda 1.000.000, quegli utenti sfortunati stanno iniziando a sentirlo.

La soluzione naturale è quello di spingere in realtà questi compiti in secondo piano. Ci sono due grandi modi di fare questo sto valutando.

1. In IIS come un filo-Pool custom / Work-coda

In sostanza, abbiamo spin up pochi (non ThreadPool , in modo da non interferire con IIS) filetti e farli Servizi in alcune collezioni siamo spintoni funcs in.

La grande pro qui è la semplicità. Non devi preoccuparti di nulla marshaling, né abbiamo per assicurarsi qualche servizio esterno è attivo e risponde.

Abbiamo anche ottenere l'accesso a tutto il nostro codice comune.

L'aria è, beh, che non dovremmo usare thread in background. Le obiezioni che conosco sono tutti concentrati intorno affamati IIS (se si utilizza ThreadPool) ed i fili che muoiono in modo casuale (a causa di riciclaggio AppPool).

Abbiamo le infrastrutture per rendere il filo morte casuale di un non-problema esistente (la sua possibile rilevare un compito è stato abbandonato, in fondo), e limitando il numero di thread (e utilizzando thread non ThreadPool) non è difficile sia.

Mi sto perdendo ogni altro obiezioni in IIS processo thread-pooling / lavoro-code?

trasferisce a StackOverflow , in quanto non era davvero affrontato qui.

2. Come un servizio

In entrambi qualche soluzione di terze parti, o uno personalizzato.

In sostanza, avremmo maresciallo un compito attraverso il confine processo per qualche servizio e solo dimenticare su di esso. Presumibilmente stiamo collegando un codice a, o ristretta a crudo SQL + una stringa di connessione.

Il pro è che il suo il "modo giusto" per fare questo.

I lati negativi sono che siamo o molto limitati in ciò che possiamo fare, o stiamo andando a lavorare fuori un qualche sistema per mantenere questo servizio in sincronia con la nostra base di codice. Ci sarà anche bisogno di collegare tutti i nostri monitoraggio e l'errore di registrazione in qualche modo, che si ottiene gratuitamente con l'opzione "In IIS".

Ci sono altri benefici o problemi con l'approccio di servizio?

In poche parole, ci sono problemi imprevisti e insormontabili che l'approccio make # 1 impraticabile e se è così ci sono dei buoni servizi di terze parti che dovremmo guardare in per l'approccio # 2?

È stato utile?

Soluzione

Un paio di settimane fa ho chiesto a un simile domanda su SO. In un guscio di noce, il mio approccio da qualche tempo è stato quello di sviluppare un servizio di Windows. Vorrei usare NServiceBus (essenzialmente MSMQ sotto le coperte) al maresciallo richieste dal mio web app al mio servizio. Ho usato per usare WCF ma ottenere una transazione distribuita per funzionare correttamente su WCF sempre sembrata una rottura di palle. NServiceBus ha fatto il trucco, ho potuto commettere dati e creare attività in una transazione e non preoccuparsi se il mio servizio è stato installato e funzionante in quel momento. Come semplice esempio, se mai avevo bisogno di inviare una e-mail (ad esempio, una e-mail di registrazione) Vorrei creare l'account utente e sparare un segnale al mio servizio di Windows (per inviare l'e-mail) in una transazione. Il gestore di messaggi sul lato servizio sarebbe raccogliere il messaggio e il processo di conseguenza.

Dal ASP .NET 4.0 e AppFabric sono stati rilasciati, ci sono una serie di valide alternative al meccanismo di cui sopra. Facendo riferimento alla domanda che ho citato sopra, ora abbiamo di AppFabric AppInitialize (via net.pipe) così come funzionalità di Auto-Start ASP .NET 4.0 di che rendono lo sviluppo di Windows Services come applicazioni web una valida alternativa. Ho iniziato a fare questo ora per una serie di motivi (più grande dispiegamento essere non è più un dolore nel culo):

  1. È in grado di sviluppare un'interfaccia utente web sopra il vostro servizio (dal momento che è in esecuzione come una web app). Ciò è estremamente utile per vedere cosa sta succedendo in fase di esecuzione.
  2. Il tuo modello di implementazione per le applicazioni web lavorerà per l'applicazione di servizio.
  3. IIS fornisce alcune caratteristiche interessanti per la gestione di errori delle applicazioni (simile in alcuni aspetti a un servizio di Windows).
  4. Gli sviluppatori web sono molto familiarità con lo sviluppo di applicazioni web (naturalmente), la maggior parte non so molto di buone pratiche nello sviluppo di un servizio di Windows.
  5. Si fornisce un numero di alternative per esporre un'API per altre applicazioni di consumare.

Se vuoi seguire questa strada (mi perdoni per copiare e incollare dal mio post originale) avrei sicuramente in considerazione l'esecuzione della logica di fondo in un'applicazione web separata. Ci sono diverse ragioni per questo:

  1. Sicurezza . Ci può essere un modello di sicurezza diversa per l'interfaccia utente che visualizza informazioni sui processi in esecuzione in background. Non vorrei esporre questa interfaccia utente per chiunque altro, ma la squadra ops. Inoltre, l'applicazione web può funzionare come un utente diverso, che dispone di una serie elevata di permessi.
  2. Manutenzione . Sarebbe bello essere in grado di distribuire modifiche all'applicazione che ospita i processi in background senza alcun impatto sull'utente di utilizzo del sito web front-end.
  3. Performance . Avere l'applicazione separata dalle richieste degli utenti di trasformazione sito principale mezzo che thread in background non diminuirà la capacità di IIS per gestire la coda di richieste in arrivo. Inoltre, l'applicazione di elaborazione delle attività in background potrebbe essere distribuito a un server separato se necessario.

In questo modo si torna all'aspetto marshalling. WCF, NServiceBus / RabbitMQ / ActiveMQ ecc, vaniglia MSMQ, API RESTful (si pensi MVC) sono tutte le opzioni. Se si utilizza Windows Workflow 4.0 si potrebbe esporre un endpoint ospitante che il vostro web app potrebbe consumare.

L'approccio di web hosting per i servizi è ancora abbastanza nuovo per me, solo il tempo potrà dire se fosse la scelta giusta. Però fin qui è andato tutto bene. A proposito, se non si desidera utilizzare AppFabric (non ho potuto perché per qualche strana ragione, Windows Server Web Edition non è supportato), la capacità di auto-start menzionato in post del Gu funziona bene. Stare lontano dal file ApplicationHost.config, però, tutto in quel post è possibile impostare tramite la console di IIS (Editor di configurazione a livello di server principale).

Nota: Iaveva inizialmente inviato un po 'di link più in questo messaggio, ma, ahimè, questo è il mio primo post a questo scambio e solo un link è supportato! C'era fondamentalmente due gli altri, per farli Google "Morte a Windows Services ... Long Live AppFabric!" e "asp-net-applicazioni auto-start-". Mi dispiace.

Altri suggerimenti

V'è in realtà una terza via in Windows per eseguire servizi in background, ed è molto comune nel mondo UNIX. Il terzo modo è un lavoro CRON che esegue un pezzo della tua infrastruttura. In Windows questo è noto come il task scheduler ed è molto comune per l'esecuzione di codice in base a una pianificazione. Per utilizzare questo è necessario creare un'applicazione a riga di comando che viene eseguito su un programma pre definito. Il vantaggio di questo è che non c'è bisogno di preoccuparsi se i soggiorni di processo su e in esecuzione come un servizio, perché se non riesce per qualche motivo, sarà semplicemente avviare la prossima volta.

Per quanto riguarda il marshalling compiti specifici, è in realtà solo bisogno di memorizzare questi compiti in una memoria binaria persistente. Fino a quando l'applicazione a riga di comando li raccoglie fuori dal deposito e li esegue. L'ho fatto in passato, utilizzando il database Cassandra come fornitore stato sessione per l'imbottitura attività in background per utenti specifici nel database Cassandra, e poi avere la riga di comando raccoglierli e li esegue per l'utente.

Questo non può essere stata la soluzione tipica marshalling, ma ha funzionato molto bene per me e si è rivelato essere una soluzione molto elegante, in quanto le operazioni pianificate sono sopravvissuti arresti, problemi di rete, e qualsiasi macchina potrebbe eseguire il compito, in quanto è stato memorizzato centralmente.

la promozione Shameless, ma questo è il mio progetto e la soluzione che ho appena esposto dettagliatamente breve è il motivo per cui ho creato il progetto: http://github.com/managedfusion/fluentcassandra/

Cron + Web App

Questo è un disegno battaglia-testato che scale in orizzontale con il vostro web farm e garantisce che si sta utilizzando il tecnologia web pila si conosce già.

Ecco come funziona:

  1. Crea un controller / azione nella propria applicazione web per gestire le attività in background pianificati. Per convenzione, io di solito lo chiamo il mio http://mydomain.com/system/cron.
  2. Per motivi di sicurezza, questa azione deve essere bloccato a indirizzi IP solo autenticati sulla rete locale.
  3. Su una macchina separata, installare Wget e impostare un Scheduled Task avere wget recuperare la risorsa dal punto 1. È possibile effettuare l'esecuzione dell'attività frequentemente come si vuole (I di solito optare per 30 secondi). Non dimenticate di passare l'argomento biscotto opportuno Wget in modo che l'autenticazione al vostro web app.
  4. Per la ridondanza, è anche possibile installare un secondo wget programmato su una seconda macchina.

Evviva! Ora avete un percorso che verrà chiamata ogni 30 secondi. E se la richiesta vogliono 5 minuti per processo, nessuno si cura, perché non è parte della richiesta di pagina di un utente.

L'azione cron finisce per guardare molto semplice: ha una lista di metodi per eseguire su una certa frequenza. Quando arriva una richiesta, che vede se c'è un metodo che deve essere eseguito e chiama il metodo appropriato. Questo significa che è possibile controllare il calendario nel database , in cui probabilmente avete già un sacco di altri dati di configurazione importante per il vostro sito.

Ancora più importante (per voi), questo significa che i lavori non devono essere chiamati ad orari prefissati. È possibile scrivere qualsiasi logica che si desidera per determinare quando eseguire un metodo.

Pro e contro

Professionisti
  • Sei già molto bravo a scrivere codice ASP.NET MVC, quindi questo permette di scrivere le vostre attività in background nel stessa piattaforma che si scrive il resto della vostra soluzione in.
  • I compiti eseguiti nello stesso contesto come applicazione web, in modo da poter condividere la cache e fare uso di metodi di helper che già esistono.
  • Se si dispone di wget prendere un con bilanciamento del carico URI, allora le vostre operazioni in background sono ora a carico bilanciato pure.
  • distribuzione simultanea - non dovete preoccuparvi di sincronizzazione tue applicazioni Web con il tuo background logica compito, perché sono tutti nella stessa distribuzione.
Contro
  • Nel corso degli anni, alcune persone mi hanno detto che questo disegno è "fortemente accoppiato", ma quando viene premuto non sono stati in grado di articolare il motivo per cui questa è una brutta cosa.

Nota: Se ci sono domande o dubbi, si prega di aggiungere un commento . Sono felice di elaborare.

ho provato e utilizzato quasi ogni modo possibile di fare questo nella mia applicazione corrente. Ho iniziato facendo la stessa cosa che attualmente fa, torna piggy su una richiesta dell'utente per riempire i dati e poi in cache andando avanti. Mi sono reso conto che questo era una cattiva idea pure (soprattutto come si scala a più server web, più utenti prendono il colpo).

Ho anche avuto un processo pianificato che colpisce un URL nella app ASP.NET - questa è una soluzione decente, ma comincia ad abbattere minuto si scala passato server 1 web

.

Attualmente io uso due metodi diversi, sia utilizzando Quartz.NET che è una grande piccola biblioteca. Il primo è Quartz.NET in esecuzione in-process con ASP.NET, è l'installazione nel global.asax e corre ogni paio di minuti. Io lo uso per aggiornare la cache di ASP.NET fuori banda, che è l'unico motivo che viene eseguito come parte di ASP.NET.

La seconda è che ho scritto una libreria per avvolgere Quartz.NET chiamato DaemonMaster - lo rende facile far cadere una DLL in una directory e lo hanno eseguito in un servizio di Windows. L'ho trovato consente di evitare alcune delle parti fastidiose di lavorare con un servizio di Windows ed anche pulisce l'API Quartz.NET alcuni. I servizi che attraversano DaemonMaster sono di due gusti diversi, i primi sono posti di lavoro che necessità di eseguire ogni notte o ogni X minuts. Gli altri lavori lavorare fuori di una coda sulla base dei dati provenienti dall'applicazione ASP.NET. gocce L'applicazione ASP.NET oggetti JSON sul RabbitMQ e RabbitMQ servizi sondaggio poi elaborare i dati.

Sulla base di questo vorrei suggerire di andare con un servizio di Windows (e il check out DaemonMaster), e se necessario, utilizzare una coda come RabbitMQ per il passaggio dei dati dal app ASP.NET per i servizi - ha funzionato il meglio di tutte queste soluzioni. Se siete cache di carico poi correre in ASP.NET ha un senso, altrimenti non credo che lo fa.

mi piacerebbe farlo nel modo giusto e hanno un servizio di Windows in esecuzione che controlla un "coda". Dico "coda", perché la programmazione w / MSMQ è simile ad attaccare poker caldi nei vostri bulbi oculari.

Sono caduto nell'amore con la semplicità di ritardato :: Job in Rails, e qualcosa di simile potrebbe essere fatto facilmente in .NET.

In sostanza si aggiunge alcun tipo di SomethingOperation (qualcosa che ha un metodo Perform()). Poi basta serializzare i parametri rilevanti, dare una priorità, una sorta di comportamento predefinito di tentativi e roba del genere in un database.

Il vostro servizio sarebbe solo monitorare questo e lavorare i lavori nella coda.

Siamo stati abbastanza felice con un approccio Service Bus / Message Queue / servizio. L'architettura di base è questa.

Sito web invia un messaggio alla coda

bus.Send(new ProjectApproved()); // returns immediately

servizio di Windows riceve ed elabora i messaggi a suo tempo

public class DoesSomethingAwesome : ConsumerOf<ProjectApproved>
{
   public void Consume(ProjectApproved Message)
   {
      // Do something "offline"
   }
}

Il vantaggio è che non v'è alcun ritardo per il servizio di front-end che gli utenti sono connessi anche. Il servizio di Windows può essere l'arresto ed essere aggiornati senza interruzione al sito principale. In più è di estremamente veloce .

Se non è possibile memorizzare tutti i dati all'interno del messaggio si può sempre memorizzare e recuperare in un secondo momento. Io suggerisco di usare un meccanismo di archiviazione documento, quali: RavenDB o MongoDB dove è molto semplice per memorizzare le classi, senza modifiche.

Sito web invia un messaggio alla coda

// Save your object
store.Save(completeProject);

// Send a message indicating its ready to be processed
bus.Send(new ProjectApproved() { ProjectId = completeProject.Id });

servizio di Windows riceve ed elabora i messaggi a suo tempo

public class DoesSomethingAwesome : ConsumerOf<ProjectApproved>
{
   public void Consume(ProjectApproved Message)
   {
      // Retrieve your object back
      var completeProject = store.Get(Message.ProjectId);
   }
}

Per rendere le cose semplici uso che: Rhino ESB e TopShelf . La configurazione è estremamente semplice e mettere questo in posto per un'applicazione esistente è dimostrato prendere pochissimo tempo.

Sono curioso di sapere perchè una combinazione dei due non è una valida opzione. In questo momento si attiva lavori su pagine viste, con un po 'di linfa sfortunato rimanere bloccati in attesa di 10 secondi per la pagina a venire. Almeno questa è la mia comprensione del metodo corrente.

Tuttavia quei posti di lavoro stanno prendendo sempre più tempo per l'esecuzione come il sito cresce, e non si vuole far deragliare l'esperienza degli utenti sul sito. Nemmeno per un paio (o forse molto) gli utenti sfortunati durante tutto il giorno, così ora si sta pensando di pianificazione dei processi in background.

non vedo il motivo per cui uno sfondo di lavoro eseguito a intervalli regolari non può imitare un visitatore. Ora io non sono un programmatore di Windows, ma nel mondo Linux vorrei impostare un job di cron che viene eseguito a intervalli regolari, e sarebbe di 2 linee di codice.

#!/bin/bash
wget -O /dev/null http://stackoverflow.com/specially_crafted_url

Esso combina i vantaggi di entrambi i sistemi. E 'fatto in background. Non influisce utenti. Si usa ancora visualizzazione di una pagina per dare il via al lavoro. Ho visto questo approccio usato prima. Si tende ad essere il mezzo tra i modi semplici passate e modi più complessi che scende dalla strada.

Aggiorna

penso che si può aggirare il problema di bilanciamento del carico eseguendo i corridori di lavoro sui server web stessi. Il corridore lavoro tira un URL fuori dalla coda di lavoro, e lo esegue in questo modo:

wget -O /dev/null http://localhost/specially_crafted_url

A causa della natura del lavoro / messaggistica code, i posti di lavoro avranno uniformemente distribuito tra i corridori di posti di lavoro, il che significa che lo specially_crafted_url alla fine viene distribuito tra i server web.

Credo che l'aria con l'approccio puro servizio è che si è sparso il codice nel servizio e lontano dal app nucleo.

Ecco quello che abbiamo fatto con grande sfondo lavori non time-sensitive, che mantiene il codice insieme e semplifica il servizio:

  1. Creare una coda di posti di lavoro (sia in memoria o DB, qualunque sia la persistenza è necessario per i tipi di posti di lavoro)
  2. Crea un servizio web che eseguirà i lavori in coda
  3. Morto semplice applicazione servizio che chiama il servizio Web a un intervallo specificato, lasciare tutte le cose complesse (il recupero di posti di lavoro e l'esecuzione) per il servizio Web nel codebase nucleo.

Ancora più semplice, basta effettuare la chiamata in una console app e utilizzare Utilità di pianificazione o di VisualCron per trasformarlo in un "servizio".

mi piaceva TopShelf. Mantiene la semplicità, ma ancora farlo nel modo corretto in esecuzione come servizio di Windows. Fondamentalmente creare una console app, aggiungere circa 15-20 righe di codice, poi si installa come servizio.

http://code.google.com/p/topshelf/

Come di avere un semplice servizio di Windows che viene eseguito sul server web e periodicamente colpisce un URL di manutenzione che fa le attività varie. Averlo throttle quanto lavoro lo fa in ogni richiesta.

ho intenzione di invertire il trend apparente qui e suggeriamo di andare per il modello in-IIS. Ho usato io stesso e funziona molto bene. Non è poi così difficile da attuare un decente classe thread-piscina (nel corso degli anni, ho esteso il mio filo di classe pool per supportare la creazione dinamica e la distruzione di fili, riprovare di posti di lavoro e così via). I vantaggi sono:

  • Nessun servizio esterno per monitorare
  • Semplicità di implementazione: no marshalling cross-process, nessun lavoro avanzate di monitoraggio
  • Sei ancora all'interno del vostro IIS processo, in modo da poter fare tutti i tuoi soliti registrazione e così via (senza bisogno di più file di log)
  • distribuzione Notevolmente semplificata (quando si aggiorna un servizio, è necessario arrestare il servizio, copiare i file, avviare il servizio - questo è in aggiunta ai suoi consueti aggiornamenti al codice del sito web)

A mio parere, un in-IIS soluzione è semplicemente il "passo successivo" dal bagarinaggio lavoro su pagine viste casuali.

Resque è bello. O anche Kthxbye se avete bisogno di ricevere una notifica del valore risultante una volta che è stata completata.

Sia Redis / Rubino basato tho.

Onestamente, se si sta facendo un approccio basato sui servizi, in realtà non ha bisogno di essere super-integrato con il vostro piattaforma corrente, che mi sembra un plus. Mi auguro che potrebbe essere un sistema di set-and-forget che avrebbe eseguito (con il monitoraggio di qualche tipo) e di posti di lavoro complete. Io non sono sicuro che deve essere eseguito sulla stessa piattaforma a tutti dato che il suo solo aggiornamento / modifica informazioni di database.

Abbastanza sicuro che si può ottenere via con molto di più per molto meno se questo genere di allevamento lavorare fuori ad un'entità separata, soprattutto perché sembra che a che fare con problemi di threading. Entrambi Resque e Kthxbye spostare il fuori di elaborazione per processi separati per consentire al sistema operativo per gestire la concorrenza.

Resque

Kthxbye

I userebbe un ascolto servizio WCF è stato ospitato a una coda MSMQ.

Pro

  • spara e dimentica i messaggi a senso unico dal web app

  • MSMQ / WCF throttling e tentativi

  • Consegna garantita; D

  • Gestione Dead Letter

  • L'elaborazione distribuita

  • WAS / MSMQ attivazione

di Con

  • MSMQ (non è morto ... Eppure)

Il MSMQ dispone in WCF rende l'utilizzo di MSMQ veramente bello. Sì si sanguinare dalla configurazione ma i benefici saranno superiori al sacrificio.

Ho eseguito in questa coppia un di volte in cui lo sviluppo di applicazioni web. Siamo stati risolverlo creando un'applicazione console di Windows che svolge l'attività e la creazione di una task pianificato che esegue ogni tanto per davvero fare il compito.

È possibile deviare il lavoro su un thread in background (o più thread in background) con Rx e qualcosa di simile al seguente:

var scheduler = new EventLoopScheduler( SchedulerThreadName );
_workToDo = new Subject<Action>();
var queueSubscription = _workToDo.ObserveOn( scheduler ).Subscribe( work => work() );
_cleanup = new CompositeDisposable( queueSubscription, scheduler );

Per usare:

var work = () => { ... };
_workToDo.OnNext( work ); // Can also put on error / on complete in here

Host tutto ciò che all'interno di una classe che ci sia sempre e solo una delle (aka un Singleton, ma farlo correttamente - uso che contenitore CIO per determinare lo stile di vita).

È possibile controllare la dimensione del pool di thread, ecc scrivendo uno scheduler personalizzato al posto di utilizzare l'EventLoopScheduler (che gestisce un singolo thread).

Ho implementato questo tipo di cose un paio di volte. Su Windows, ho creato un programma a linea di comando python che fa qualcosa in tempi diversi. Questo programma espone anche un'interfaccia XMLRPC su una porta. Poi, un processo pianificato-attività viene eseguita ogni minuto e interroga le interfacce XMLRPC. Se essi non sono all'altezza, tenta di lanciarli. Se non è possibile, è una mail mi.

Il vantaggio è che il lavoro che viene eseguito non è cron o un programma legato. Ho un lavoro processo che viene eseguito ogni pochi secondi, ma aspetterò più a lungo e più a lungo tra di iniziare un nuovo lavoro a seconda che aveva del lavoro da fare. Inoltre, può essere utilizzato per agire in modo intelligente in base al risultato. Ha ottenuto un errore 500? Ha ottenuto davvero un lungo ritardo? Fai qualcos'altro. Notifica un altro servizio. Ecc

E le stesse opere di sistema su Unix, con piccole modifiche.

Non ho una risposta per voi me stesso, ma il problema suonato una campana - Mi ricordo di alcuni ragazzi casuali discutendo su un podcast volta .

Spolsky: ho notato uno dei domande che hai chiesto il blog era come si dovrebbe gestire la manutenzione attività ricorrenti in generale?

Atwood: Sì.

Spolsky: È una fiera caratterizzazione? Ogni sito ha alcune attività che non si desidera esecuzione al momento di una pagina web è caricamento, ma che si vuole eseguire con qualche ricorrenza di qualche tipo.

Atwood: Ya, compiti sorta di sfondo cosa.

Spolsky: Ya, quindi quello che hai fatto la figura fuori?

Atwood: Beh, ho inviata su Twitter, perché volevo solo qualcosa di leggero. davvero non voleva come scrivere un finestre servizio. Mi sentivo come che era fuori di Codice band. Inoltre il codice che in realtà fa il lavoro è una pagina web, infatti, perché per me questa è un'unità logica di lavoro su un sito web è una pagina web. Quindi, è davvero come stiamo chiamando di nuovo nel sito web, è proprio come un'altra richiesta nel sito, in modo da è visto come qualcosa che dovrebbe soggiorno in linea e il piccolo approccio che ci siamo inventati che è stato consigliato a me su Twitter è stato quello di sostanza, aggiungere qualcosa alla cache dell'applicazione con una scadenza fissa, poi si deve una chiamata indietro in modo che quando si che scade sollecita una certa funzione che fa il lavoro poi inserirlo nuovamente a la cache con la stessa scadenza. Quindi, è un po ', forse "ghetto" è la parola giusta.

Task Queue Java API Panoramica

Task Concetti
In App Engine sfondo di elaborazione, un compito è una descrizione completa di una piccola unità di lavoro. Questa descrizione si compone di due parti:

  • un carico utile di dati che parametrizza l'obiettivo.
  • codice che implementa l'operazione.

Attività come non in linea Web Ganci
Fortunatamente, Internet fornisce la soluzione di un tale già, sotto forma di una richiesta HTTP e la sua risposta. Il carico utile di dati è il contenuto della richiesta HTTP, come ad esempio variabili di modulo web, XML, JSON o dati binari codificati. Il riferimento codice è l'URL stesso; il codice attuale è tutto ciò che la logica viene eseguito il server nel preparare la risposta.

Do Sia

Aggiungere un parametro opzionale per il percorso domanda che fa il lavoro che si sta bagarinaggio alle richieste degli utenti:

Manutenzione attività in background su un sito di grandi dimensioni

Crea una console app che viene eseguito su ogni server e apre il registro di IIS condiviso binario e legge fino alla fine corrente del file. Utilizzare un FileSystemWatcher o un intervallo di temporizzato per leggere l'ora di raccogliere il maggior aggiornamenti IIS arrossì il registro.

Utilizzare queste informazioni per determinare quali pagine sono stati visti al momento.

Utilizzare la pagina URL dal registro analizzato per chiamare la versione "extrastuff" dell'URL su localhost con un oggetto WebClient.

Aggiungi in qualche codice per i file di commutazione alla fine di ogni periodo di log o riavviare il processo di ciascun periodo di log.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top