2013-06-10 32 views
7

Czy mogę wykonywać długie polling w Yesod lub w jakiejkolwiek innej strukturze sieciowej Haskell z podobnymi obiektami bazy danych?Długie polling w Yesod

Mówiąc dokładniej, chcę opóźnić odpowiedź HTTP, dopóki nie stanie się coś ciekawego. Powinien również wystąpić czas oczekiwania, po którym klient otrzyma odpowiedź mówiąc "nic się nie stało", a następnie klient wyda takie samo żądanie.

Aby jeszcze bardziej skomplikować życie, aplikacja, którą mam na myśli, obsługuje wszystkie swoje rzeczy zarówno za pośrednictwem protokołu HTTP/HTML5, jak i naprawdę kompaktowy protokół UDP dla klientów MIDP. Zdarzenia z dowolnego protokołu mogą wyzwalać odpowiedzi w dowolnym protokole.

TIA, Adrian.

Odpowiedz

6

Nie mogę odpowiedzieć na wszystkie problemy z bardziej skomplikowanymi materiałami UDP, ale krótka odpowiedź brzmi, że tak, Yesod obsługuje długi głosowanie. Można w zasadzie zrobić coś takiego:

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

prawdopodobnie będziesz chciał maszyn System.Timeout.Lifted z pakietu zniesione-zasadowej.

3

Odpowiedź Michaela trafia w wymaganie przekroczenia limitu czasu. W przypadku klientów ogólnych nie chcesz, aby odpowiedzi HTTP trwały dłużej niż około 60 sekund, ponieważ mogą łączyć się z serwerem proxy lub podobnym narzędziem, które po tak długim czasie stają się niecierpliwe. Jeśli korzystasz z bardziej kontrolowanej sieci, możesz być w stanie zrelaksować ten limit czasu. Jedną z mniejszych poprawek jest to, że parametr do timeout jest w mikrosekundach, a nie nanosekundach.

Dla „czekać na coś ciekawego wydarzy” części używamy check COMBINATOR z Control.Concurrent.STM (który owija się retry), więc nasz Wózek gwint czeka na TVar:

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

Tymczasem inne wątki (łącznie z procedurami obsługi protokołu HTTP) są aktualizowane theStuff :: TVar Stuff - każda aktualizacja wyzwala nowe obliczenia isInteresting i potencjalnie odpowiedź, jeśli zwróci True.

Jest to zgodne z podawaniem tych samych informacji przez UDP: po prostu udostępnij theStuff między wątkami serwera UDP a wątkami Yesod.