用 20 行 Haskell 写 FaaS 服务器

2017-04-23 15:14:42 +08:00
 lupino

FaaS 是 Function as a Service 的简称,是构建 Serverless 的一种框架。 那么 FaaS 做了什么事情呢?简单来讲 FaaS 将 HTTP 请求转发到可执行命令,然后将命令的执行结果转发给 HTTP Response 。

有了这么一条业务逻辑我们就可以构建自己的 FaaS 服务器。

首先定义可执行命令的数据结构:

data Proc = Proc { procFuncName :: String
                 , procName :: String
                 , procArgv :: [String]
                 }

执行命令使用 System.Process 里面的 readProcessWithExitCode

runProc :: Proc -> String -> IO (Either String String)
runProc (Proc { procName = name, procArgv = argv}) wb = do
  (code, out, err) <- readProcessWithExitCode name argv wb
  case code of 
    ExitSuccess   -> return (Right out)
    ExitFailure _ -> return (Left err)

使用 Web.Scotty 来构建 web 服务器

processHandler :: (String -> Maybe Proc) -> ActionM ()
processHandler getProc = do 
  func <- param "func"
  case (getProc func) of
    Nothing -> do 
        status status404
        raw LB.empty
    Just proc -> do 
        wb <- body
        result <- liftIO $ runProc proc (LB.unpack wb)
        case result of 
          Left err -> do 
            status status500
            raw (LB.pack err)
          Right out -> raw ( LB.pack out)

catProc :: Proc 
catProc = Proc { procFuncName = "cat"
               , procName     = "cat"
               , procArgv     = []
               }

getProcByFuncName :: String -> Maybe Proc
getProcByFuncName "cat" = Just catProc
getProcByFuncName _     = Nothing

main = scotty 3000 $ do
    post "/function/:func" $ processHandler getProcByFuncName

到这里 FaaS 服务器已经完成。

FaaS 服务器就这么简单,在生产环境上我们还需要做一些事情,比如 函数可以配置。

完整的代码参见 func

原文见 http://www.jianshu.com/p/f35f064c8868

6320 次点击
所在节点    Serverless
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/356788

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX