写点什么

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

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

关注

评论

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

游戏夜读 | 联网才能玩的单机

game1night

ROS与OpenAI结合使用教程(概览)

辣么大

一个 UED 团队的自我修养

oldj

团队管理 UED

来了来了,2020 首场 Meetup ,可!

Apache Flink

大数据 flink 流计算 实时计算

数据挖掘|cross_val_score交叉验证使用

黄大路

Python 数据挖掘 学习 数据分析

面试官浅析程序员面试过程中的二三事

joe

互联网 个人成长 方法 职场 文化

回"疫"录(11):别让善良寒了心

小天同学

疫情 回忆录 现实纪录 纪实

直播电商行业一些看法

黄大路

互联网 商业 商业模式 商业价值 行业资讯

腊鸡与猴儿

黄大路

人生 小说

Java 环境配置与编辑器使用

旭霁

Java IDEA

高仿瑞幸小程序 04 小程序的全局数据

曾伟@喵先森

小程序 微信小程序 大前端

产品经理中必会SQL技能,相关内容研发可不予支持

韩超

MySQL sql 产品经理

真实 Java 笔试题

旭霁

面试

DevOps怎样影响开发运维人员

脚动两轮男之漂流小王子

DevOps

Java并发编程--ReentrantLock

Java收录阁

并发编程

以不变应万变——复杂系统回归测试新思路

刘华Kenneth

DevOps 敏捷 测试 单体系统 复杂

读 Go Scheduler 有感:给产品经理的建议

Ya

程序员 产品经理 操作系统 OS Scheduler

关于查尔斯-斯特里克兰

黄大路

提升认知 小说 个人提升 认识自己

向上管理第一项:路径P背后的目标B

kimmking

管理

如何快速对应用系统做一个360度画像诊断?

姜戈

Java 运维 多线程 网络 内存

Redis 命令执行过程(上)

程序员历小冰

redis 源码分析

Scrum精髓 - Scrum的核心到底是什么

Bob Jiang

Scrum 敏捷 Scrum精髓 敏捷精髓

程序员的晚餐 | 5月9日 炖蹄髈

清远

程序员

拜托,别再问我Zookeeper如何实现分布式锁了!

不才陈某

zookeeper 分布式 后端 分布式锁

理解雾计算(Fog Computing)与边缘计算(Edge Computing)

老任物联网杂谈

雾计算 Fog Computing 边缘计算 Edge Computing

数据库连接池的大小

Java收录阁

数据库

关于职能型团队管理一些总结

黄大路

项目管理 管理

Elasticsearch原理讲透了!

Geek_0o5u34

lucene elasticsearch 倒排索引 分布式搜索引擎 数据的分片和备份

做程序员有未来吗

山楂大卷

程序员 个人成长 职业规划 技术人

如何打造个人品牌?

石云升

个人 品牌

使用人工智能技术改进面试机器人

陆道峰

人工智能 学习 聊天机器人

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