在Yesod长期投票

时间:2013-06-10 11:16:17

标签: haskell long-polling yesod haskell-snap-framework happstack

我可以在Yesod或任何其他具有可比数据库功能的Haskell Web框架中进行长时间轮询吗?

确切地说,我想延迟HTTP响应,直到发生一些有趣的事情。还应该有一个超时,在此之后客户端将收到一条回复,说“没有发生”,然后客户端将发出相同的请求。

为了让生活变得更加复杂,我想到的应用程序通过HTTP / HTML5和MIDP客户端的真正紧凑的UDP协议提供所有功能。来自任一协议的事件都可以在任一协议中释放响应

TIA, 阿德里安。

2 个答案:

答案 0 :(得分:7)

我无法回答更复杂的UDP内容的所有问题,但简短的回答是,是的,Yesod支持长轮询。你基本上可以这样做:

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

您可能希望使用来自提升基础软件包的System.Timeout.Lifted。

答案 1 :(得分:4)

迈克尔的回答达到了超时要求。对于一般客户端,您不希望将HTTP响应等待超过大约60秒,因为它们可能通过代理或类似方式连接,这在大约那么长时间后会变得不耐烦。如果你在一个受到更严格控制的网络上,那么你可以放松这个超时。一个小的修正是timeout的参数是微秒而不是纳秒。

等待有趣的事情发生在&#39;部分,我们使用来自check的{​​{1}}组合器(包装Control.Concurrent.STM),以便我们的处理程序线程等待retry

TVar

与此同时,其他线程(包括HTTP处理程序)正在更新someAction = do interestingStuff <- atomically $ do currentStuff <- readTVar theStuff check $ isInteresting currentStuff return currentStuff respondWith interestingStuff - 每次更新都会触发theStuff :: TVar Stuff的新计算,如果返回isInteresting则可能会响应。

这与通过UDP提供相同信息兼容:只需在UDP服务器线程和Yesod线程之间共享True