2013-06-10 8 views
7

Kann ich lange Abfragen in Yesod oder einem anderen Haskell-Web-Framework mit vergleichbaren Datenbankeinrichtungen durchführen?Lange Abfrage in Yesod

Um genau zu sein, möchte ich eine HTTP-Antwort verzögern, bis etwas Interessantes passiert. Es sollte auch eine Zeitüberschreitung bestehen, nach der dem Client eine Antwort mit der Aussage "nichts ist passiert" zugestellt wird, und dann wird der Client die gleiche Anfrage ausgeben.

Um das Leben noch komplizierter zu machen, die App, die ich im Hinterkopf habe, liefert all ihre Sachen über HTTP/HTML5 und ein wirklich kompaktes UDP-Protokoll für MIDP-Clients. Ereignisse von jedem Protokoll können Antworten in jedem Protokoll freigeben.

TIA, Adrian.

Antwort

6

Ich kann nicht alle Fragen zu den komplizierteren UDP-Zeug beantworten, aber die kurze Antwort ist, dass ja, Yesod unterstützt lange Abfragen. im Wesentlichen etwas tun, wie Sie können:

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

Sie werden wahrscheinlich wollen von dem angehobenen-Basispaket System.Timeout.Lifted früher.

3

Michaels Antwort trifft die Timeout-Anforderung. Bei allgemeinen Clients möchten Sie die HTTP-Antworten nicht länger als 60 Sekunden warten lassen, da sie sich möglicherweise über einen Proxy oder Ähnliches verbinden, der nach so langer Zeit ungeduldig wird. Wenn Sie sich in einem stärker kontrollierten Netzwerk befinden, können Sie diese Zeitüberschreitung möglicherweise lockern. Eine kleine Korrektur ist, dass der Parameter timeout in Mikrosekunden nicht Nanosekunden ist.

Für die 'warten auf etwas Interessantes passieren' Teil, verwenden wir die check combinator von Control.Concurrent.STM (die einpackt retry) so unser Handler-Thread wartet auf eine TVar:

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

Zwischenzeit andere Threads (incl. HTTP-Handler) werden aktualisiert theStuff :: TVar Stuff - jedes Update löst eine neue Berechnung von isInteresting und möglicherweise eine Antwort, wenn es True zurückgibt.

Dies ist kompatibel mit der gleichen Informationen über UDP: einfach theStuff zwischen Ihren UDP-Server-Threads und den Yesod-Threads teilen.