2013-06-10 7 views
7

Yesod 또는 다른 데이터베이스 기능이있는 다른 하스켈 웹 프레임 워크에서 긴 폴링을 수행 할 수 있습니까?롱 폴링 in Yesod

정확하게 말하면 흥미로운 일이 발생할 때까지 HTTP 응답을 지연시키고 싶습니다. 또한 클라이언트에게 "아무 일도 없음"이라는 응답이 제공되고 클라이언트가 동일한 요청을 발행하는 시간 초과가 있어야합니다.

인생을 더욱 복잡하게 만들기 위해 내가 염두에두고있는 앱은 HTTP/HTML5 및 MIDP 클라이언트에 대한 매우 컴팩트 한 UDP 프로토콜을 통해 모든 것을 제공합니다. 두 프로토콜 중 하나의 이벤트는 두 프로토콜 중 하나에서 응답을 릴리스 할 수 있습니다.

TIA, 애드리안.

답변

6

더 복잡한 UDP 항목의 모든 문제에 답할 수는 없지만 짧은 대답은 예, Yesod가 긴 폴링을 지원한다는 것입니다.

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

당신은 아마 해제 - 기본 패키지에서 System.Timeout.Lifted 사용 할 수 있습니다 : 당신은 본질적으로 같은 것을 할 수 있습니다.

3

마이클의 대답으로 시간 초과 요구 사항이 발생합니다. 일반 클라이언트의 경우 HTTP 응답을 약 60 초 이상 대기 상태로 유지하고 싶지 않은데, 그 이유는 오랫동안 기다려야하는 프록시 또는 유사 기능을 통해 연결할 수 있기 때문입니다. 좀 더 철저히 통제 된 네트워크에 있다면이 시간 제한을 완화 할 수 있습니다. 하나의 사소한 수정은 timeout의 매개 변수가 나노초가 아닌 마이크로 초입니다.

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

한편, 다른 스레드 (다음 '일이 흥미로운 대기'부분에 대한

, 우리는 (어떤이 retry를 래핑)을 TVar에 그래서 우리의 핸들러 스레드 대기 Control.Concurrent.STM에서 check 콤비를 사용 HTTP 처리기 포함) theStuff :: TVar Stuff 업데이트 - isInteresting의 새 계산을 트리거하고 True을 반환하면 잠재적으로 응답을 트리거합니다.

UDP를 통해 동일한 정보를 제공하는 것과 호환됩니다. UDP 서버 스레드와 Yesod 스레드간에 theStuff을 공유하면됩니다.