2025 AI基础设施风向标,不看必后悔!#AI基础设施峰会 了解详情
写点什么

使用 Freya 构建 F# Web 服务器

  • 2017-05-18
  • 本文字数:992 字

    阅读完需:约 3 分钟

Freya 是一个专注于 HTTP 原语和并发的 F# Web 框架,其中并不提供模板等接口结构(construct)。在 F# eXchange 2017 大会上, Marcus Griep 介绍了 Freya 的核心模型。并展示了多种用于性能和并发的机制,例如与 Hopac 和 Kestrel 的集成。

Freya 支持多种托管配置。它可以直接使用 dotnet run 以自托管应用运行,也可以在 Kestrel 上运行。Freya 同时支持.NET Framework 和.NET Core。

出于性能上的考虑,Griep 推荐在 Kestrel 上运行 Freya,这样能有效地利用 Kestrel 的多种优化机制。根据他所给出的基准测试结果,在 ASP.NET 上运行经典的“Hello World”应用,耗时 6 毫秒。对于在 Hopac 上运行的 Freya,耗时 13 毫秒。而对于 F# Async 上运行的 Freya,则需要 26 毫秒。

上面的基准测试表明,相比于 F# Async, Hopac 可以显著地提高性能。Hopac 使用了一种多线程的协同模式,而非抢占式(preemptive)。协同调度产生更少的上下文切换,进而可更加高效地使用 CPU。但是种方式并不适于执行长时间运行的任务,因为这些贯穿始终的任务可能会饿死其它等待执行的任务。

Freya 编程模型意在提供一种对 HTTP 的安全抽象。Freya 计算表达式是对 OWIN 状态的抽象。下面给出一个基本例子,实现获取查询字符串的参数,并返回一个结果:

复制代码
let name_ = Route.atom_ "name"
let name =
freya {
// 获取查询字符串参数“name”。
let! name = Freya.Optic.get name_
match name with
| Some name -> return name
| None -> return "World" }
let sayHello =
freya {
let! name = name
return Represent.text (sprintf "Hello, %s!" name) }

Freya machine 是一种对决策树的抽象。其中的一个决策表示的是部分 HTTP 规则,例如“是否存在 CORS 头部?”。一个完整的决策树中可能包含上百个决策,并且还可进一步扩展。machine 同样具有自动优化特性,可裁剪所有与给定配置无关的决策。

Freya machine 还可以使用计算表达式定义。继续上面给出的例子,下面代码中的 machine 设置了与 HelloWorld 响应的条件。

复制代码
let helloMachine =
freyaMachine {
methods [GET; HEAD; OPTIONS]
handleOk sayHello }

例子代码的最后部分,绑定 machine 到 route:

复制代码
let router =
freyaRouter {
resource "/hello{/name}" machine }

本文使用 StackEdit 编写。

查看英文原文: Building an F# Web Server with Freya

2017-05-18 19:001411
用户头像

发布了 227 篇内容, 共 78.2 次阅读, 收获喜欢 28 次。

关注

评论

发布
暂无评论
发现更多内容

JMM的前世今生

fkc_zyk

重排序 volatile happens-before JMM cpu

遇事不决,请先 「搜索」

小匚

个人成长 职场 随笔杂谈

谈谈控制感(12):选择什么样的工作

史方远

读书笔记 个人成长 随笔杂谈

是什么奠定了架构师的职场地位?

刁架构

极客大学架构师训练营

程序员的晚餐 | 5 月 30 日 入梅天,来一盆小龙虾

清远

美食

云上基础产品之虚拟私有云

韩超

公有云 VPC 虚拟私有云

【摘】Git-从零单排 02期

卡尔

git 原理 开发工具 工具链

用大数据分析了一线城市1000多份岗位招聘需求,告诉你如何科学找工作

程序员柠檬

Python 数据分析

RocketMQ - 如何实现事务消息

Java收录阁

RocketMQ

除了直接看余额,谁更有钱还能怎么比(二)

石君

去中心 零知识证明

Go: 使用GODEBUG改善Goroutine的使用

陈思敏捷

debug 协程 Go 语言

Python 进阶与核心技术 dict & set

Bonaparte

Python 极客时间

云上基础产品之内容分发网络

韩超

CDN 公有云 内容分发网络

Prometheus 2.18.0 新特性

耳东@Erdong

Prometheus

ARTS|Week 01 (2020第22周)

MiracleWong

算法 写作 ARTS 打卡计划

一款霸榜 GitHub 的开源 Linux 资源监视器!

JackTian

GitHub Linux 开源 bashtop 资源监视器

浅说Docker基础知识与核心原理

岿然独存5

Docker 软件 Go 语言

程序猿邂逅相亲妹,默默无语两行泪

码农神说

程序员 相亲

Linux命令-df

一周思进

云上基础产品之对象存储

韩超

对象存储 公有云 S3

ARTS Week2

丽子

带你学够浪:Go语言基础系列-环境配置和 Hello world

程序员柠檬

后台开发 Go 语言

云上基础产品之负载均衡

韩超

负载均衡 公有云

你想活出怎样的人生

Janenesome

读书笔记 思考

N皇后问题

孙苏勇

算法 DFS 深度优先搜索

架构之路

强哥

极客大学架构师训练营

关于 Windows 10 2020 年 5 月更新

FeiLong

工作那么久,你还具备学习能力么?

punkboy

学习 程序员

直面一个复杂世界

史方远

读书笔记 个人成长 随笔杂谈

戒掉手机吧

鼎玉谷

人生 手机 时间 浪费 控制

带你学够浪:Go语言基础系列 - 8分钟学基础语法

程序员柠檬

程序员 后台开发 Go 语言

使用Freya构建F# Web服务器_.NET_Pierre-Luc Maheu_InfoQ精选文章