2013-06-10 38 views
7

Tôi có thể thực hiện bỏ phiếu dài trong Yesod, hoặc bất kỳ khung công tác web Haskell nào khác với cơ sở dữ liệu so sánh được không?Thăm dò ý kiến ​​lâu dài ở Yesod

Để chính xác, tôi muốn trì hoãn phản hồi HTTP cho đến khi có điều gì đó thú vị xảy ra. Cũng nên có một thời gian chờ sau đó khách hàng sẽ được phục vụ một phản ứng nói rằng "không có gì xảy ra" và sau đó khách hàng sẽ đưa ra yêu cầu tương tự.

Để làm cho cuộc sống trở nên phức tạp hơn, ứng dụng tôi có trong đầu đang phân phát tất cả nội dung của nó qua cả HTTP/HTML5 và giao thức UDP thực sự nhỏ gọn cho các máy khách MIDP. Các sự kiện từ một trong hai giao thức có thể giải phóng các phản hồi trong cả hai giao thức.

TIA, Adrian.

Trả lời

6

Tôi không thể trả lời tất cả các vấn đề của công cụ UDP phức tạp hơn, nhưng câu trả lời ngắn gọn là, có, Yesod hỗ trợ bỏ phiếu dài. Về cơ bản, bạn có thể làm một việc gì đó như:

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

Có thể bạn sẽ muốn sử dụng System.Timeout.Lifted from the upgrade-base package.

3

Câu trả lời của Michael đáp ứng yêu cầu hết thời gian chờ. Đối với các khách hàng nói chung, bạn không muốn giữ các phản hồi HTTP chờ đợi hơn 60 giây vì chúng có thể kết nối thông qua proxy hoặc tương tự có xu hướng mất kiên nhẫn sau khoảng thời gian đó. Nếu bạn đang ở trên một mạng được kiểm soát chặt chẽ hơn thì bạn có thể thư giãn thời gian chờ này. Một điều chỉnh nhỏ là tham số đến timeout là tính bằng micro giây không phải là nano giây.

Đối với 'chờ đợi một cái gì đó thú vị để xảy ra' một phần, chúng tôi sử dụng check combinator từ Control.Concurrent.STM (mà kết thúc tốt đẹp retry) để xử lý chúng tôi đề chờ đợi trên TVar:

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

đề Trong khi đó, khác (bao gồm bộ xử lý HTTP) đang cập nhật theStuff :: TVar Stuff - mỗi lần cập nhật sẽ kích hoạt phép tính mới là isInteresting và có khả năng phản hồi nếu trả về True.

Điều này tương thích với việc cung cấp cùng thông tin trên UDP: chỉ cần chia sẻ theStuff giữa các luồng máy chủ UDP của bạn và chuỗi Yesod.

Các vấn đề liên quan