2013-06-10 20 views
7

È possibile eseguire il polling lungo in Yesod o in qualsiasi altro framework web Haskell con strutture di database comparabili?Polling lungo in Yesod

Per essere precisi, voglio ritardare una risposta HTTP fino a quando accade qualcosa di interessante. Ci dovrebbe anche essere un timeout dopo il quale al client verrà fornita una risposta che dice "non è successo niente" e quindi il client emetterà la stessa richiesta.

Per rendere la vita ancora più complicata, l'app che ho in mente sta servendo tutto su HTTP/HTML5 e un protocollo UDP davvero compatto per i client MIDP. Gli eventi di entrambi i protocolli possono rilasciare le risposte in entrambi i protocolli.

TIA, Adrian.

risposta

6

Non riesco a rispondere a tutti i problemi della roba UDP più complicata, ma la risposta breve è che, sì, Yesod supporta lunghi sondaggi. Essenzialmente si può fare qualcosa di simile:

myHandler = do 
    mres <- timeout timeoutInMicroseconds someAction 
    case mres of 
     Nothing -> return nothingHappenedResponse 
     Just res -> doSomething res 

probabilmente si vorrà all'usato System.Timeout.Lifted dal pacchetto sollevato-base.

3

La risposta di Michael raggiunge il requisito di timeout. Per i clienti generali non si desidera mantenere le risposte HTTP in attesa di più di circa 60 secondi poiché potrebbero connettersi tramite un proxy o simili che tendono a diventare impazienti dopo tanto tempo. Se sei su una rete più strettamente controllata, potresti essere in grado di rilassare questo timeout. Una correzione minore è che il parametro su timeout è in microsecondi, non in nanosecondi.

Per il 'aspettare che qualcosa di interessante per accadere' parte, usiamo il check combinatore da Control.Concurrent.STM (che avvolge fino retry) in modo che il nostro gestore di thread in attesa in un TVar:

someAction = do 
    interestingStuff <- atomically $ do 
     currentStuff <- readTVar theStuff 
     check $ isInteresting currentStuff 
     return currentStuff 
    respondWith interestingStuff 

Nel frattempo, altri thread (inclusi i gestori HTTP) stanno aggiornando theStuff :: TVar Stuff - ogni aggiornamento attiva un nuovo calcolo di isInteresting e potenzialmente una risposta se restituisce True.

Questo è compatibile con le stesse informazioni su UDP: è sufficiente condividere theStuff tra i thread del server UDP e i thread Yesod.