写点什么

使用 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:001402
用户头像

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

关注

评论

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

18 应用服务器集群的伸缩性设计

爱好编程进阶

Java 程序员 后端开发

2020年最全Java面试汇总整理(含答案)

爱好编程进阶

Java 程序员 后端开发

2020,微服务降温了?

爱好编程进阶

Java 程序员 后端开发

千万级学生管理系统考试存储系统方案

踩着太阳看日出

架构训练营

倒计时0日!Apache DolphineScheduler4月 Meetup 大佬手把手教你大数据开发,离线调度

白鲸开源

【ELT.ZIP】OpenHarmony啃论文俱乐部——点燃主缓存压缩技术火花

ELT.ZIP

gpu OpenHarmony ELT.ZIP 主缓存

天下谁人不识君:当IPv6+成为千行百业的朋友

脑极体

[Day30]-[二叉树]第二小的值

方勇(gopher)

LeetCode 数据结构和算法

Fedora 上如何安装 gitea

HoneyMoose

20多年的岁月里一路走来满是辜负与遗憾,从双非到阿里SP,收到offer的那天我哭惨了

爱好编程进阶

Java 程序员 后端开发

模块四:作业

本人法海

「架构实战营」

15-spring整合mybatis方式一

爱好编程进阶

Java 程序员 后端开发

5 年 Java 经验,字节、美团

爱好编程进阶

Java 程序员 后端开发

@Autowire和@Resource注解使用的正确姿势

爱好编程进阶

Java 程序员 后端开发

未来计算图鉴:十年后的计算长什么模样?

脑极体

[Day31-01]-[二叉树]二叉树的直径

方勇(gopher)

LeetCode 数据结构和算法

9000字通俗易懂的讲解下Java注解,你还看不明白?

爱好编程进阶

Java 程序员 后端开发

2021年最新调查:86% 的 Java 开发人员 依赖 Spring 框架

爱好编程进阶

Java 程序员 后端开发

3 面蚂蚁,一路过关斩将 成功拿到 offer 定级 P6,大厂面试雀食有点难

爱好编程进阶

Java 程序员 后端开发

3分钟带你彻底搞懂 Kafka

爱好编程进阶

程序员 后端开发

Apache负载均衡与Tomcat集群配置学习(Windows环境)

爱好编程进阶

Java 程序员 后端开发

ffmpeg命令参数类型

Loken

Postman 如何删除一个工作空间

HoneyMoose

[Day31-02]-[二叉树]二叉搜索树节点最小距离

方勇(gopher)

LeetCode 数据结构和算法

一个普通App变成Launcher的故事

Changing Lin

android Launcher

Centos7安装JDK和Tomcat详细步骤

爱好编程进阶

Java 程序员 后端开发

9 个 Java 性能调优技巧,YYDS!

爱好编程进阶

Java 程序员 后端开发

Activiti6

爱好编程进阶

Java 程序员 后端开发

Go 语言入门很简单:Go 计时器

宇宙之一粟

Go 语言 计时器 4月月更

01-回顾多线程

爱好编程进阶

Java 程序员 后端开发

2021阿里总监最新整理:初级-中级-高级大厂面试真题(附答案解析

爱好编程进阶

Java 程序员 后端开发

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