【发布时间】:2019-04-01 04:09:10
【问题描述】:
假设我有一个位于 Scotty 的 http 服务器
scottyServer :: IO ()
scottyServer = do
print ("Starting Server at port " ++ show port)
scotty port routes
routes :: ScottyM()
routes = do get "/service" responseService
get "/users" responseUsers
然后我有一个断路器,我想保持状态CircuitBreakerType
data CircuitBreakerType
= Close {users::[User], error:: Integer}
| Open {users::[User], error:: Integer}
| HalfOpen {users::[User], error:: Integer}
deriving (Show)
responseUsers :: ActionM ()
responseUsers = do users <- liftAndCatchIO $ searchAllCassandraUsersCB $ Close [] 0
json (show users)
searchAllCassandraUsersCB :: CircuitBreakerType -> IO CircuitBreakerType
searchAllCassandraUsersCB (Close users errors)= do result <- selectAllCassandraUserCB $ Close users errors
return result
使用 Haskell 如何在 Scootty 的请求/响应之间保持 CircuitBreakerType 的状态
我所做的所有状态机示例都是将 IO monad 中的状态传递给另一个,但是对于 Http 服务器,我不知道如何保持状态。希望与数据库中的持久性无关,因为性能会很糟糕。
问候
【问题讨论】:
-
你考虑过使用http会话来保持状态吗?见hackage.haskell.org/package/scotty-session
-
恐怕对于 CircuitBreaker,我无法将状态附加到用户,而是附加到后端。所以所有的请求都需要分享最新的状态。
-
如果不是其他更标准的方式来保持请求之间的状态,那会让我大吃一惊
标签: haskell functional-programming